我正在本地运行一个带有两个进程的MPI C ++程序:mpirun -np 2 <programname>
。我看到MPI_Gather命令的行为不一致。为了测试,我写了一个非常短的代码片段。我将代码复制到main的开头,它工作正常。但是当它复制到代码中的其他点时,它有时会给出正确的结果,有时则不会。代码段复制如下。我怀疑问题是代码片段本身(因为它有时可以正常工作)。通常,当我看到这样的代码行为不一致时,我怀疑内存损坏。但是,我在这种情况下运行了Valgrind并且它没有报告任何错误(尽管我可能没有正确运行Valgrind用于MPI - 我没有在MPI程序上使用Valgrind经验)。 可能导致此类不一致行为的原因以及我该如何检测问题?
以下是代码段。
double val[2] = {0, 1};
val[0] += 10.0*double(gmpirank);
val[1] += 10.0*double(gmpirank);
double recv[4];
printdebug("send", val[0],val[1]);
int err = MPI_Gather(val,2,MPI_DOUBLE,recv,2,MPI_DOUBLE,0,MPI_COMM_WORLD);
if (gmpirank == 0) {
printdebug("recv");
printdebug(recv[0],recv[1]);
printdebug(recv[2],recv[3]);
}
printdebug("finished test", err);
打印调试功能打印到一个文件,该文件对每个进程是独立的,并用逗号分隔输入参数。
处理1打印:
send, 10, 11
finished test, 0
有时,处理0打印:
send, 0, 1
recv
0, 1
10, 11
finished test, 0
但是当我将代码放在代码的其他部分时,进程0有时会打印出类似这样的内容:
send, 0, 1
recv
0, 1
2.9643938750474793e-322, 0
finished test, 0
答案 0 :(得分:1)
我找到了解决方案。可疑,问题是内存损坏。
在使用MPI运行Valgrind时,我犯了一个初学者的错误。我跑了:
valgrind <options> mpirun -np 2 <programname>
而不是
mpirun -np 2 valgrind <options> <programname>
因此,我正在运行valgrind&#34; mpirun&#34;本身,而不是预定的计划。当我正确运行Valgrind时,它确定了代码中不相关部分的内存损坏。
感谢另一个Stack Overflow Q / A帮助我解决这个问题:Using valgrind to spot error in mpi code