【发布时间】: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