MPI实现验证

时间:2014-08-30 15:58:46

标签: c++ mpi

我正在尝试使用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;
}

我正在尝试使用集体命令将从属数据发送到主服务器。

这项实施是否切合实际?

1 个答案:

答案 0 :(得分:0)

你提出的建议听起来很合理。另一种方法是让从属设备一次性地将它们的结果广播(MPI_AllGather),然后你可以直接在每个从设备中实现评分和下一步的算法。如果评分算法不是太复杂,那么在每个从站运行它的开销在速度方面是值得的,因为从站根本不需要与主站通信,在每次迭代时节省一次通信。