MPI实现进行验证

MPI implementation to verify

本文关键字:验证 实现 MPI      更新时间:2023-10-16

我正在尝试使用MPI_Gather从slave恢复数据。所以基本上,模拟在每个从机上运行(每个从机的wich不相同),我想在主机上恢复一个整数(模拟的结果)。根据每个整数,我在主节点上计算一个新值"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;
}

我正试图用一个集体命令将从数据发送到主数据。

这种实施是否现实?

你的建议听起来很合理。另一种方法是让所有从属服务器一次性向彼此广播结果(MPI_AllGather),然后您可以在每个从属服务器中直接实现评分和下一步尝试什么算法。如果评分算法不太复杂,那么在每个从机中运行它的开销在速度方面是值得的,因为从机根本不必与主机通信,每次迭代只节省一次通信。