C++ 有人能用open mpi解释这个valgrind错误吗?

C++ 有人能用open mpi解释这个valgrind错误吗?,c++,memory-management,memory-leaks,valgrind,openmpi,C++,Memory Management,Memory Leaks,Valgrind,Openmpi,我的基本问题是关于抑制文件在valgrind中如何工作。我已经阅读了很多关于在mpi版本>1.5(我的是1.6)上使用以下内容的文档: 然而,当我像这样运行它时,该文件有600多个错误! 我得到的错误是这两个一遍又一遍。以我目前对valgrind和mpi的理解,我不知道如何解释其中任何一个 ==8821== Address 0xad5e4d7 is 87 bytes inside a block of size 128 alloc'd ==8821== at 0x4C2B6CD: mal

我的基本问题是关于抑制文件在valgrind中如何工作。我已经阅读了很多关于在mpi版本>1.5(我的是1.6)上使用以下内容的文档:

然而,当我像这样运行它时,该文件有600多个错误! 我得到的错误是这两个一遍又一遍。以我目前对valgrind和mpi的理解,我不知道如何解释其中任何一个

==8821==  Address 0xad5e4d7 is 87 bytes inside a block of size 128 alloc'd
==8821==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8821==    by 0x6348C52: ??? (in /usr/lib/openmpi/lib/libopen-pal.so.0.0.0)
==8821==    by 0x6349AF1: ??? (in /usr/lib/openmpi/lib/libopen-pal.so.0.0.0)
==8821==    by 0x6349B81: ??? (in /usr/lib/openmpi/lib/libopen-pal.so.0.0.0)
==8821==    by 0x7DA5B9C: ??? (in /usr/lib/openmpi/lib/openmpi/mca_grpcomm_bad.so)
==8821==    by 0x7DA52F4: ??? (in /usr/lib/openmpi/lib/openmpi/mca_grpcomm_bad.so)
==8821==    by 0x5082AF2: ??? (in /usr/lib/openmpi/lib/libmpi.so.0.0.2)
==8821==    by 0x50A33FA: PMPI_Init (in /usr/lib/openmpi/lib/libmpi.so.0.0.2)
==8821==    by 0x408AB5: main (test_send-receive.cpp:8)
==8821==  Uninitialised value was created by a heap allocation
==8821==    at 0x4C2B6CD: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==8821==    by 0x635FE2B: ??? (in /usr/lib/openmpi/lib/libopen-pal.so.0.0.0)
==8821==    by 0x6360634: opal_ifcount (in /usr/lib/openmpi/lib/libopen-pal.so.0.0.0)
==8821==    by 0x81B36AA: ??? (in /usr/lib/openmpi/lib/openmpi/mca_oob_tcp.so)
==8821==    by 0x5C01EE2: mca_oob_base_init (in /usr/lib/openmpi/lib/libopen-rte.so.0.0.0)
==8821==    by 0x7FA97FB: ??? (in /usr/lib/openmpi/lib/openmpi/mca_rml_oob.so)
==8821==    by 0x5C083E4: orte_rml_base_select (in /usr/lib/openmpi/lib/libopen-rte.so.0.0.0)
==8821==    by 0x5BF5EC4: orte_ess_base_app_setup (in /usr/lib/openmpi/lib/libopen-rte.so.0.0.0)
==8821==    by 0x7BA1EAE: ??? (in /usr/lib/openmpi/lib/openmpi/mca_ess_env.so)
==8821==    by 0x5BDDB72: orte_init (in /usr/lib/openmpi/lib/libopen-rte.so.0.0.0)
==8821==    by 0x50822E0: ??? (in /usr/lib/openmpi/lib/libmpi.so.0.0.2)
==8821==    by 0x50A33FA: PMPI_Init (in /usr/lib/openmpi/lib/libmpi.so.0.0.2)
产生这些错误的代码是:

int main(int argc, char *argv[]) {

  /* init MPI */
  MPI_Init(&argc, &argv);

  int myid;
  MPI_Comm_rank(MPI_COMM_WORLD, &myid);
  int i;
  if(myid == 0){
    double * d = new double [10];
    for(i = 0; i<10; i++){
      d[i] = i + 1.0;
    }
    MPI_Send(d,
             10,
         MPI_DOUBLE,
         1,
         1,
         MPI_COMM_WORLD);
    delete[] d;
  } else {
    MPI_Status status;
    double * c = new double [10];
    MPI_Recv(c,
         10,
         MPI_DOUBLE,
             0,
         MPI_ANY_TAG,
         MPI_COMM_WORLD,
         &status);

    for(i = 0; i<10; i++){
      printf("%f\n", c[i]);
    }
    delete[] c;
  }
  MPI_Finalize();
  return 0;
    }
intmain(intargc,char*argv[]){
/*初始化MPI*/
MPI_Init(&argc,&argv);
int-myid;
MPI通信等级(MPI通信世界和myid);
int i;
如果(myid==0){
double*d=新的double[10];

对于(i=0;i很可能我们的抑制文件在OMPI v1.6中不是最新的:-\


您应该在OMPI邮件列表中报告这一点。请参阅。

当代码采用myid==0路径或“else”路径时,valgrind错误是否会发生,还是在这两种情况下都会发生?此外,您没有检查MPI_Recv()调用的返回值(或“status”变量)以查看MPI_Recv()是否成功。因此,可能是该MPI_Recv()由于某种原因失败,因此未将任何数据写入(c)数组,这将在printf()中导致未初始化的内存读取错误调用之后会发生这种情况。只是猜测。@JeremyFriesner,除非更改了通信器的错误处理程序,否则不需要测试返回值。如果操作返回的不是
MPI\u SUCCESS
(但对MPI I/O操作无效),则默认的标准错误处理程序会中止应用程序。这不是一个适合这样的问题。似乎Valgrind在OpenMPI的OPAL库中检测到了一些东西(可能是误报)。如果您认为这是一个bug,您应该向OpenMPI解决这个问题,或者在其中打开一个票证。此外,它发生在实现
MPI\u Init()
操作。它与代码的其余部分无关。是否仍然是这样?我必须生成一个更全面的抑制文件来抑制所有错误,即使是在最小的mpi程序中(初始化然后完成)。
int main(int argc, char *argv[]) {

  /* init MPI */
  MPI_Init(&argc, &argv);

  int myid;
  MPI_Comm_rank(MPI_COMM_WORLD, &myid);
  int i;
  if(myid == 0){
    double * d = new double [10];
    for(i = 0; i<10; i++){
      d[i] = i + 1.0;
    }
    MPI_Send(d,
             10,
         MPI_DOUBLE,
         1,
         1,
         MPI_COMM_WORLD);
    delete[] d;
  } else {
    MPI_Status status;
    double * c = new double [10];
    MPI_Recv(c,
         10,
         MPI_DOUBLE,
             0,
         MPI_ANY_TAG,
         MPI_COMM_WORLD,
         &status);

    for(i = 0; i<10; i++){
      printf("%f\n", c[i]);
    }
    delete[] c;
  }
  MPI_Finalize();
  return 0;
    }