【发布时间】:2011-07-25 21:26:30
【问题描述】:
我提前道歉,我没有完全正确的行话来描述我的问题,而且我可能没有提供足够的信息。
几个月来,我一直在 gcc 4.4 和 OpenMPI/MPICH2 下运行我的 MPI 代码,在各种平台上都没有问题。最近,我将一组服务器和我的桌面升级到 Ubuntu 11.04(现在运行 gcc 4.5),并在具有 8 个处理器的节点上运行了 8 个任务作业。通常,我看到几乎 100% 的用户 CPU 利用率,而现在我只看到 60% 的用户 CPU 和超过 30% 的系统 CPU。当以这种方式运行时,这会导致我的代码显着变慢。
进一步调查,我只是运行了一个串行作业,并注意到该进程报告 150+% 的 cpu 时间正在使用。因此,我的程序在许多处理器上进行了多线程处理。我使用“ps -eLF”明确验证了这一点,并查看了每个处理器的负载。
这对于我的 MPI 代码来说是一件非常糟糕和低效的事情,我不知道它是从哪里来的。除了迁移到 Ubuntu 11.04 和 gcc 4.5 之外,没有任何变化。我已经针对不同的 OpenMPI 版本验证了这一点。
我还在两台二进制兼容的机器之间移动了二进制文件。如果我在另一台机器(ubuntu 10.10/gcc 4.4)上编译并在那里运行,一切都很好。将二进制文件移至 Ubuntu 11.04 机器,相同的二进制文件开始自行处理。
值得注意的是,我已明确禁用所有优化 (-O0),认为我的默认 (-O3) 可能包含我在 4.5 中不理解的内容。无论优化级别如何,我都会得到相同的行为。
请让我知道我可以提供哪些进一步的信息来确定问题的根源。
* 附加信息 *
ldd 响应请求的结果。简单地说,就是 OpenMPI、libconfig 和 scalapack,以及标准 gcc 的东西:
linux-vdso.so.1 => (0x00007ffffd95d000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f2bd206a000)
libconfig.so.8 => /usr/lib/libconfig.so.8 (0x00007f2bd1e60000)
libscalapack-openmpi.so.1 => /usr/lib/libscalapack-openmpi.so.1 (0x00007f2bd151c000)
libmpi.so.0 => /usr/lib/libmpi.so.0 (0x00007f2bd126b000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f2bd0ed7000)
libblacsCinit-openmpi.so.1 => /usr/lib/libblacsCinit-openmpi.so.1 (0x00007f2bd0cd4000)
libblacs-openmpi.so.1 => /usr/lib/libblacs-openmpi.so.1 (0x00007f2bd0aa4000)
libblas.so.3gf => /usr/lib/libblas.so.3gf (0x00007f2bd022f000)
liblapack.so.3gf => /usr/lib/liblapack.so.3gf (0x00007f2bcf639000)
libmpi_f77.so.0 => /usr/lib/libmpi_f77.so.0 (0x00007f2bcf406000)
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3 (0x00007f2bcf122000)
libopen-rte.so.0 => /usr/lib/libopen-rte.so.0 (0x00007f2bceed3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f2bcecb5000)
/lib64/ld-linux-x86-64.so.2 (0x00007f2bd22fc000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f2bcea9f000)
libopen-pal.so.0 => /usr/lib/libopen-pal.so.0 (0x00007f2bce847000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f2bce643000)
libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f2bce43f000)
一切顺利。
【问题讨论】:
-
你的代码使用了哪些库?你能显示
ldd your_programme序列版的结果吗? -
当然。它是 MPI、libconfig 和 scalapack。我已将 ldd 的结果添加到主帖中。我从 apt 存储库中使用了这些库中的每一个,并在两个平台(好的 4.4 和坏的 4.5 平台)上自定义构建它们。这种行为似乎没有任何改变。
-
我意识到结果是针对并行版本的。我从来没有构建一个串行版本,MPI 是内置的。你会注意到那里有很多其他的东西,我最关心的是 libpthread,即使我的 makefile 从来没有明确地链接那个库,所以我应该看看像这样的东西是从哪里来的.但是,如果我使用这些库在 gcc 4.5 中编译的这个二进制文件,并在二进制兼容的 ubuntu 10.10 安装上运行它,一切都会按预期执行。都具有相同的库。这真的很奇怪。
-
尝试做一个奇数版本的
strace -f甚至是 ltrace -S -
好吧,我通过启用和禁用我的代码的各种子系统进行了很多详尽的测试,现在很明显问题出在 ubuntu 在 11.04 中构建的 scalapack 库中,看起来与在 10.10 中,为该库的 MPI 构建做了一些非常古怪的事情。它的表现就像它具有 PVM/共享内存支持一样。这是 ubuntu 11.04 中构建的一个严重错误。关键是你的 ltrace,在调用 scalapack 函数后,我发现很多对 SYS_clone 的调用。
标签: c gcc compiler-construction mpi