【问题标题】:MPI reduce optimisationMPI减少优化
【发布时间】:2014-02-26 14:37:30
【问题描述】:

我有一个相当简单的 MPI 程序,其中每个节点都进行计算,最后我需要所有计算的总和。除了每个节点计算的最终总和之外,每个节点都不需要传达任何其他信息。

目前这是我正在做的事情,并且正在发挥作用。

MPI_Init(&argc, &argv);               // start up "virtual machine"
MPI_Comm_size(MPI_COMM_WORLD, &p);    // get size of VM
MPI_Comm_rank(MPI_COMM_WORLD, &id);   // get own rank in VM

int localsum[1] = {0};
int globalsum[1] = {0};


for (i = lower+id; i <= upper; i=i+p) {
    localsum[0] = localsum[0] + getResult(i);
}

MPI_Reduce(localsum,globalsum,1,MPI_INT,MPI_SUM,0,MPI_COMM_WORLD);

if(id==0)
{
    printf("globalsum1 = %d \n",globalsum[0]);
}

所以每个节点在每次循环迭代中都会跳过每个size-of-vm 元素。然而问题就在这里。在任何时候,getResult(i) 的计算时间都比 getResult(i+1) 少。这意味着某些节点的工作量将比其他节点大得多。

有没有办法进一步平衡这一点,或者做点什么让节点在完成后可以从其他节点窃取工作?

【问题讨论】:

  • 如果没有看到(或至少不知道)getresult() 中发生了什么,这是一个很难回答的问题。你能告诉我们更多关于它的信息吗,或者如果它足够短,请提供代码。
  • 整个程序都在做欧拉总和。因此 getResult(i) 将所有正 x 的 i,x 的相对素数相加,其中 x

标签: mpi


【解决方案1】:

正如 Wesley Bland 在 cmets 中指出的那样,这是一个很难回答的问题,但不知道 getResults() 做了什么以及我们正在谈论多少时间额外工作。

但是,我的一个建议是将昂贵的电话与getResult() 配对。

示例:将getResult(lower)getResult(upper)getResult(lower+1)getResult(upper-1) 配对

示例循环(需要一些修改来修复一些边缘情况):

for (i = id; i <= (upper-lower)/2; i=i+p) {
    localsum[0] = localsum[0] + getResult(lower+i) + getResult(upper-i) ;
}

【讨论】:

  • 您好,谢谢您的回答。这确实是一个好主意,将看看它。尽管我希望 MPI 中有一个内置函数来设置 x 任务,并且这些进程可以根据需要或类似的方式获取任务。 (知道在 OpenMP 中使用动态或引导调度是可能的)。我在原始问题中添加了一条关于 getResult 正在做什么的评论。
  • 不幸的是,这并不是 MPI 运行的真正模型。还有其他具有任务模型的编程库/语言,其中一些甚至构建在 MPI 之上,但 MPI 本身没有。
  • 无论如何都要计算完美分割?对于下面循环中的任何给定 i,我们将 i-1 调用称为 hcf(最高公因数)。所以 i=5 会进行 4 次 hcf 调用,6 会进行 5 次等等。
  • 还有一点注意事项。由于某种原因,建议的配对并没有真正优化运行时。
猜你喜欢
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-26
  • 2014-09-03
  • 2017-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多