在我处理的特定问题中,以3D拓扑排列的过程必须彼此交换3D阵列A(:,:,:)
的部分。特别是,每个人必须向六个定向方向(例如A
)向正向第一维中的过程A(nx-1:nx,:,:)
发送给定数量的A(1:3,:,:)
切片。否定的一个,正y维度A(:,ny-3:ny,:)
,依此类推)。
为了做到这一点,我将定义一组子通道类型(通过MPI_TYPE_CREATE_SUBARRAY
)用于通信(可能MPI_NEIGHBOR_ALLTOALL
,或其V
或{ {1}}扩展名)。问题在于,在性能方面,更好的选择是:
最后,为了更一般,如标题中所述,更好地定义更多" basic" MPI派生数据类型并在通信中使用大于1的W
,或定义"更大的"类型并在通讯中使用counts
?
答案 0 :(得分:2)
MPI派生的数据类型被定义为为库提供打包和解包您发送的数据的方法。
对于基本类型(MPI_INT,MPI_DOUBLE等),没有问题,因为内存中的数据已经是连续的:内存中没有漏洞。
更复杂的类型(如多维数组或结构),按发送数据可能效率低下,因为您可能正在发送无用的数据。因此,数据被打包成一个连续的字节数组,发送到目的地,然后再次解压缩以恢复其原始形状。
话虽如此,您需要为内存中的每个不同形状创建派生数据类型。例如,A(1:3,:,:)
和A(nx-2:nx,:,:)
表示相同的数据类型。但A(nx-2:nx,:,:)
和A(:,nx-2:nx,:)
并非count
和{{1}}。如果正确指定了步幅访问(连续数据类型之间的差距),您甚至可以指定2D派生数据类型,然后改变{{1}}参数以获得更好的程序灵活性。
最后,为了回答你的上一个问题,这可能值得基准测试,虽然我认为差异不会很明显,因为它会在两种情况下产生单个MPI消息。