我正在尝试在 Linux 下安装完全支持 MPI
的 Valgrind
。根据 Valgrind documentation 。我应该使用已安装的 MPI
进行编译,但根据 MPICH和 OpenMPI文档,我应该使用已安装的 Valgrind
进行编译。这很令人困惑,那么我应该先安装哪个?
最佳答案
这里不存在循环依赖。相反,您面临两种不同的方法,将 Valgrind 客户端请求放置在不同的位置。
可以使用 OMPI 特定的 Valgrind 支持来构建开放 MPI。这与构建具有 MPI 支持的 Memchecker 不同,因为它还允许检查 OMPI 内部结构(这就是为什么它还要求您在 OMPI 中启用调试)。 Memchecker 客户端请求以非常特定于 OMPI 的方式成为库代码的一部分。这不需要更改 Valgrind 代码,即它应该适用于任何 Valgrind 安装(假设满足最低版本要求)
另一方面,Open MPI 以及任何其他 MPI 实现都提供 PMPI
分析接口(interface)。 Memchecker 可以使用它来提供通用 MPI 支持。如文档中所述,Memchecker 构建了一个函数库来替换(并包装)原始 MPI 调用(这就是 PMPI
机制的工作原理 - 所有 MPI_*
调用都是弱符号并且可以被同名的其他符号覆盖,真正的 MPI 调用实际上是 PMPI_*
和 MPI_*
在 ELF 系统上被定义为弱别名)。这不需要更改 MPI 库代码。它应该适用于任何 MPI 实现,但只有用户内存才能正确调试,即可能会在 MPI 库代码内检测到误报(尽管这些不一定是误报,并且可能意味着库本身有错误)。
MPICH 中的 Valgrind 支持也是如此。
关于编译具有 MPI 支持的 Valgrind,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14824242/