消息大小限制似乎比Open MPI中的限制要小得多

  • 本文关键字:MPI 消息 Open c++ mpi openmpi
  • 更新时间 :
  • 英文 :


根据这个答案,您可以在Open MPI中发送/接收的消息有2^31-1元素的大小限制。尽管如此,当我尝试发送一个int数组,该数组包含的元素超过,正好是4786470个元素时,我的代码就会停止工作。它不会给我任何错误消息或segfault,它只会在通信中卡住,永远不会完成执行。

这里有一个最小的例子:

#include "mpi.h"
int main(int argc, char **argv){
MPI_Init(&argc,&argv);
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
const int n = 4786470 + 1; // it works when n = 4786470
int* send_array = new int[n];
int* recv_array = new int[n];
for(int i=0; i<n; i++) send_array[i] = 0;
for(int i=0; i<n; i++) recv_array[i] = 0;
if(rank==0) MPI_Send(send_array, n, MPI_INT, 1, 0, MPI_COMM_WORLD);
if(rank==1) MPI_Recv(recv_array, n, MPI_INT, 0, 0, MPI_COMM_WORLD, MPI_STATUS_IGNORE);
delete[] send_array;
delete[] recv_array;
MPI_Finalize();
}

我用IsendIrecv做了一些测试,它似乎没有改变任何东西。我不确定是我在代码中做错了什么,还是我的MPI有问题。

顺便说一句,为了编译和运行,我在macOS 10.15.4中使用Open MPI 4.0.1和Apple clang 11.0.3。

这似乎是macOS上运行的OpenMPI 4.0.1版本中的一个已知问题。MPI在传输19145881字节后停止通信,该字节恰好给出4786470个整数的数组。该错误已在>=4.0.2版本中修复,在安装新版本后,该示例运行良好。