multithreading - 对 MPI_Barrier 的调用是否会影响 MPI 进程中的每个线程?

标签 multithreading synchronization mpi

对 MPI_Barrier 的调用会影响 MPI 进程中的每个线程还是只影响线程 打电话吗? 供您引用,我的 MPI 应用程序将使用 MPI_THREAD_MULTIPLE 运行。

谢谢。

最佳答案

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

因此请考虑以下代码块(共享的 done 标志被刷新以在线程之间进行通信不是您应该如何进行线程通信,因此请不要将其用作任何模板. 此外,使用对 done 的引用将解决 this bug/optimization ,请参阅评论 2 的末尾):

#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
        {
            int *p = &done;
            while(!(*p) {
                printf("%d -- thread waiting\n", rank);
                sleep(1);
            }
        }
        }
    }
    MPI_Finalize();

    return 0;
}

Rank 1 休眠 10 秒,所有 Rank 在一个线程中启动屏障。如果您使用 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

关于multithreading - 对 MPI_Barrier 的调用是否会影响 MPI 进程中的每个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5473482/

相关文章:

java线程间共享数据

python子进程隐藏stdout并等待它完成

c++ - MPI_Neighbor_alltoallw() 中发送和接收的正确顺序是什么?

java - Netty客户端同步请求响应

php - 让 AJAX 调用等待 php 中的事件

c - 我的 MPI 雅可比迭代程序给出了错误的结果

mpi - 如何在多个节点中运行 MPI-Job? (多节点 MPI 作业执行)

java - 线程中出现异常 "JavaFX Application Thread"java.lang.OutOfMemoryError : Java heap space

linux - pthread.h - 自愿 CPU 让出是调度另一个用户级线程的唯一触发器吗?

java - publishOn 和并行的区别