我是用 OpenMPI 还是 MPICH 编译的?

Posted

技术标签:

【中文标题】我是用 OpenMPI 还是 MPICH 编译的?【英文标题】:Did I compile with OpenMPI or MPICH? 【发布时间】:2013-03-15 04:40:20 【问题描述】:

我的 Linux 机器上有一个可执行文件,我知道它是用 OpenMPIMPICH 库编译的。

问题:如何确定是哪一个?

【问题讨论】:

【参考方案1】:

以下诊断程序假定 MPICH/MPICH2 和 Open MPI 是 您可能已链接的唯一可能的 MPI 实现。其他 (尤其是商业)MPI 实现确实存在并且可能有不同的 库名称和/或库符号。

首先判断你是否动态链接:

% ldd my_executable
        linux-vdso.so.1 =>  (0x00007ffff972c000)
        libm.so.6 => /lib/libm.so.6 (0x00007f1f3c6cd000)
        librt.so.1 => /lib/librt.so.1 (0x00007f1f3c4c5000)
        libpthread.so.0 => /lib/libpthread.so.0 (0x00007f1f3c2a7000)
        libc.so.6 => /lib/libc.so.6 (0x00007f1f3bf21000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1f3c969000)

如果您在该列表中看到libmpich.so,那么您已经动态链接到 MPICH(或 MPICH2)。如果你看到libmpi.so,那么你已经链接到 Open MPI。

如果两者都不存在,那么您可能只是静态链接。在这种情况下 我们需要检查二进制文件以寻找区别符号:

% ( nm my_executable | grep MPIR_Free_contextid >/dev/null ) && echo "MPICH"
% ( nm my_executable | grep ompi_comm_set_name >/dev/null ) && echo "Open MPI"

【讨论】:

【参考方案2】:

开放式 MPI 应用程序对可以在环境变量中传递的 MCA 参数做出反应。只需在单例模式下运行可执行文件(即没有mpirun/mpiexec),将sysinfo_base_verbose 设置为30:

$ OMPI_MCA_sysinfo_base_verbose=30 ./program

如果你得到如下输出:

[hostname:pid] mca: base: components_open: Looking for sysinfo components

那么这不仅仅是可执行文件使用 Open MPI 的可靠指示。

【讨论】:

以上是关于我是用 OpenMPI 还是 MPICH 编译的?的主要内容,如果未能解决你的问题,请参考以下文章

Linux MPI 单机配置

设置代码块以运行 MPICH2

MPICH2 gethostbyname 失败

Environment Modules 简明教程

单机使用docker部署多个容器并行openmpi

源代码搭建应用——动手搭建自己的计算集群系统