2016-08-21 46 views
0

不均匀的工作量我有一个数组分发使用MPI

A(1:n_max) 

,我想,以评估一些F(A(j)段)与MPI散射。然而,f(A(1))的评估耗时0.35s,f(A(n_max))的评估耗时15s。我对如何解决它有不同的想法,但我不确定哪一个是最好的:

  1. 一些主/从工作负荷分配。

    沿此线:http://www.hpc.cam.ac.uk/using-clusters/compiling-and-development/parallel-programming-mpi-example

  2. 我重新排列A和重塑(移调(整形(A)),这将转

    阵列([0,1,2,3,4, 5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29 ,30,31,32,33, 34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50, 51,52,53 ,54,55,56,57,58,59,60,61,62,63,64,65, 78,79,80,81,82,83,84, 85,86,87,88,89,90,91,92,93,94,95,96,97,98])

array([[ 0, 33, 66, 1, 34, 67, 2, 35, 68, 3, 36, 69, 4, 37, 70, 5, 38, 
     71, 6, 39, 72, 7, 40, 73, 8, 41, 74, 9, 42, 75, 10, 43, 76, 11, 
     44, 77, 12, 45, 78, 13, 46, 79, 14, 47, 80, 15, 48, 81, 16, 49, 82, 
     17, 50, 83, 18, 51, 84, 19, 52, 85, 20, 53, 86, 21, 54, 87, 22, 55, 
     88, 23, 56, 89, 24, 57, 90, 25, 58, 91, 26, 59, 92, 27, 60, 93, 28, 
     61, 94, 29, 62, 95, 30, 63, 96, 31, 64, 97, 32, 65, 98]]) 

然后我可以分发使用分散和聚集。问题是,一个进程将不得不运行f(A(0)),f(A(33))和f(A(66)),而另一个运行f(A(32)),f A(65))和f(A(98))。

不幸的是,运行时间在上升单调,但不是线性。

  • 我希望一些自己的想法
  • 的你有什么建议?

    回答

    1

    如果执行的顺序是重要的(例如高速缓存),你可以在不同大小的连续的组,但几乎相等的工作负载阵列分割,并将它们与MPI_SCATTERV分发。 如果数组末尾很重(在工作负载的情况下),也可以拆分数组并使用相同的方法两次。

    如果执行的顺序并不重要,你必须重新排序并没有采取太多的时间,我宁愿你的第二个方法。

    如果你总是这样一个数组,你应该想想第一个解决方案,但仅发送间隔的限制,而不是时间间隔内的所有数字。如果您在通信中使用带宽限制,这尤其有意义。