MPI-单边通信
我试图在MPI中使用单边通信 下面的示例包含一个由4个双工组成的数组,该数组分为两个进程 第一个进程在分布式数组中写入0、1、2、3,而第二个进程随后尝试读取它。不幸的是,它不起作用。我一定是在什么地方做错了什么 谢谢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
#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以同样的方式进行限制。没有循环,但缓冲区的使用寿命有限。需要重新设计。谢谢!