我在四核双CPU(Intel Xeon)机器上使用intel fort编译器编译了最新的MPICH2(3.0.4)。
我遇到一个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中的变量大小是否存在限制,或者我的数组的大小是否超出它的处理范围?
答案 0 :(得分:4)
正如John所说,你的数组太大了,因为int
变量无法再描述它。在这种情况下,您有几个选择。
使用多个MPI调用来发送数据。对于此选项,您只需将数据划分为小于2 ^ 31的块并单独发送,直到您收到所有内容。
使用MPI数据类型。使用此选项,您需要创建数据类型来描述数据的某些部分,然后发送该数据类型的倍数。例如,如果您只是发送一个包含100个整数的数组,则可以使用MPI_TYPE_VECTOR
创建10个整数的数据类型,然后发送10个新数据类型。当您第一次看到它们时,数据类型可能会有点混乱,但它们对于发送大数据或非连续数据非常有用。
答案 1 :(得分:2)
是的,有一个限制。它通常是2 ^ 31,所以大约有20亿个元素。你说你的阵列有4.07亿个元素,所以它看起来应该可行。但是,如果限制是20亿字节,那么你将超过它约30%。尝试将数组大小减半,看看是否有效。