c++ - OpenMP C++ 并行性能优于八核集群的双核笔记本电脑

标签 c++ openmp

首先,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 之前的版本循环崩溃不起作用。这可能是问题所在吗?

最佳答案

gcc 直到 4.2 才支持 OpenMP , 从 gcc 4.4 开始支持 OpenMP 3.0 .您的操作系统供应商可能已将更改移植回 4.1.2。

关于c++ - OpenMP C++ 并行性能优于八核集群的双核笔记本电脑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6168638/

相关文章:

OpenCV TBB IPP OpenMP 函数

c++ - 可变参数模板,获取函数参数值

c++ - 在 std::uint8_t 中移位

c++ - 错误 : no matching function for call to

C 和 OpenMP : pointer to shared read-only data slows down execution

module - 为什么在模块中声明常量时 omp 函数不起作用?

c++ - 在 OSX 上打开 SDL 窗口时不要打开终端窗口

c++ - '[' token c++ 之前的预期不合格 ID

c++ - 使用和不使用 fopenmp 标志编译 C++ 代码

matlab - 为什么 OpenMP 在 mex 文件中只产生 1 个线程?