MPI - 在屏障后尝试打印广播变量,显示一些其他变量

时间:2015-11-08 02:14:05

标签: c parallel-processing mpi

我从MPI学习开始。我在MPI_Broadcast之后使用了MPI_Barrier,我在其中向所有进程广播变量。但是,当我打印广泛的变量时,它是来自内存的一些值,而不是来自广播。不确定我在哪里做错了。请提出任何建议。

void main(int argc, char *argv[]){
  int x, comm_sz, my_rank;

  MPI_Init(NULL,NULL);
  MPI_Comm_size(MPI_COMM_WORLD, &comm_sz);
  MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);

  if(my_rank == 0){     
    x = strtol(argv[1], NULL, 10);
    MPI_Bcast(&x, 1, MPI_INT, 0, MPI_COMM_WORLD);
}

MPI_Barrier(MPI_COMM_WORLD);

if(my_rank != 0){
    printf("x is %d\n", x);
}

  MPI_Finalize();   
}

我只想在将值广泛投放到所有进程后进行一些操作。

1 个答案:

答案 0 :(得分:2)

错误在于这个区域。

if(myRank == 0){      
    x = strtol(argv[1], NULL, 10);
    MPI_Bcast(&x, 1, MPI_INT, 0, MPI_COMM_WORLD);
}

MPI_Barrier(MPI_COMM_WORLD);

if(my_rank != 0){
    printf("x is %d\n", x);
}

MPI_Bcast 应该由所有进程运行,因为否则x的值永远不会填充在非root(rank == 0)进程上。

if(myRank == 0){      
    x = strtol(argv[1], NULL, 10);
}

MPI_Bcast(&x, 1, MPI_INT, 0, MPI_COMM_WORLD);

if(my_rank != 0){
    printf("x is %d\n", x);
}

由于 MPI_Bcast 正在屏蔽,因此对 MPI_Barrier 的调用变得不必要,因为在所述进程收到广播的 x

See for more details