OpenMP C ++并行性能比八核集群更好的双核笔记本电脑

时间:2011-05-29 15:40:39

标签: c++ openmp

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

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

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

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

2 个答案:

答案 0 :(得分:0)

gcc在4.2之前不支持OpenMP,从gcc 4.4开始支持OpenMP 3.0。您的操作系统供应商可能已将更改移植回4.1.2。

答案 1 :(得分:0)

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