Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ MPI代码在finalize时挂起,有2个以上的节点/进程_C++_Mpi_Mpich - Fatal编程技术网

C++ MPI代码在finalize时挂起,有2个以上的节点/进程

C++ MPI代码在finalize时挂起,有2个以上的节点/进程,c++,mpi,mpich,C++,Mpi,Mpich,假设下面的代码向每个节点发送一系列消息,并报告每次通信所需的时间。目前,它可以通过进程退出,但如果我使用两个以上的进程运行,它将挂起在最后一个exchange上 我在以前的版本中使用了语句来检查它挂起的位置,我90%确定它是MPI_FINALIZE语句,但我不太明白为什么。有什么想法吗 #include <stdio.h> #include "/usr/include/mpich2/mpi.h" #define ping 101 #define pong 101 float

假设下面的代码向每个节点发送一系列消息,并报告每次通信所需的时间。目前,它可以通过进程退出,但如果我使用两个以上的进程运行,它将挂起在最后一个exchange上

我在以前的版本中使用了语句来检查它挂起的位置,我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;
  }
#包括
#include“/usr/include/mpich2/mpi.h”
#定义ping 101
#定义乒乓球101
浮动缓冲区[100000];
int main(int argc,char*argv[]){
int错误,秩,大小;//mpi持有者
int i,j,k;//循环
外部浮点缓冲区[100000];//消息缓冲区
int length;//再次循环
双起点,终点,时间;
外部浮点缓冲区[100000];
MPI_Init(&argc,&argv);
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
如果(秩!=0){
MPI_状态;

对于(i=1;i,在非零秩中有一个额外的循环:

  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(秩!=0){
MPI_状态;

对于(i=1;我认为您需要在
if(rank==0)
部分中添加一个循环来迭代每个从属进程,否则将有消息发送但未接收,并在
COMM_WORLD
中被“捕获”,使
Finalize
不愉快。感谢捕获。我已经盯着它看了太久。问题解决了!