2015-05-21 105 views
1

我已經編寫了計算某個數字的C++代碼。我正在嘗試使用OpenMP庫對其進行並行化。它有3個嵌套循環,並行化的是外部循環。我使用G ++編譯器在Linux上工作。 代碼有效,但問題是並行化並未提高性能。在我的雙核筆記本電腦(關閉多線程的英特爾i5處理器)中使用2個線程啓動它,需要更多的時間用一個執行它。使用OpenMP並行化C++代碼不會提高性能

這是代碼(與推出:克++ source.cpp -fopenmp):

#include <time.h> 
clock_t tStart = clock(); 
#include <stdlib.h> 
#include <iostream> 
#include <iomanip> 
#include <omp.h> 
using namespace std; 

int nThreads= 2; // switch to change the number of threads. 

int main() { 
    int i, j, k, nz= 10; 
    double T= 1000, deltaT= 0.005, g= 9.80665, h=10, dz= h/nz, t, z, V, A; 
    int nT= T/deltaT; 

    #pragma omp parallel for private (j, k, t, z, V, A) num_threads(nThreads) 
    for (i=0; i<=nT; i++) { 
     t= i*deltaT; 
     for (j=0; j<=nz; ++j) { 
      z= dz*j; 
      for (k=0; k<=1000; k++) { 
       V= t*z*g*k; 
       A= z*g*k; 
      } 
     } 
    } 

    cout << "Time taken: " << setprecision(5) << (double)(clock() - tStart)/CLOCKS_PER_SEC << endl; 
    return 0; 
} 
+1

可能重複的[OpenMP時間和時鐘()計算兩個不同的結果](http://stackoverflow.com/questions/10673732/openmp-time-and-clock-calculates-two-different-results) –

+1

很難對這段代碼說些有意義的東西,如果你沒有得到0,你做錯了。沒有什麼可以並行化的,編譯器會刪除for循環,並簡單地計算V = nT * deltaT * dz * nz * g * 1000因爲這是所有需要的。 –

+0

你如何衡量執行時間?如果你測量CPU時間,你會得到什麼。 openmp會增加一些開銷,並且您所做的計算大體上與在一個cpu上進行的計算大體相同。你應該測量實時。 – user463035818

回答

1

好的,完美。我在測量CPU時間,結果是一致的。 time()函數爲我提供了我需要知道的數字。 問題解決了。感謝大家。