【问题标题】:MPI - communicate 1 element of a big type or more elements of a small type?MPI - 传达一个大型元素或多个小型元素?
【发布时间】:2016-09-01 08:40:54
【问题描述】:

在我正在处理的具体问题中,安排在 3D 拓扑中的进程必须相互交换 3D 数组 A(:,:,:) 的部分。特别是,每个人都必须将给定数量的A 切片发送到六个定向方向上的进程(例如,A(nx-1:nx,:,:) 发送到正第一维的进程,A(1:3,:,:) 负一维,A(:,ny-3:ny,:)在正 y 维度,依此类推)。 为此,我将定义一组用于通信的子数组类型(通过MPI_TYPE_CREATE_SUBARRAY)(可能是MPI_NEIGHBOR_ALLTOALL,或其VW 扩展名)。问题是关于性能方面的更好选择:

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

最后,更笼统地说,如标题所示,是定义更多“基本”MPI 派生数据类型并在通信中使用大于 1 的counts,还是定义“更大”类型并使用counts = 1 在通讯中?

【问题讨论】:

    标签: performance mpi derived-types


    【解决方案1】:

    定义 MPI 派生数据类型是为了为库提供一种打包和解包您发送的数据的方法。

    对于基本类型(MPI_INT、MPI_DOUBLE 等)没有问题,因为内存中的数据已经是连续的:内存中没有空洞。

    更复杂的类型,例如多维数组或结构,按原样发送数据可能效率低下,因为您可能发送了无用的数据。出于这个原因,数据被打包成一个连续的字节数组,发送到目的地,然后再次解包以恢复其原始形状。

    话虽如此,您需要为内存中的每个不同形状创建派生数据类型。例如,A(1:3,:,:)A(nx-2:nx,:,:) 表示相同的数据类型。但是A(nx-2:nx,:,:)A(:,nx-2:nx,:) 不会。如果您正确指定了跨步访问(连续数据类型之间的间隔),您甚至可以指定一个 2D 派生数据类型,然后改变 count 参数以获得更好的程序灵活性。

    最后,回答您的最后一个问题,这可能值得进行基准测试,尽管我认为差异不会很明显,因为它在两种情况下都会产生一条 MPI 消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 2018-02-01
      相关资源
      最近更新 更多