首先,OpenMP 显然只在集群中的一 block 主板上运行,在这种情况下,每 block 主板都有两个 2GHz 的四核至强 E5405 及其运行的 Scientific Linux 5.3(2009 年发布,基于 red hat)。另一方面,我的笔记本电脑有 core2duo T7300,频率为 2GHz,运行 Windows 7。两台机器都没有超线程。
主要问题是我的 OOP 代码通常在两个系统中串行运行大约 2 分钟,但是当我在嵌套循环中实现 OpenMP 时,它在我的笔记本电脑中的预期时间减少(当使用 2 个线程时)并且服务器时间显着增加(例如,两个线程大约 5 分钟)。
有两个类,“立方体”和“空间”。 Space 包含一个立方体的三维数组 (20x20x20),我试图并行化的代码是一个三向嵌套循环,它为每个立方体调用立方体的成员函数。此成员函数具有三个参数( double ),并根据每个多维数据集的私有(private)变量进行一些计算。
inline void space::cubes_refresh(const double vsx, const double vsy, const double vsz) {
int loopx, loopy, loopz;
#pragma omp parallel private(loopx, loopy, loopz)
{
#pragma omp for schedule(guided,1) nowait
for(loopx=0 ; loopx<cubes_w ; loopx++) {
for(loopy=0 ; loopy<cubes_h ; loopy++) {
for(loopz=0 ; loopz<cubes_d ; loopz++) {
// Refreshing the values in source
if ( (loopx==source_x)&&(loopy==source_y)&&(loopz==source_z) )
cube_array[loopx][loopy][loopz].refresh(0.0,0.0,vsz);
// refresh everything else
else
cube_array[loopx][loopy][loopz].refresh(0.0,0.0,0.0);
}
}
} // End of loop
}
我不知道问题出在哪里,正如我之前所说,在我的笔记本电脑中,我看到了预期的性能改进,但服务器中完全相同的代码却表现得更糟。 这些是我在笔记本电脑中使用的标志(曾尝试使用完全相同的标志,但没有尝试):
g++ -std=c++98 -fopenmp -O3 -Wl,--enable-auto-import -pedantic main.cpp -o parallel_openmp
在服务器中:
g++ -std=c++98 -fopenmp -O3 -W -pedantic main.cpp -o parallel_openmp
我正在运行 gcc 版本 4.5.0,服务器运行 4.1.2,我不知道服务器中的 OpenMP 版本,因为我不知道如何检查它,我认为是 3.0 之前的版本循环崩溃不起作用。这可能是问题所在吗?
最佳答案
关于c++ - OpenMP C++ 并行性能优于八核集群的双核笔记本电脑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6168638/