首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C语言中的MPI_Barrier

C语言中的MPI_Barrier
EN

Stack Overflow用户
提问于 2013-12-31 01:21:55
回答 1查看 1.7K关注 0票数 0

我正在尝试使用MPI实现一个程序,为此,我需要有一个在特定处理器上执行的代码块,在执行完成之前,其他处理器必须等待。我认为可以使用MPI_Barrier (尽管我不清楚其实际功能)来实现,并尝试了以下程序。

代码语言:javascript
复制
#include<mpi.h>
#include<stdio.h>
int main(int argc, char **argv) {
    int rank=0,size;
    MPI_Init(&argc,&argv);
    MPI_Comm_rank(MPI_COMM_WORLD,&rank);
    MPI_Comm_size(MPI_COMM_WORLD,&size);
    if(rank == 0){                             //Block 1
        printf("\nRank 0 Before Barrier");
    }
        MPI_Barrier(MPI_COMM_WORLD);
    if(rank==1){
        printf("\nRank 1 After Barrier");
        printf("\nRank 1 After Barrier");
    }
    if(rank==2){
        printf("\nRank 2 After Barrier");
    }
    MPI_Finalize();
}

当我将np作为3执行时,我得到了以下输出

代码语言:javascript
复制
Rank 1 After Barrier

Rank 0 Before BarrierRank 2 After BarrierRank 1 After Barrier

我怎么可能让其他处理器等待,直到Block 1在Rank为0的处理器中完成执行?

预期输出

代码语言:javascript
复制
Rank 0 Before Barrier
Rank 1 After Barrier //After this, it might be interchanged
Rank 1 After Barrier
Rank 2 After Barrier
EN

回答 1

Stack Overflow用户

发布于 2013-12-31 05:51:05

除了eduffy在评论中指出的并发编写stdout的问题外,你所使用的障碍只是你需要做的一部分,以确保排序。一旦所有3个或更多的等级都通过了你插入的一个障碍,等级1和2的所有可能的交错都是允许的:

代码语言:javascript
复制
Rank 1 After Barrier
Rank 1 After Barrier
Rank 2 After Barrier

或者:

代码语言:javascript
复制
Rank 1 After Barrier
Rank 2 After Barrier
Rank 1 After Barrier

或者:

代码语言:javascript
复制
Rank 2 After Barrier
Rank 1 After Barrier
Rank 1 After Barrier

你需要在等级1和等级2之间进行某种形式的同步,以确保等级1在等级2继续之前完成它的第一个printf。这可能是另一个障碍,在一个较小的通信器上,如果你不想强迫其他级别等待,一个只包含级别1和2的障碍,一个带有虚拟数据或类似的阻塞MPI_Ssend/MPI_Recv对。

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

https://stackoverflow.com/questions/20844327

复制
相关文章

相似问题

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