MPI减少优化

时间:2014-02-26 14:37:30

标签: mpi

我有一个相当简单的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)少。{1}}。这意味着某些节点的工作量会比其他节点大得多。

无论如何要更好地平衡这一点,或者做一些事情以便节点在完成后可以从其他节点窃取工作?

1 个答案:

答案 0 :(得分:1)

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

但是,我提出的一个建议是将昂贵的电话与getResult()拨打更便宜的电话。

示例:将getResult(lower)getResult(upper)&amp; 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) ;
}