c++ - MPI 代码在超过 2 个节点/进程的最终确定时挂起

标签 c++ mpi mpich

下面的代码假设要向每个节点发送一系列消息,并报告每次通信所花费的时间。目前它可以正常退出进程,但如果我运行超过 2 个进程,它会在最后一次交换时挂起。

我已经在以前的版本中放置了语句来检查它卡在哪里,我 90% 确定它是 MPI_FINALIZE 语句,但我不太明白为什么。有什么想法吗?

 #include <stdio.h>
 #include "/usr/include/mpich2/mpi.h"
 #define ping 101
 #define pong 101
 float buffer[100000];
int main (int argc, char *argv[]){
    int error, rank, size; //mpi holders
    int i, j, k; //loops
    extern float buffer[100000]; //message buffer
    int length; //loop again
    double start, final, time;
    extern float buffer[100000];


    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);
      if(rank!=0){
            MPI_Status status;
          for(i=1;i<size;i++){
           for(length=1;length<=30000;length+=1000){
            for(j=0;j<100;j++){
             MPI_Recv(buffer, length, MPI_FLOAT, 0, ping, MPI_COMM_WORLD, &status);
             MPI_Send(buffer, length, MPI_FLOAT, 0, pong, MPI_COMM_WORLD);
             }
            }
          }
         }
      if(rank==0){
         MPI_Status status;
         for(i=1;i<size;i++){
           for(length=1;length<=30000;length+=1000){
            start = MPI_Wtime();
            for(j=0;j<100;j++){
             MPI_Send(buffer, length, MPI_FLOAT, i, ping, MPI_COMM_WORLD);
             MPI_Recv(buffer, length, MPI_FLOAT, MPI_ANY_SOURCE, pong, MPI_COMM_WORLD, &status);
             }
            final = MPI_Wtime();
            time = final-start;
            printf("%s\t%d\t%f\n", "Node", i, time);
            }
         }
     }

  MPI_Finalize();
  return 0;
  }

最佳答案

你有一个非零等级的额外循环:

  if(rank!=0){
        MPI_Status status;
      for(i=1;i<size;i++){   <-----------
       for(length=1;length<=30000;length+=1000){
        for(j=0;j<100;j++){
         MPI_Recv(buffer, length, MPI_FLOAT, 0, ping, MPI_COMM_WORLD, &status);
         MPI_Send(buffer, length, MPI_FLOAT, 0, pong, MPI_COMM_WORLD);
         }
        }
      }                      <-----------
     }

对于 2 个等级,该循环执行单个迭代,但对于超过两个等级,它执行 size-1 迭代。由于等级 0 每个等级仅发送一次消息,因此您必须删除该循环。

关于c++ - MPI 代码在超过 2 个节点/进程的最终确定时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19472876/

相关文章:

c++ - 用c++读取二进制文件出错

c++ - 为什么在 STL 映射中用作值的类需要在...中有一个默认构造函数?

c - C MPI 中的结构散布数组

c - MPI 收集位移未按预期工作

c++ - 可以在 Internet 上而不是在 LAN 集群内分发 MPI (C++) 程序吗?

c++ - 为什么 Armadillo 的 SVD 结果与 NumPy 不同?

c++ - 如何将 void* 转换为 size_t?

c++ - MPI如何从从节点接收动态数组?

fortran - 如何在 Fortran 中混合 Coarray 和 MPI 代码

c++ - 使用 MPI 在处理器之间分配工作,但所有处理器都在完成整个工作,而不是只做其中的一部分