MPI_BARRIER 不工作
Posted
技术标签:
【中文标题】MPI_BARRIER 不工作【英文标题】:MPI_BARRIER not working 【发布时间】:2011-06-21 08:23:10 【问题描述】:为什么这里的屏障不起作用?如果我使用它,程序会被阻塞,否则我会以奇怪的顺序得到输出:
Number of worker tasks = 4
sending 1-th element q=0.011000 to task 1
sending 2-th element q=0.012000 to task 2
received 1-th element q=0.011000 in task 1
processed 1-th element q=6.105000 in task 1
sending 3-th element q=0.013000 to task 3
received 2-th element q=0.012000 in task 2
processed 2-th element q=13.320000 in task 2
sending 4-th element q=0.014000 to task 4
received 3-th element q=0.013000 in task 3
processed 3-th element q=21.645000 in task 3
starting to get data in MASTER
MASTER received 0-th element q=6.105000 from task 1
MASTER received 0-th element q=13.320000 from task 2
received 4-th element q=0.014000 in task 4
processed 4-th element q=31.080000 in task 4
MASTER received 0-th element q=21.645000 from task 3
MASTER received 0-th element q=31.080000 from task 4
end
代码:
#include "mpi.h" /* required MPI library */
#include <stdio.h>
#include <math.h>
#define NRRR 16 /* number of rows in matrix A */
#define NLLL 16 /* number of columns in matrix A */
#define MASTER 0 /* taskid of first task */
#define FROM_MASTER 1 /* setting a message type */
#define FROM_WORKER 2 /* setting a message type */
int main(argc,argv)
int argc;
char *argv[];
int numtasks, /* number of tasks in partition */
taskid, /* a task identifier */
numworkers, /* number of worker tasks */
source, /* task id of message source */
dest, /* task id of message destination */
mtype,
i,j,
rc; /* message type */
double qr[NRRR],
ql[NLLL],
element_r[NRRR][3],
element_l[NLLL][3];
MPI_Status status;
rc = MPI_Init(&argc,&argv);
rc|= MPI_Comm_size(MPI_COMM_WORLD,&numtasks);
rc|= MPI_Comm_rank(MPI_COMM_WORLD,&taskid);
if (rc != 0)
printf ("error initializing MPI and obtaining task ID info\n");
numworkers = numtasks-1;
// MASTER
if (taskid == MASTER)
printf("\n\n\n\nNumber of worker tasks = %d\n",numworkers);
// init element_r and element_l
for(j=0;j<NRRR;j++)
element_r[j][0]=j;
element_r[j][1]=j+1;
element_r[j][2]=j+2;
qr[j] = j*1e-4+1e-3;
for(i=0;i<NLLL;i++)
element_l[i][0]=12000+i;
element_l[i][1]=12000+i+1;
element_l[i][2]=12000+i+2;
ql[i] = i*1e-3 +1e-2 ;
mtype = FROM_MASTER;
for (dest=1; dest<=numworkers; dest++)
printf(" sending %d-th element q=%f to task %d\n",dest,ql[dest],dest);
MPI_Send(&ql[dest], 1, MPI_DOUBLE, dest, mtype, MPI_COMM_WORLD);
mtype = FROM_WORKER;
printf(" starting to get data in MASTER\n");
for (i=1; i<=numworkers; i++)
source = i;
MPI_Recv(&ql[source], 1, MPI_DOUBLE, source, mtype, MPI_COMM_WORLD, &status);
MPI_Barrier(MPI_COMM_WORLD);
for (i=1; i<=numworkers; i++)
source = i;
printf(" MASTER received %d-th element q=%f from task %d\n",taskid,ql[source],source);
printf(" end\n");
// WORKER
if (taskid > MASTER)
mtype = FROM_MASTER;
MPI_Recv(&ql, 1, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD, &status);
printf(" received %d-th element q=%f in task %d\n",taskid,ql[0],taskid);
ql[0]=ql[0]*555*taskid;
printf(" processed %d-th element q=%f in task %d\n",taskid,ql[0],taskid);
mtype = FROM_WORKER;
MPI_Send(&ql, 1, MPI_DOUBLE, MASTER, mtype, MPI_COMM_WORLD);
MPI_Finalize();
【问题讨论】:
【参考方案1】:MPI_Barrier 是一个集体通信调用:它将阻塞,直到参数中提供的通信器中的所有进程都调用它。由于您的工作进程从不调用 MPI_Barrier,因此主进程会无限期阻塞。
【讨论】:
好的,然后我在woker任务的末尾添加了MPI_BARRIER,现在一切似乎都正常了。现在我想知道使用屏障时是否会受到性能损失 使用屏障时会有一些性能损失,但如果您需要同步进程以获得正确的行为,它们是必要的。优化并行算法的一个方面是设计您的代码,以便不需要同步。 @Werner:的确,Barrier 只会损害性能,而不会改善它。另一方面,它可以让你作为开发人员更方便。在其他时候,在其他进程完成某些任务之前,进程可能无法执行任何有意义的事情,因此屏障是必不可少的。您可以自行评估是否需要设置障碍,或者是否可以容忍性能损失。 你能看看这个问题***.com/questions/71247968/…谢谢。以上是关于MPI_BARRIER 不工作的主要内容,如果未能解决你的问题,请参考以下文章