2011-03-29 64 views

回答

4

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

因此考虑下面的代码块(共享“完成”标志被刷新线程间的通信是不是你应该做的线程的通信,所以请不要以此作为任何一个模板):

#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 
+0

+1一个很好的例子。对Barrier的调用只会阻塞调用它的线程,并不是所有的线程都需要调用Barrier来让进程完成调用。 – suszterpatt 2011-03-29 17:00:53

+0

@乔纳森,谢谢你的回答! – 2011-03-29 22:30:55

+0

任何想法,为什么在我的情况下,这个程序永远不会停止? ('done'变量在''while(!done)'部分永远不会被读为1,我已经在那里添加了'#pragma omp flush(done)',但它并没有帮助我的编译器gcc 6.3.0/Mac OS。 – Krzysztof 2017-02-08 09:22:54

相关问题