GCC 4.5/Ubuntu 11.04 是自动线程代码?

问题描述 投票:0回答:2

我提前道歉,我没有合适的术语来描述我的问题,而且我可能没有提供足够的信息。

我已经在 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)

祝一切顺利。

c gcc mpi
2个回答
1
投票

您是否可能遇到此功能? http://gcc.gnu.org/onlinedocs/libstdc++/manual/parallel_mode.html

基本上,某些标准库例程具有并行实现。但是,只有在定义了

_GLIBCXX_PARALLEL
宏时才会打开。


1
投票

看到60%/40%并不能说明什么,也许只是处理方式不同而已。这里唯一有趣的数字是比较代码总执行的挂钟时间。

另外,我认为(如果是这样的话)并行化的不是二进制文件本身,而是 MPI 库。要检查您不仅需要在另一台机器上编译代码,还需要静态链接它。只有这样,您才能确保在另一台计算机上运行所有方面完全相同的二进制代码。

然后,您也无法确定 MPI 库在幕后是否使用 C++。我记得要说服其中一个 MPI 库(不记得是哪个)不要针对 C++ 接口进行编译是相当困难的,即使您只使用 C。

© www.soinside.com 2019 - 2024. All rights reserved.