调用MPI_Barrier会影响MPI进程中的每个线程吗?

时间:2011-03-29 13:40:37

标签: multithreading synchronization mpi

对MPI_Barrier的调用是否会影响MPI进程中的每个线程或仅影响线程 打电话?    为了您的信息,我的MPI应用程序将使用MPI_THREAD_MULTIPLE运行。

感谢。

1 个答案:

答案 0 :(得分:4)

考虑到这一点的方法是MPI_Barrier(和其他集合体)阻止函数调用,它阻塞直到通信器中的所有进程都完成了该函数。我认为,这使得弄清楚会发生什么变得容易一些;功能块,但其他线程继续畅通无阻。

所以考虑下面的代码块(刷新在线程之间进行通信的共享“done”标志不是你应该如何进行线程通信,所以请不要将它作为模板用于任何事情):

#include <mpi.h>
#include <omp.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char**argv) {
    int ierr, size, rank;
    int provided;
    volatile int done=0;
    MPI_Comm comm;

    ierr = MPI_Init_thread(&argc, &argv, MPI_THREAD_MULTIPLE, &provided);
    if (provided == MPI_THREAD_SINGLE) {
        fprintf(stderr,"Could not initialize with thread support\n");
        MPI_Abort(MPI_COMM_WORLD,1);
    }

    comm = MPI_COMM_WORLD;
    ierr = MPI_Comm_size(comm, &size);
    ierr = MPI_Comm_rank(comm, &rank);

    if (rank == 1) sleep(10);

    #pragma omp parallel num_threads(2) default(none) shared(rank,comm,done)
    {
        #pragma omp single
        {
        /* spawn off one thread to do the barrier,... */
        #pragma omp task 
        {
            MPI_Barrier(comm);
            printf("%d -- thread done Barrier\n", rank);
            done = 1;
            #pragma omp flush
        }

        /* and another to do some printing while we're waiting */
        #pragma omp task
        {
            while(!done) {
                printf("%d -- thread waiting\n", rank);
                sleep(1);
            }
        }
        }
    }
    MPI_Finalize();

    return 0;
}

等级1睡眠10分钟,并且所有等级在一个线程中开始屏障。如果你用mpirun -np 2运行它,你会期望0级线程中的第一个线程触及屏障,而另一个线程围绕打印和等待 - 当然,这就是:

$ mpirun -np 2 ./threadbarrier
0 -- thread waiting
0 -- thread waiting
0 -- thread waiting
0 -- thread waiting
0 -- thread waiting
0 -- thread waiting
0 -- thread waiting
0 -- thread waiting
0 -- thread waiting
0 -- thread waiting
1 -- thread waiting
0 -- thread done Barrier
1 -- thread done Barrier