关于 MPI 3.0 中的 Remote Access Memory,有两种通信调用:MPI_Put 和 MPI_Get。我使用以下内容将本地数据放入共享内存(为了说明,我从https://software.intel.com/en-us/blogs/2014/08/06/one-side-communication复制了一些语句):
if (id < num_procs-1)
MPI_Put(&localbuffer[0], NUM_ELEMENT, MPI_INT, id+1, 0, NUM_ELEMENT, MPI_INT, win);
else
MPI_Put(&localbuffer[0], NUM_ELEMENT, MPI_INT, 0, 0, NUM_ELEMENT, MPI_INT, win);
这里 num_procs 是处理器的数量,id 是处理器等级。它们分别从以下位置返回:
MPI_Comm_rank(MPI_COMM_WORLD, &id);
MPI_Comm_size(MPI_COMM_WORLD, &num_procs);
在 MPI_Put 之后,来自每个处理器的数据应该被放入共享内存中。然后我的代码想使用从这个共享内存中获取数据
if (id != 0)
MPI_Get(&localbuffer[0], NUM_ELEMENT_get, MPI_INT, id-1, 0, NUM_ELEMENT, MPI_INT, win);
else
MPI_Get(&localbuffer[0], NUM_ELEMENT_get, MPI_INT, num_procs-1, 0, NUM_ELEMENT, MPI_INT, win);
我的问题是:我是否可以运行 NUM_ELEMENT_get 与 NUM_ELEMENT 不同的案例?这意味着与它们发送的数据相比,相同的处理器将从共享内存中获取不同数量的数据。另一个问题是单个处理器获得的数据可能来自不同的处理器。那么如何在上面的 MPI_Get 调用中指定 id-1 和 num_procs-1 的参数呢?我没有尝试实现这一点,但正在考虑在我的代码中设计 MPI 实现。
太感谢了。