如何使一个进程终止其他进程?

时间:2019-06-10 21:10:54

标签: c++ mpi

我正在尝试与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。

感谢您的帮助。

0 个答案:

没有答案