MPI-单边通信

MPI-单边通信,mpi,Mpi,我试图在MPI中使用单边通信 下面的示例包含一个由4个双工组成的数组,该数组分为两个进程 第一个进程在分布式数组中写入0、1、2、3,而第二个进程随后尝试读取它。不幸的是,它不起作用。我一定是在什么地方做错了什么 谢谢 #include <mpi.h> #include <iostream> int main(){ MPI_Init(0, nullptr); int rank, size; MPI_Comm_rank(MPI_COMM_WORLD, &am

我试图在MPI中使用单边通信

下面的示例包含一个由4个双工组成的数组,该数组分为两个进程

第一个进程在分布式数组中写入0、1、2、3,而第二个进程随后尝试读取它。不幸的是,它不起作用。我一定是在什么地方做错了什么

谢谢

#include <mpi.h>
#include <iostream>

int main(){

  MPI_Init(0, nullptr);
  int rank, size;
  MPI_Comm_rank(MPI_COMM_WORLD, &rank);
  MPI_Comm_size(MPI_COMM_WORLD, &size);
  
  int n=2;

  double* data, x;
  MPI_Win window;
  MPI_Alloc_mem(n*sizeof(double), MPI_INFO_NULL, &data);
  MPI_Win_create(data, n*sizeof(float), sizeof(float), MPI_INFO_NULL, MPI_COMM_WORLD, &window);

  int i;
  
  MPI_Win_fence(0, window);
  
  if(rank==0){
    for(i=0; i<n*size; ++i){
      x=i;
      MPI_Put(&x, 1, MPI_DOUBLE, i/n, i%n, 1, MPI_DOUBLE, window); 
    }
    MPI_Win_fence(0, window);
  }else{
    MPI_Win_fence(0, window);
    for(i=0; i<n*size; ++i){      
      MPI_Get(&x, 1, MPI_DOUBLE, i/n, i%n, 1, MPI_DOUBLE, window);
      std::cout << i << " " << i/n << " " << i%n << " => " << x << "\n";
    }
  }
  
  MPI_Win_free(&window);
  MPI_Free_mem(data);

  MPI_Finalize();
  return 0;
}

#包括
#包括
int main(){
MPI_Init(0,nullptr);
int等级、大小;
MPI通信等级(MPI通信世界和等级);
MPI_通信大小(MPI_通信世界和大小);
int n=2;
双*数据,x;
MPI_Win窗口;
MPI_Alloc_mem(n*sizeof(双精度)、MPI_INFO_NULL和数据);
MPI_Win_create(数据、n*sizeof(float)、sizeof(float)、MPI_INFO_NULL、MPI_COMM_WORLD和窗口);
int i;
MPI_Win_围栏(0,窗口);
如果(秩==0){

对于(i=0;iIt不起作用的确切程度如何?感谢您的回复。只有最后修改的值是正确的。我尝试通过添加
MPI\u Win\u锁(共享,排名,0,窗口);
MPI\u Win\u解锁(排名,窗口)来替换
MPI\u Put
MPI\u Get
之前和之后,在具有相同原始缓冲区和不同目标偏移量的循环中调用
MPI\u Get
的MPI程序是不正确的,因为所有MPI RMA调用都是非阻塞的。这意味着
MPI\u Get
仅启动操作,但绝对没有guar在调用
MPI\u WIN\u FENCE
之前,请确保操作已完成。您应该将
x
制作一个数组,并将
MPI\u GET
放入该数组的不同元素中,调用
MPI\u WIN\u FENCE
,然后打印内容。非常感谢!这段代码只是一个重现问题的示例,但我的代码是一个示例FFL以同样的方式进行限制。没有循环,但缓冲区的使用寿命有限。需要重新设计。谢谢!