来自MPI_Gather

时间:2016-12-09 03:41:28

标签: mpi valgrind

我正在本地运行一个带有两个进程的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

1 个答案:

答案 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