我正在尝试与MPI并行化一个“搜索问题”,在该过程中您要遍历多个元素,并检查它们是否验证了某个属性,如果有的话(其中几个可以验证该属性,但您只需要一个)您将其退回并完成。 在对代码进行Parallellize时,我在进程之间拆分了元素,但是,当一个元素找到一个元素时,我希望其他进程停止搜索,所以不会浪费时间。
我已经尝试过使用MPI_ISend和MPI_IRecv,因此每个进程都会在搜索元素时进行定期检查,如果另一个进程发送了一条消息告诉他们已经找到一个消息,并且如果收到消息,则退出循环。
int search(...) {
int meh,out = 0;
MPI_Request req;
MPI_Irecv(&meh, 1, MPI_INT, MPI_ANY_SOURCE,0, MPI_COMM_WORLD, &req);
for(int i = 0 ; i < max_tries && out == 0; i++){
test element
if (found) return found;
MPI_Test(&req,&fuera,MPI_IGNORE_STATUS);
}
return -1;
}
int main() {
MPI_Init(NULL, NULL);
int world_size;
MPI_Comm_size(MPI_COMM_WORLD, &world_size);
int world_rank;
MPI_Comm_rank(MPI_COMM_WORLD, &world_rank);
int result = search(...)
if(result != -1) {
for (int i = 0; i < world_size; i++) {
MPI_Request req;
int ok = 51914
if (i != world_rank) {
MPI_Isend(&ok,1,MPI_INT,i,0,MPI_COMM_WORLD,&req);
MPI_Request_free(req);
}
}
cout << result << endl;
}
MPI_Finalize();
return 0;
}
似乎可以正常工作,但是,在(很少但可能)的情况下,两个进程“同时”找到一个元素,两个进程都到达消息发送部分,发送“有人找到了它!”。消息两次,打印其发现的elemend,然后在所有之前而不是之前,该程序因MPI错误而崩溃,表明存在分段错误。 它可以工作,但我得到结果,但是很丑陋,而且,仅为自己编写丑陋的代码,而不能证明我只是使用MPI_Abort。
感谢您的帮助。