带有本地 mpi 安装的 Vampir

Vampir with local mpi installation

我在 Vampir 集群上工作,用于可视化 mpi 通信。因为集群缺少 MPI3 实现,所以我在我的主目录中安装了 OpenMPI 2.0.0(除了 --prefix 之外没有使用其他标志)(没有 Vampir 也能正常工作)。现在我不知道如何正确地将我的本地 MPI3 安装与 Vampir 结合起来来构建我的程序 (fetchAndOpTest.f90)。我尝试了以下方法:

vtf90 -vt:fc ~/OpenMPI2/bin/mpif90 -o fetchAndOpTestF90.x fetchAndOpTest.f90

(不知道它是否重要,但这给出了以下警告:/usr/bin/ld: warning: libmpi.so.1, needed by /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/libmpi_f77.so, may conflict with libmpi.so.20

使用 ~/OpenMPI2/bin/mpirun -np 2 fetchAndOpTestF90.x 执行我的程序会导致: fetchAndOpTestF90.x: error while loading shared libraries: libvt-mpi.so.0: cannot open shared object file: No such file or directory [...]

因此我也尝试了vtf90 -vt:fc ~/OpenMPI2/bin/mpif90 -L/opt/vampirtrace/5.14.4/lib -o fetchAndOpTestF90.x fetchAndOpTest.f90,但它并没有改变ldd输出。

编辑:根据@Harald 的建议编辑LD_LIBRARY_PATH。

> ldd fetchAndOpTestF90.x linux-vdso.so.1 => (0x00007ffc6ada9000) libmpi_f77.so.1 => /usr/lib/libmpi_f77.so.1 (0x00007ff8fdf2e000) libvt-mpi.so.0 => /opt/vampirtrace/5.14.4/lib/libvt-mpi.so.0 (0x00007ff8fdca3000) libvt-mpi-unify.so.0 => /opt/vampirtrace/5.14.4/lib/libvt-mpi-unify.so.0 (0x00007ff8fda18000) libotfaux.so.0 => /opt/vampirtrace/5.14.4/lib/libotfaux.so.0 (0x00007ff8fd810000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007ff8fd50c000) libopen-trace-format.so.1 => /opt/vampirtrace/5.14.4/lib/libopen-trace-format.so.1 (0x00007ff8fd2c4000) libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007ff8fd0ab000) libpapi.so.5.3 => /usr/lib/x86_64-linux-gnu/libpapi.so.5.3 (0x00007ff8fce57000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007ff8fcc53000) libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007ff8fc939000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007ff8fc633000) libmpi_usempi.so.20 => /home/USER/OpenMPI2/lib/libmpi_usempi.so.20 (0x00007ff8fc430000) libmpi_mpifh.so.20 => /home/USER/OpenMPI2/lib/libmpi_mpifh.so.20 (0x00007ff8fc1df000) libmpi.so.20 => /home/USER/OpenMPI2/lib/libmpi.so.20 (0x00007ff8fbefb000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007ff8fbce5000) libquadmath.so.0 => /usr/lib/x86_64-linux-gnu/libquadmath.so.0 (0x00007ff8fbaa9000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007ff8fb88b000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007ff8fb4c6000) libmpi.so.1 => /usr/lib/libmpi.so.1 (0x00007ff8fb145000) /lib64/ld-linux-x86-64.so.2 (0x00007ff8fe162000) libpfm.so.4 => /usr/lib/x86_64-linux-gnu/libpfm.so.4 (0x00007ff8fadff000) libopen-pal.so.20 => /home/USER/OpenMPI2/lib/libopen-pal.so.20 (0x00007ff8fab09000) libopen-rte.so.20 => /home/USER/OpenMPI2/lib/libopen-rte.so.20 (0x00007ff8fa887000) libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007ff8fa684000) libhwloc.so.5 => /usr/lib/x86_64-linux-gnu/libhwloc.so.5 (0x00007ff8fa43b000) libltdl.so.7 => /usr/lib/x86_64-linux-gnu/libltdl.so.7 (0x00007ff8fa231000) libnuma.so.1 => /usr/lib/x86_64-linux-gnu/libnuma.so.1 (0x00007ff8fa026000) libpciaccess.so.0 => /usr/lib/x86_64-linux-gnu/libpciaccess.so.0 (0x00007ff8f9e1d000) librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007ff8f9c15000)

现在执行会抛出错误:mpirun noticed that process rank 0 with PID 0 on node cluster exited on signal 11 (Segmentation fault)(程序是正确的,并且在没有 Vampir 的情况下使用本地 MPI3 安装构建和执行运行良好)

这个问题似乎可以通过不同的替代方法来找到库来解决:

  1. 静态 link 应用程序(即在 link 时使用 -static 标志)。
  2. ${HOME}/OpenMPI2/lib(或 /opt/vampirtrace/5.14.4/lib?)添加到 运行 二进制文件之前的 LD_LIBRARY_PATH 环境变量中,因为您的 MPI 安装就在那里。
  3. 在 link 二进制文件时使用 -rpath 以便 linker 自动搜索给定的目录。您可以使用 -Wl,-rpath -Wl,${HOME}/OpenMPI2/lib(或 /opt/vampirtrace/5.14.4/lib?)

编辑 请注意,您指出您安装了 vampirtrace (/opt/vampirtrace/5.14.4),但它太旧了(请参阅 this) compared to OpenMPI 2.0 (see that)——两者之间大约有 3 年的差异。这些年来,OpenMPI 发生了很大变化,尤其是在 2.0 版中。这也可能与您观察到的警告有关——即版本差异。此外,这是关于这个问题的坏消息,从上一个网站 link 你会注意到 OpenMPI 中的 vampirtrace 嵌入式包已被删除。

恕我直言,您最好的选择是尝试 vampirtrace 的继任者(名为 Score-P),它也会生成 Vampir 跟踪文件。由于 OpenMPI 2.0 是最新的,您可能需要尝试使用 Score-P 的 RC。

你的 VampirTrace 库是针对其他一些系统范围的 MPI 实现编译的,并通过依赖拉入它的 DSO:

--> libmpi_f77.so.1 => /usr/lib/libmpi_f77.so.1 (0x00007ff8fdf2e000)
libmpi_usempi.so.20 => /home/USER/OpenMPI2/lib/libmpi_usempi.so.20 (0x00007ff8fc430000)
libmpi_mpifh.so.20 => /home/USER/OpenMPI2/lib/libmpi_mpifh.so.20 (0x00007ff8fc1df000)
libmpi.so.20 => /home/USER/OpenMPI2/lib/libmpi.so.20 (0x00007ff8fbefb000)
--> libmpi.so.1 => /usr/lib/libmpi.so.1 (0x00007ff8fb145000)
libopen-pal.so.20 => /home/USER/OpenMPI2/lib/libopen-pal.so.20 (0x00007ff8fab09000)
libopen-rte.so.20 => /home/USER/OpenMPI2/lib/libopen-rte.so.20 (0x00007ff8fa887000)

VampirTrace 使用的 PMPI_* 符号可能被系统范围的 MPI 库解析,因此 PMPI 机制的参数传递失败。由于 VampirTrace 是一个开源项目(不像 Vampir,后者是闭源商业工具),您可以从 the official site 下载它并使用您自己的 Open MPI 构建编译它。但这对您的情况没有帮助,因为 VampirTtrace 对新的 MPI-3 RMA 调用一无所知并且不会跟踪它们(它们很可能在跟踪中显示为用户函数)。

如前所述,改用 Score-P。发布版本 2.0.2 支持整个 MPI-3.1 调用集合。