MPI_bcast中是否有变量的大小限制?

MPI_bcast中是否有变量的大小限制?,mpi,mpich,Mpi,Mpich,我有最新的MPICH2(3.0.4)在一台四核双CPU(英特尔至强)机器上使用英特尔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=0x7f50

我有最新的MPICH2(3.0.4)在一台四核双CPU(英特尔至强)机器上使用英特尔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中变量的大小是否有限制,或者数组的大小是否超出了它所能处理的范围?

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


请参阅:

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


请参阅:

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

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

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


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

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

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


  • 是的,约翰,缩小尺寸很有效。那么,广播超大阵列的合适方式是什么?令我惊讶的是,我的同事正在运行相同的代码,但不同的安装却没有得到错误。那么,它依赖于实现吗?如果是这样的话,哪种实现应该允许这样做?是的,约翰,缩小规模是可行的。那么,广播超大阵列的合适方式是什么?令我惊讶的是,我的同事正在运行相同的代码,但不同的安装却没有得到错误。那么,它依赖于实现吗?如果是这样,哪种实现应该允许这样做?wes,注意他正在运行mpich-3.0.4,如果您使用MPI数据类型方法,它可能会爆炸。这很公平。首次更新到mpich 3.1。然后做数据类型的事情。韦斯,注意他正在运行mpich-3.0.4,如果你使用MPI数据类型的方法,它可能会爆炸。这很公平。首次更新到mpich 3.1。然后做数据类型的事情。限制是“有符号整数的大小”,对大多数平台来说是2^31。“使用MPI数据类型”的答案是正确的。限制是“有符号整数的大小”,对于大多数平台是2^31。“使用MPI数据类型”答案是正确的方法。