消息大小限制似乎比 Open MPI 中的限制小得多
Message size limit seems much smaller than should be in Open MPI
据我了解 this answer,您可以在 Open MPI 中 send/receive 的消息有 2^31-1
个元素的大小限制。然而,当我尝试发送一个 int
数组,该数组的元素超过 正好 4786470 个时,我的代码就停止工作了。它不会给我任何错误消息或段错误,它只会卡在通信中并且永远不会完成执行。
这是一个最小的例子:
#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();
}
我用 Isend
和 Irecv
做了一些测试,它似乎没有改变任何东西。我不确定是我在代码中做错了什么,还是我的 MPI 出了问题。
顺便说一句,编译 运行 我在 macOS 10.15.4 中使用 Open MPI 4.0.1 和 Apple clang 11.0.3。
看起来这是 macOS 上 Open MPI 运行 4.0.1 版的 known issue。 MPI 在传输 19145881 个字节后停止通信,这恰好给出了一个包含 4786470 个整数的数组。该错误已针对 >= 4.0.2 的版本修复,并且在安装更新版本后该示例完美运行。
据我了解 this answer,您可以在 Open MPI 中 send/receive 的消息有 2^31-1
个元素的大小限制。然而,当我尝试发送一个 int
数组,该数组的元素超过 正好 4786470 个时,我的代码就停止工作了。它不会给我任何错误消息或段错误,它只会卡在通信中并且永远不会完成执行。
这是一个最小的例子:
#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();
}
我用 Isend
和 Irecv
做了一些测试,它似乎没有改变任何东西。我不确定是我在代码中做错了什么,还是我的 MPI 出了问题。
顺便说一句,编译 运行 我在 macOS 10.15.4 中使用 Open MPI 4.0.1 和 Apple clang 11.0.3。
看起来这是 macOS 上 Open MPI 运行 4.0.1 版的 known issue。 MPI 在传输 19145881 个字节后停止通信,这恰好给出了一个包含 4786470 个整数的数组。该错误已针对 >= 4.0.2 的版本修复,并且在安装更新版本后该示例完美运行。