如果我有一个数组A [100] [100] [100],我如何为六个边缘子阵列(鬼影单元)创建一个远程存储器访问窗口,特别是A [0] [:] [:]和A [100] [:] [:]。 在MPI-1中,我创建了矢量类型来发送/ recv ghost单元格。 在MPI-2和-3中,我是否需要暴露整个阵列或只暴露幽灵细胞?当然,如果可能,后者会好得多。
答案 0 :(得分:1)
MPI RMA窗口是内存中的连续区域,出于性能原因,实现可能要求使用MPI_ALLOC_MEM
专门分配它们。 3-D阵列的6个边中的4个边界单元在存储器中不连续。某些实现还可能要求窗口在页面或其他类型的边界上开始对齐。因此,您必须注册一个跨越整个数组的窗口。
虽然技术上可以为A [0] [:] [:]和A [99] [:] [:]公开两个单独的窗口,但这些不会暴露数组的任何其他部分,这只是A [:] [0] [:],A [:] [99] [:]等不可能,因为它们具有不连续的特征。
我建议您使用A
分配MPI_ALLOC_MEM
(如果使用C / C ++编程,则为MPI_Alloc_mem
)。然后,您可以在MPI_GET
和MPI_PUT
中使用适当的矢量类型,以便轻松访问远程光环单元格以及要复制的本地单元格。