2
对MPI_Barrier的调用是否会影响MPI进程中的每个线程,或者只影响调用该线程的线程 ? 有关您的信息,我的MPI应用程序将使用MPI_THREAD_MULTIPLE运行。对MPI_Barrier的调用是否会影响MPI进程中的每个线程?
谢谢。
对MPI_Barrier的调用是否会影响MPI进程中的每个线程,或者只影响调用该线程的线程 ? 有关您的信息,我的MPI应用程序将使用MPI_THREAD_MULTIPLE运行。对MPI_Barrier的调用是否会影响MPI进程中的每个线程?
谢谢。
想到这一点的方法是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
+1一个很好的例子。对Barrier的调用只会阻塞调用它的线程,并不是所有的线程都需要调用Barrier来让进程完成调用。 – suszterpatt 2011-03-29 17:00:53
@乔纳森,谢谢你的回答! – 2011-03-29 22:30:55
任何想法,为什么在我的情况下,这个程序永远不会停止? ('done'变量在''while(!done)'部分永远不会被读为1,我已经在那里添加了'#pragma omp flush(done)',但它并没有帮助我的编译器gcc 6.3.0/Mac OS。 – Krzysztof 2017-02-08 09:22:54