【问题标题】:error on mpi scatterv with long displacements具有长位移的 mpi scatterv 错误
【发布时间】:2012-05-21 01:43:04
【问题描述】:

我正在使用 MPI_Scatterv 分散一个非常大的数组:

MPI_Scatterv(list, counts, displacements, MPI_LONG, pSubList, counts[rank], MPI_LONG, MASTER, MPI_COMM_WORLD);

并且我已经声明了变量 countsdisplacements(int 类型还不够),但是,MPI_Scatterv 只接受 int 变量用于计数和位移.

有什么办法可以解决这个问题吗?

【问题讨论】:

标签: c mpi


【解决方案1】:

您不能用 long 代替 int,至少在大多数 MPI 2.2 实现中是这样。即使您按照 Greg 的建议创建用户定义的数据类型,您也可能(并且大多数情况下)会遇到实现限制,例如使用整数在内部表示偏移量。 MPI 3.0 草案专门解决了这个问题,并要求在 C 和 Fortran 绑定中 offset 和 count 参数都是 long(64 位)类型。

在 MPI 3.0 成为标准并且符合标准的实现出来之前,我会坚持一些子通信方案,例如将数据分布在几轮中,并将多个分散到等级子集。

【讨论】:

  • 显然没有遵循,至少没有强制。我在 2019 年使用了 MPI-3 的几个实现,并且头文件的位移参数中仍然有 int。您最多可以重新编译 openmpi 以获得 64 位偏移量。 diracprogram.org/doc/release-12/installation/int64/…
  • @alfC,不幸的是,长计数从未进入 MPI 规范。 iirc 的基本原理是long 参数破坏了现有软件,并且大多数时候可以通过使用用户定义的数据类型将元素的数量放入int。 Jeff Hammond 的 BigMPI 来救援。
  • 如何创建新的数据类型,例如在 scatterv 中,我想传递一个变量的双精度数。我应该使用具有最大公分母的扩展数据类型吗?这与 BigMPI 是分开的吗?在接收和发送方面,BigMPi 似乎抛弃了 scatterv 并天真地实现了它们。
  • 数据类型应该是连续的,其大小可以划分所有大小。如果尺寸是互质的,你唯一的选择是做单独的 Isend/Irecv。此外,大多数 MPI 库中更大消息的 `MPI_Scatterv' 实现与 BigMPI 所做的没有太大区别。
【解决方案2】:

为什么不同时分发散点图,这样 int 类型就足够了?

您可以将 MPI 进程视为树的节点。并让中间树节点有自己的相应子树的分散/聚集。

【讨论】:

    【解决方案3】:

    您可以创建自定义 MPI 数据类型来表示 LONG 块。位移和计数将是该块大小的倍数。

    【讨论】:

      猜你喜欢
      • 2014-06-03
      • 2012-05-25
      • 2016-08-03
      • 2018-03-02
      • 2016-12-30
      • 2012-05-27
      • 1970-01-01
      • 2014-01-13
      • 2012-05-29
      相关资源
      最近更新 更多