繁体   English   中英

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

[英]OpenMP C++ parallel performance better dualcore laptop than eight cores cluster

首先,OpenMP 显然只在集群中的一个主板上运行,在这种情况下,每个主板都有两个 2GHz 的四核 Xeon E5405 及其运行的 Scientific Linux 5.3(2009 年发布,基于红帽)。 另一方面,我的笔记本电脑有 core2duo T7300,频率为 2GHz,运行 windows 7。两台机器都没有超线程。

主要问题是我的 OOP 代码通常在两个系统中串行运行大约 2 分钟,但是当我在嵌套循环中实现 OpenMP 时,它会在我的笔记本电脑中体验预期的时间减少(当使用 2 个线程时)和显着服务器中的时间增加(例如,两个线程大约需要 5 分钟)。

有两个类,“立方体”和“空间”。 空间包含多维数据集的三维数组 (20x20x20),我试图并行化的代码是一个三向嵌套循环,它为每个多维数据集调用多维数据集的成员 function。 这个成员 function 有三个 arguments (doubles),并根据每个立方体的私有变量进行一些计算。

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。

我能想到的唯一可能导致问题的是,由于某种原因,在服务器中访问多维数据集成员数组的所有线程都导致了很多缓存未命中,但这不会发生在我笔记本电脑上运行的程序中吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM