簡體   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