我在我的 Linux 机器上有一个可执行文件,我知道它已经用OpenMPI
或MPICH
库编译过。
问题:如何确定是哪一个?
以下诊断过程假定 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"
开放式 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 的有力指示。