我有一个相当简单的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}}。这意味着某些节点的工作量会比其他节点大得多。
无论如何要更好地平衡这一点,或者做一些事情以便节点在完成后可以从其他节点窃取工作?
答案 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) ;
}