首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MPI_BARRIER不工作

MPI_BARRIER不工作
EN

Stack Overflow用户
提问于 2011-02-04 20:40:38
回答 1查看 2.4K关注 0票数 0

为什么这里的屏障不起作用?如果我使用它,程序会被阻塞,否则我会以一种奇怪的顺序得到输出:

代码语言:javascript
复制
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

代码:

代码语言:javascript
复制
#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();

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-04 20:44:01

MPI_Barrier是一个集体通信调用:它将阻塞,直到通信器中的所有进程在调用它的参数中提供为止。因为你的工作进程从不调用MPI_Barrier,所以主进程会无限期地阻塞。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4898075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档