c - 使用 MPI_Win_create() 和 MPI_Get() 函数时的问题
问题描述
在 MPI (MPICH) 中,我正在尝试使用 Windows。我有一个 3D 网格拓扑和额外的通信器 i_comm。
MPI_Comm cartcomm;
int periods[3]={1,1,1}, reorder=0, coords[3];
int dims[3]={mesh, mesh, mesh}; //mesh is size of each dimention
MPI_Dims_create(size, 3, dims);
MPI_Cart_create(MPI_COMM_WORLD, 3, dims, periods,reorder, &cartcomm);
MPI_Cart_coords(cartcomm, my_rank, 3, coords);
MPI_Comm i_comm;
int i_remain_dims[3] = {false, true, false};
MPI_Cart_sub(cartcomm, i_remain_dims, &i_comm);
int i_rank;
MPI_Comm_rank(i_comm, &i_rank);
MPI_Win win_PB;
int * PA = (int *) malloc(r*r*sizeof(int)); //r is input size
int * PB = (int *) malloc(r*r*sizeof(int));
/* arrays are initialized*/
然后我创建窗口,然后尝试使用 get 函数
if(i_rank == 0){
MPI_Win_create(PB, r*r*sizeof(int), sizeof(int), MPI_INFO_NULL, i_comm, &win_PB);
}
else{
MPI_Win_create(NULL, 0, 1, MPI_INFO_NULL, i_comm, &win_PB);
}
MPI_Win_fence(0, win_PB);
if(i_rank != 0){
MPI_Get(PB, r*r*sizeof(int), MPI_INT, 0, 0, r*r*sizeof(int), MPI_INT, win_PB);
}
MPI_Win_fence(0, win_PB);
使用此代码,我得到很长的错误输出:
[ana:24006] *** Process received signal ***
[ana:24006] Signal: Segmentation fault (11)
[ana:24006] Signal code: Address not mapped (1)
[ana:24006] Failing at address: 0xa8
此外,如果不使用 MPI_Win_fence,我会在 get 函数中遇到错误:MPI_ERR_RMA_SYNC: error execution rma sync。我不确定这是否正常。
我观察到的是,如果我以相反的顺序声明数组,那么它可以正常工作:
int * PB = (int *) malloc(r*r*sizeof(int));
int * PA = (int *) malloc(r*r*sizeof(int));
问题是我需要为 PA 缓冲区创建另一个通信器和另一个窗口,所以最后只是切换行的顺序并没有帮助。
我将非常感谢任何帮助找出我做错了什么。
解决方案
推荐阅读
- c - 将C中字符串中的特定字母大写
- javascript - Vue.js 2.0:组件不呈现对象更改
- python - 如果字符串字段不为空,如何连接表
- sql - 我不知道如何将我的属性组合到此查询的单个列中
- ruby-on-rails - 在具有命名空间的 Rails 控制器中找不到 ActiveModel
- r - 覆盖(合并)r中的两个图像
- azure - 如何在 Azure API 管理中启用响应标头跟踪
- python - 尝试导入 youtube 网址列表时出现此错误
- reactjs - 将 Passport 与 Next.js / React 一起使用
- c# - 扩展 Identity Server 4 功能