首页 > 解决方案 > MPI_Get 由于不同的循环长度而在循环中挂起

问题描述

我正在学习在循环中使用 MPI_Get,但程序冻结,因为一个循环结束,而另一个没有。这是我为重新创建问题而编写的简单代码

using vector_real = std::vector<double>;                                                                                                                                                                           
                                                                                                                                                                                                                                                                                                                                                                                                                       
int main(int argc, char* argv[]){                                                                                                                                                                                  
                                                                                                                                                                                                                   
  int total_rank, rank;                                                                                                                                                                                            
  int N=5;                                                                                                                                                                                                        
                                                                                                                                                                                                                   
  MPI_Init(&argc, &argv);                                                                                                                                                                                          
  MPI_Comm_size(MPI_COMM_WORLD, &total_rank);                                                                                                                                                                      
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);                                                                                                                                                                            
                                                                                                                                                                                                                   
  vector_real Array(N-rank);                                                                                                                                                                                       
  double a ;                                                                                                                                                                                                       
  for (int i=0; i<N-rank; i++){                                                                                                                                                                                    
    Array[i] = rank;                                                                                                                                                                                               
  }                                                                                                                                                                                                                
                                                                                                                                                                                                                   
  MPI_Win windowX;                                                                                                                                                                                                 
  MPI_Win_create(&Array[0], N, sizeof(double), MPI_INFO_NULL, MPI_COMM_WORLD, &windowX);                                                                                                                           
  MPI_Win_fence(0, windowX);                                                                                                                                                                                       
                                                                                                                                                                                                                   
  std::cout << "rank=" << rank<< " starts MPI_Get with loop length="<< N-rank << "\n";                                                                                                                                                                               
  
  for (int i=0; i<N-rank; i++){                                                                                                                                                                                    
    MPI_Win_fence(0, windowX);                                                                                                                                                                                     
    MPI_Get(&a, 1, MPI_DOUBLE, 0, 2, 1, MPI_DOUBLE, windowX);                                                                                                                                                      
    MPI_Win_fence(0, windowX);                                                                                                                                                                                     
    std::cout <<"rank="<< rank << " got a =" << a <<"\n";                                                                                                                                                          
  }                                                                                                                                                                                                                
                                                                                                                                                                                                                   
  std::cout <<"rank="<< rank<<" ended !!!\n";                                                                                                                                                                      
  MPI_Finalize();                                                                                                                                                                                                  
}            

       

输出看起来像这样

mpirun -np 2 ./test.o                                                                                                                                                                                              
rank=0 starts MPI_Get with loop length=5                                                                                                                                                                           
rank=1 starts MPI_Get with loop length=4                                                                                                                                                                           
rank=1 got a =0                                                                                                                                                                                                    
rank=1 got a =0                                                                                                                                                                                                    
rank=0 got a =0                                                                                                                                                                                                    
rank=0 got a =0                                                                                                                                                                                                    
rank=0 got a =0                                                                                                                                                                                                    
rank=1 got a =0                                                                                                                                                                                                    
rank=1 got a =0                                                                                                                                                                                                    
rank=1 ended !!!                                                                                                                                                                                                   
rank=0 got a =0 

                                                                                                                                                                                               
                             

我们看到 rank=1 有一个较小的循环,所以它首先完成,但是 rank=0 的循环并没有结束。

有谁知道如何解决这个问题?谢谢

标签: c++mpi

解决方案


推荐阅读