首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPI_Comm_split与MPI_Send / MPI_Recv的关系

MPI_Comm_split与MPI_Send / MPI_Recv的关系
EN

Stack Overflow用户
提问于 2017-12-15 00:20:36
回答 1查看 143关注 0票数 1

假设有3个进程,这段代码运行良好:

代码语言:javascript
复制
#include <iostream>
#include <mpi.h>
using namespace std;

int main(){

    MPI_Init(NULL, NULL);

    int rank; MPI_Comm SubWorld; int buf;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    if (rank == 0){
        MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld);
        MPI_Send(&buf, 1, MPI_INT, 1, 55, MPI_COMM_WORLD);
    }
    else if (rank == 1){
        MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld);
        MPI_Recv(&buf, 1, MPI_INT, 0, 55, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
    }
    else MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld);

    cout << "Done" << endl;

    MPI_Finalize();

    return 0;
}

产出“完成”了预期的三倍。

但是这个代码有一个问题(也有3个进程):

代码语言:javascript
复制
#include <iostream>
#include <mpi.h>
using namespace std;

int main(){

    MPI_Init(NULL, NULL);

    int rank; MPI_Comm SubWorld; int buf;
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);

    if (rank == 0){
        MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld);
        MPI_Send(&buf, 1, MPI_INT, 1, 55, MPI_COMM_WORLD);
    }
    else if (rank == 1){
        MPI_Recv(&buf, 1, MPI_INT, 0, 55, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
        MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld);
    }
    else MPI_Comm_split(MPI_COMM_WORLD, rank, rank, &SubWorld);

    cout << "Done" << endl;

    MPI_Finalize();

    return 0;
}

没有输出!!

造成这一问题的MPI_Comm_split与MPI_Send / MPI_Recv之间究竟是什么关系?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-15 00:31:42

MPI_Comm_split()是一个集体操作,这意味着来自初始通信器的所有MPI任务(例如,这里的MPI_COMM_WORLD )必须同时调用它。

在您的示例中,秩1挂起MPI_Recv(),因此秩0上的MPI_Comm_split()无法完成(并且MPI_Send()从未被调用),因此出现死锁。

您可能会考虑使用padb来可视化MPI程序的状态,这样就可以很容易地查看堆栈的位置。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47824107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档