【问题标题】:Can someone explain this valgrind error with open mpi?有人可以用 open mpi 解释这个 valgrind 错误吗?
【发布时间】:2012-06-28 09:41:33
【问题描述】:

我的基本问题是关于抑制文件如何在 valgrind 中工作。我查看了很多文档,这些文档指出在 mpi 版本 > 1.5(我的是 1.6)上使用以下内容:

    mpirun -np 2 valgrind --suppressions=/usr/share/openmpi/openmpi-valgrind.supp --track-origins=yes ./myprog

但是,当我这样运行它时,文件有超过 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;
    }

此外,此代码运行良好并输出预期结果。我是否误解了数据是如何通过网络发送的,还是这里发生了我不明白的其他事情?

抱歉这篇文章太长了,你们读到这么远都很开心。

【问题讨论】:

  • 当代码采用 myid==0 路径或“else”路径时是否会出现 valgrind 错误,还是两种情况都会出现?
  • 另外,您没有检查 MPI_Recv() 调用(或“状态”变量)的返回值来查看 MPI_Recv() 是否成功。因此,可能是 MPI_Recv() 由于某种原因失败,因此没有将任何数据写入 (c) 数组,这将导致您的 printf() 调用中出现未初始化的内存读取错误,然后发生。只是猜测。
  • @JeremyFriesner,没有必要测试返回值,除非更改了通信器的错误处理程序。如果操作返回 MPI_SUCCESS 以外的内容(但对 MPI I/O 操作无效),默认的标准错误处理程序会中止应用程序。
  • 这不是一个适合 SO 的问题。似乎 Valgrind 在 Open MPI 的 OPAL 库中检测到了某些东西(可能是误报)。如果您认为这是一个错误,您应该将问题提交给 Open MPI users list 或在他们的 trac system 中打开票证。此外,它发生在PMPI_Init 的深处,它实现了MPI_Init() 操作。它与您的其余代码无关。

标签: c++ memory-management memory-leaks valgrind openmpi


【解决方案1】:

很有可能我们的抑制文件在 OMPI v1.6 中不是最新的。 :-\

您应该在 OMPI 邮件列表中报告此问题。见http://www.open-mpi.org/community/lists/ompi.php

【讨论】:

  • 还能这样吗?我必须生成一个更全面的抑制文件来抑制所有错误,即使在最小的 mpi 程序中(初始化然后完成)。
猜你喜欢
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多