我正在尝试使用MPI_Gather从slave恢复数据。基本上,每个从站都运行一个模拟(每个从站都不一样),我想在主站上恢复一个整数(模拟结果)。从每个整数,我计算主设备上的一个新值'a',我发送回从设备以使用这个更好的参数重做一个新的模拟。 我希望很清楚,我对MPI很新。
注意:某些模拟不会同时完成。
int main
while(true){
if (rank==0) runMaster();
else runSlave();
}
runMaster()
receive data b of all slave (with MPI_gather)
calculate parameter a for each slave; aTotal=[a_1,...,a_n]
MPI_Scatter(aTotal, to slave)
runSlave()
a=aTotal[rank]
simulationRun(a){return b}
MPI_Gather(&b, to master)
为避免死锁,每个从站都使用随机a进行初始化。
创建了一个小测试用例,因为我看不到如何在我的奴隶中使用MPI_Gather:
int main (int argc, char *argv[]) {
int size;
int rank;
int a[12];
int i;
int start,end;
int b;
MPI_Init(&argc, &argv);
MPI_Status status;
MPI_Request req;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
MPI_Comm_size(MPI_COMM_WORLD, &size);
int* bb= new int[size];
int source;
//master
if(!rank){
while(true){
b=12;
MPI_Recv(&bb[0], 1, MPI_INT, MPI_ANY_SOURCE, 0, MPI_COMM_WORLD, &status);
source = status.MPI_SOURCE;
printf("master receive b %d from source %d \n", bb[0], source);
if (source == 1) goto finish;
}
}
//slave
if(rank){·
b=13;·
if (rank==1) {b=15; sleep(2);}
int source = rank;
printf("slave %d will send b %d \n", source, b);
// MPI_Gather(&b,1,MPI_INT,bb,1,MPI_INT,0,MPI_COMM_WORLD); // unworking, not called by master
MPI_Send(&b, 1, MPI_INT, 0, 0, MPI_COMM_WORLD);
}
finish:
MPI_Finalize();
return 0;
}
我正在尝试使用集体命令将从属数据发送到主服务器。
这项实施是否切合实际?
答案 0 :(得分:0)
你提出的建议听起来很合理。另一种方法是让从属设备一次性地将它们的结果广播(MPI_AllGather),然后你可以直接在每个从设备中实现评分和下一步的算法。如果评分算法不是太复杂,那么在每个从站运行它的开销在速度方面是值得的,因为从站根本不需要与主站通信,在每次迭代时节省一次通信。