c - 父节点在 MPI_Barrier 上停止

标签 c mpi

我是 MPI 新手,在运行雪豹的 Mac OS X 节点集群上实现 mpirun 时遇到一些问题。我遇到的问题涉及 MPI_Barrier()。我有一个简单的函数,如下所示,运行良好。但是,当我在条件末尾添加 MPI_Barrier() 命令时,父节点会停止。其中一个处理器越过了屏障命令,而另一个处理器则保持卡住状态。我希望有人能给我一个快速的解决方法,或者建议一些我的网络环境阻止命令正常运行的方法。

int main (int argc, char **argv)
{
    int me, np, q, sendto;
    double t0, t1;
    MPI_Status status;
    MPI_Init(&argc, &argv);
    t0 = MPI_Wtime();
    MPI_Comm_size(MPI_COMM_WORLD,&np);
    MPI_Commm_rank(MPI_COMM_WORLD,&me);
    if (np%2 == 1) return 0;
    if (me%2 == 1) {sendto = me - 1;}
    else {sendto = me + 1;}
    if (me%2 == 0) {
        MPI_Send(&me, 1, MPI_INT, sendto, me, MPI_COMM_WORLD);
        MPIRecv(&q, 1, MPI_INT, sendto, sendto, MPI_COMM_WORLD, &status);
    } else {
        MPI_Recv(&q, 1, MPI_INT, sendto, sendto, MPI_COMM_WORLD,&status);
        MPI_Send(&me,1,MPI_INT,sendto,me,MPI_COMM_WORLD);
    }
    printf("Send %d to proc %d, received %d from proc %d\n",me,sendto,q,sendto);
    t1 = MPI_Wtime();
    printf("Timing is %g",t1-10);
    MPI_Finalize();
    return 0;
}

最佳答案

除了修复一些拼写错误之外,我还可以让您的代码正常运行。我在 IBM 集群上使用 openmpi 和 gnu c 编译器。我不确定你把屏障放在哪里。我猜对了吗?

#include "mpi.h"
#include "stdio.h"

int main (int argc, char **argv)
{
int me, np, q, sendto;
double t0, t1;
MPI_Status status;
MPI_Init(&argc, &argv);
t0 = MPI_Wtime();
MPI_Comm_size(MPI_COMM_WORLD,&np);
MPI_Comm_rank(MPI_COMM_WORLD,&me);
if (np%2 == 1) {
  MPI_Finalize();
  return 0;
}
if (me%2 == 1) {sendto = me - 1;}
else {sendto = me + 1;}
if (me%2 == 0) {
  MPI_Send(&me, 1, MPI_INT, sendto, me, MPI_COMM_WORLD);
  MPI_Recv(&q, 1, MPI_INT, sendto, sendto, MPI_COMM_WORLD, &status);
} else {
  MPI_Recv(&q, 1, MPI_INT, sendto, sendto, MPI_COMM_WORLD,&status);
  MPI_Send(&me,1,MPI_INT,sendto,me,MPI_COMM_WORLD);
}
MPI_Barrier(MPI_COMM_WORLD);
printf("Send %d to proc %d, received %d from proc %d\n",
   me,sendto,q,sendto);
t1 = MPI_Wtime();
printf("Timing is %g\n",t1-t0);
MPI_Finalize();
return 0;
}

关于c - 父节点在 MPI_Barrier 上停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6917176/

相关文章:

c++ - 是否有针对 CUDA-GPU 或 MPI-CPU+CUDA-GPU 的基准测试?

c - 逐行读取文件,将整数存储在数组中

c++ - 如何在 MPI 中传递 std::unique_ptr?

C和MPI : function works differently with same data

mpi - 我可以从执行的程序中获取 mpiexec 命令行参数吗?

c - MPI_Send/MPI_Recv : count of elements or buffer size?

c - GCC 生成的程序集等同于 C 中的 continue 语句

c - 二维数组 : Why ptr and *ptr are same when i declared ptr as int ptr[4][4];?

c - 如何获取我的代码的结束地址

c - 在 C 中的函数内定义函数