使用MPI分配不均衡的工作负载

时间:2016-08-21 14:42:29

标签: fortran mpi distributed-computing

我有一个数组

A(1:n_max)

我想用MPI分散以评估一些f(A(j))。然而,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,66,67,        68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,        85,86,87,88,89,90,91,92,93,94,95,96,97,98])

  3. 进入

    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. 我希望你的一些想法
    2. 你推荐什么?

1 个答案:

答案 0 :(得分:1)

如果执行顺序很重要(例如缓存),您可以将数组拆分为不同大小但几乎相等工作负载的连续组,并使用MPI_SCATTERV进行分发。 如果数组的末端很重(在工作负载的情况下),您也可以拆分数组并使用相同的方法两次。

如果执行顺序不重要且您重新排序并不需要花费太多时间,我宁愿采用第二种方法。

如果你总是有这样的数组,你应该考虑第一个解决方案,但只发送间隔限制而不是间隔内的所有数字。如果您在通信中受带宽限制,这一点尤为重要。