2

运行 valgrind 以检测 mpi 应用程序中的错误时,我收到以下错误:

libmpi.so.0: cannot open shared object file: No such file or directory

我发现了以下内容: Valgrind 文档(第 4.9.1 节)指出“假定要包装的 MPI 函数位于与 soname 匹配 libmpi.so* 的 ELF 共享对象中。这至少对于 Open 来说是正确的MPI 和 Quadrics MPI,可以根据需要轻松更改。”

因此,由于我使用的是 mpich2,它实际上应该使用 libmpich.so.1.0。

这可以在 libmpiwrap.c 中看到:

#include "mpi.h"

/* Where are API symbols?
Open MPI      lib/libmpi.so,   soname = libmpi.so.0
Quadrics MPI  lib/libmpi.so,   soname = libmpi.so.0
MPICH         libmpich.so.1.0, soname = libmpich.so.1.0

A suitable soname to match with is therefore "libmpi*.so*".

我的问题是:我在哪里以及如何配置它?

4

1 回答 1

1

我自己也遇到过这个问题。希望这可以为您指明正确的方向。不幸的是,众所周知,MPI 很难与 valgrind 和 gdb 一起使用。

选项 1:找到合适的包。

在 Fedora/RHEL/(基于 rpm)系统上,您可以在软件包中找到 OpenMPI 共享库valgrind-openmpi。我找不到 MPICH 版本。我使用 MVAPICH,所以这对我没有帮助。如果您找到 MPICH/MVAPICH 版本,请发表评论,以便我可以在此处添加。

PBone 将内容显示为具有 libmpiwrapper 共享对象。

选项 2:从源代码构建库。(我为 MVAPICH 做了什么)

我求助于从源代码编译 valgrind,然后复制共享库。我想保留包管理器的 valgrind 版本,所以我只是匹配源代码的版本并使用默认的 GCC 以确保安全。你或许可以使用最新最好的,但我怀疑你能得到多少。

在构建 Valgrind 时,您需要确保它找到正确的 MPI 安装。检查输出以验证正确的共享库和头文件。我有在一个系统上安装多个 MPI 的习惯,所以这是我很难学到的东西。花一些时间在 autoconf/automake 输出上。幸运的是,Valgrind 维护人员在保持构建非常简单方面做得很好,所以我在编译时没有遇到任何重大问题。

源代码 http://valgrind.org/downloads/

拥有它后,关键是设置文档中提到的 env 变量。

附加说明 - https://wiki.mpich.org/mpich/index.php/Support_for_Debugging_Memory_Allocation - https://fs.hlrs.de/projects/marmot/publications/paralleldebugging-ppt.pdf

于 2015-10-18T17:37:54.393 回答