【发布时间】:2013-11-19 14:27:51
【问题描述】:
如果我有一个数组 A[100][100][100],我如何为六个边缘子数组(幽灵单元)创建一个远程内存访问窗口,尤其是 A[0][:][:] 和A[100][:][:]。 在 MPI-1 中,我创建了向量类型来发送/接收幽灵单元。 在 MPI-2 和 -3 中,我需要暴露整个阵列还是只暴露幽灵单元?当然,如果可能的话,后者会好很多。
【问题讨论】:
如果我有一个数组 A[100][100][100],我如何为六个边缘子数组(幽灵单元)创建一个远程内存访问窗口,尤其是 A[0][:][:] 和A[100][:][:]。 在 MPI-1 中,我创建了向量类型来发送/接收幽灵单元。 在 MPI-2 和 -3 中,我需要暴露整个阵列还是只暴露幽灵单元?当然,如果可能的话,后者会好很多。
【问题讨论】:
MPI RMA 窗口是内存中的连续区域,出于性能原因,实现可能需要使用MPI_ALLOC_MEM 专门分配它们。 3-D 阵列的 6 条边中的 4 条边上的边界单元在内存中是不连续的。一些实现还可能要求窗口在页面或其他类型的边界上开始对齐。因此,您必须注册一个跨越整个数组的窗口。
虽然技术上可以为 A[0][:][:] 和 A[99][:][:] 公开两个单独的窗口,并且这些窗口不会公开数组的任何其他部分,但这很简单A[:][0][:]、A[:][99][:] 等由于它们的不连续字符而无法实现。
我建议您使用MPI_ALLOC_MEM(或MPI_Alloc_mem,如果您使用C/C++ 编程)分配A。然后,您可以在 MPI_GET 和 MPI_PUT 中使用适当的矢量类型,以便轻松访问远程晕圈单元以及要复制的本地单元。
【讨论】: