MPI - 传递一个大类型或小类型元素的1个元素?

时间:2016-09-01 08:40:55

标签: performance mpi derived-types

在我处理的特定问题中,以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}}扩展名)。问题在于,在性能方面,更好的选择是:

  • 定义3个子阵列(每个维度一个),每个子阵列实际上是一个2D阵列,然后使通信沿着每个维度在两个方向上发送不同数量的这些类型,或者
  • 定义6个子阵列(每个定向方向一个),每个子阵列仍然是一个3D阵列,然后让通信沿着每个维度向两个方向发送两种类型的一个元素?

最后,为了更一般,如标题中所述,更好地定义更多" basic" MPI派生数据类型并在通信中使用大于1的W,或定义"更大的"类型并在通讯中使用counts

1 个答案:

答案 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消息。