MPI_Dims_create在远程计算机上引发错误

MPI_Dims_create throws error on remote machine

本文关键字:错误 计算机 Dims create MPI      更新时间:2023-10-16

作为算法的第一步,我正在尝试设置笛卡尔网格。在我的本地机器(带clang的OS X)上,我的代码运行。在研究集群(带有GNU的Linux)上,我得到了以下错误。

$mpirun -n 4 ./test.exe
[shas0137:67495] *** An error occurred in MPI_Dims_create
[shas0137:67495] *** reported by process [3694788609,1]
[shas0137:67495] *** on communicator MPI_COMM_WORLD
[shas0137:67495] *** MPI_ERR_DIMS: invalid topology dimension
[shas0137:67495] *** MPI_ERRORS_ARE_FATAL (processes in this communicator will now abort,
[shas0137:67495] ***    and potentially your MPI job)
[shas0137:67491] 3 more processes have sent help message help-mpi-errors.txt / mpi_errors_are_fatal
[shas0137:67491] Set MCA parameter "orte_base_help_aggregate" to 0 to see all help / error messages

设置"porte_base_help.aggregate"参数只需重复错误消息4次(每个进程一次)

大多数MPI例程在文档中都有错误代码列表,但MPI_ERR_DIMS没有针对MPI_DIMS_create 列出

版本详细信息:本地

$ mpic++ -v
Apple LLVM version 9.0.0 (clang-900.0.37)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 

版本详细信息:研究集群

$ mpic++ -v
Using built-in specs.
COLLECT_GCC=/curc/sw/gcc/6.1.0/bin/g++
COLLECT_LTO_WRAPPER=/curc/sw/gcc/6.1.0/libexec/gcc/x86_64-pc-linux-gnu/6.1.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-6.1.0/configure --prefix=/curc/sw/gcc/6.1.0 --enable-languages=c,c++,fortran,go --disable-multilib --with-tune=intel
Thread model: posix
gcc version 6.1.0 (GCC) 

MCVE

(或者尽我所能接近可验证的,因为这只发生在某些配置上)

#include <mpi.h>
int main(int argc, char* argv[]) {
MPI_Init(&argc, &argv);
MPI_Status st;
MPI_Comm comm = MPI_COMM_WORLD;
MPI_Comm grid_comm;
int size;
int err = MPI_Comm_size(comm, &size);
//Error handling
if (err != MPI_SUCCESS) {
return 1;
}
std::cout << size << std::endl;
//This call throws the error
int dims[3];
err = MPI_Dims_create(size, 3, dims);
//Error handling
if (err != MPI_SUCCESS) {
return 2;
}
MPI_Finalize();
return 0;
}

TLDR

我声明了dim数组,但没有初始化。在我的本地机器上,我碰巧得到了一块干净的内存。

为什么这很重要

我忽略了这一点的重要性,部分原因是我忽略了dims既是一个输入参数也是一个输出参数。我假设作为一个输出参数,dims中的任何值都会被MPI例程覆盖。

我查阅的原始文档(来自MPICH)非常简短。

MPI_Dims_create

输入/输出参数

调暗

大小为ndims的整数数组,指定中的节点数每个维度值0表示MPI_Dims_create应该填写一个合适的值(强调矿)

即非零值不会被例程覆盖。

更多信息请访问MPI论坛MPI文档:

6.5.2.笛卡尔便利函数:MPI_DIMS_CREATE

(…)调用方可以通过以下方式进一步约束此例程的操作指定阵列调光的元素。如果dims[i]设置为正number,例程不会修改维度中的节点数i;只有dims[i]=0的那些条目被调用修改。

dims[i]的负输入值是错误的。(…)

简而言之,在研究集群上,未初始化的dims数组中的值要么为负数,要么大于我试图分配的节点数。

相关文章: