当我尝试将具有超过 750 个元素的double 类型的数组收集到表示矩阵的数组中时,我收到错误消息“MPI_Gather 中发生错误” 。正在收集的数组应该表示矩阵的列,并且由于矩阵的构造使得行在内存中是连续的,因此我将派生数据类型定义为列向量并称为 MPI_Gather,如下所示:
for (i = 0; i < k; i++) {
MPI_Gather(&Q_vector[i*m], m, MPI_DOUBLE, &Q[i*size], 1, vector_m, 0, MPI_COMM_WORLD);
}
Run Code Online (Sandbox Code Playgroud)
其中k是向量数,m是每个向量的长度(矩阵中的行数),size是进程数,vector_m是派生数据类型,其构造如下:
MPI_Type_vector(m, 1, n, MPI_DOUBLE, &vector_m_type);
MPI_Type_create_resized(vector_m_type, 0, sizeof(double), &vector_m);
MPI_Type_commit(&vector_m);
Run Code Online (Sandbox Code Playgroud)
其中n是矩阵中的列数。
这在m > 750之前都可以正常工作。例如,如果m = 751,则会发生错误(751 个 double 类型的元素)。它不依赖于n的值。我完全改变了算法,以便矩阵的列连续存储在内存中,而不是通过完全避免派生数据类型来解决问题,但我仍然很好奇为什么会发生这种情况。
电脑规格:
CPU:Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz
内存:8GB
操作系统:Windows 10 家庭版 64 位
编译器:gcc 6.4.0
我使用 Cygwin。
有时会打印此错误消息:
" …