【问题标题】:Is there a size limit of variable in MPI_bcast?MPI_bcast 中的变量有大小限制吗?
【发布时间】:2017-06-08 16:17:36
【问题描述】:

我有最新的 MPICH2 (3.0.4) 在四核双 CPU (Intel Xeon) 机器上使用 intel fort 编译器编译。

我遇到了一个 MPI_bcast 问题,我无法广播数组

gpsi(1:201,1:381,1:38,1:20,1:7)

将其设为大小为 407410920 的数组。当我尝试广播此数组时,出现以下错误

Fatal error in PMPI_Bcast: Other MPI error, error stack:
PMPI_Bcast(1525)......: MPI_Bcast(buf=0x7f506d811010, count=407410920,
MPI_DOUBLE_PRECISION, root=0, MPI_COMM_WORLD) failed
MPIR_Bcast_impl(1369).: 
MPIR_Bcast_intra(1160): 
MPIR_SMP_Bcast(1077)..: Failure during collective
rank 1 in job 31  Grace_52261   caused collective abort of all ranks
  exit status of rank 1: killed by signal 9 
MPI launch string is: mpiexec -n 2    %B/tvdbootstrap 
Testing MPI configuration with 'mpich2version'
Exit value was 127 (expected 0), status: execute_command_t::exited
Launching MPI job with command: mpiexec -n 2    %B/tvdbootstrap 
Server args: -callback 127.0.0.1:4142 -set_pw 65f76672:41f20a5c 

那么问题是,MPI_bcast 中的变量大小是否有限制,或者我的数组的大小是否超出了它可以处理的范围?

【问题讨论】:

  • 是的,约翰,缩小尺寸是可行的。那么,广播超大数组的合适方法是什么?令我惊讶的是,运行相同代码但安装不同的同事没有收到错误。那么,它是否依赖于实现?如果是这样,哪个实现应该允许这样做?

标签: mpi mpich


【解决方案1】:

正如 John 所说,您的数组太大了,因为它无法再由 int 变量描述。在这种情况下,您有几个选择。

  1. 使用多个 MPI 调用来发送数据。对于此选项,您只需将数据分成小于 2^31 的块并单独发送,直到您收到所有数据。

  2. 使用 MPI 数据类型。使用此选项,您需要创建一个数据类型来描述数据的某些部分,然后发送该数据类型的倍数。例如,如果您只是发送一个包含 100 个整数的数组,您可以使用 MPI_TYPE_VECTOR 创建一个包含 10 个整数的数据类型,然后发送 10 个该新数据类型。当您第一次看到数据类型时可能会有些困惑,但它们对于发送大数据或非连续数据非常强大。

【讨论】:

  • 我们,请注意他正在运行 mpich-3.0.4,如果您使用 MPI 数据类型方法,它可能会爆炸。
  • 很公平。首次更新到 mpich 3.1。然后做数据类型的事情。
【解决方案2】:

是的,有一个限制。通常是 2^31,所以大约有 20 亿个元素。你说你的数组有 4.07 亿个元素,所以它看起来应该可以工作。但是,如果限制是 20 亿字节,那么您将超出大约 30%。尝试将数组大小减半,看看是否可行。

见:Maximum amount of data that can be sent using MPI::Send

【讨论】:

  • 限制是“有符号整数的大小”,对于大多数平台来说是 2^31。 “使用 MPI 数据类型”的答案是正确的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多