2016-04-27 31 views
-1

我有以下部分的代碼,我運行它的N = 3000的示例,C++的順序代碼更快了3秒,這是不好的。OpenMP代碼C++是比較慢的那個C++

這段代碼是用計算值填充數組jsd [N],我想定位最大值及其位置。 所以 1-是否這個openmp轉換正確,並有沒有更好的建議,使它更專業 2-爲什麼它是慢的,等價的C++代碼,也越多線程我創造得越慢。

在此先感謝

double maxval = 0; 
int pos = -1; 
double jsd[N]; 
#pragma omp parallel for num_threads(4) 
for (int i = 0; i < N; i++) { 
    double Hl = obj.function1(sequenceVctr, i, LEFT); 
    double Hr = obj.function1(sequenceVctr, i, RIGHT); 
    jsd[i] = obj.function2(H, i + 1, N, Hl, Hr); 

    if (jsd[i] >= maxval) { 
     #pragma omp critical 
     { 
     maxval = jsd[i]; 
     pos = i; 
     } 
    } 
} // for 

更新:

這裏是新代碼,但仍然緩慢,並在多個線程會變慢。 我更新代碼如下。但還是會變慢的多個線程

double maxval = 0; 
int pos = -1; 
double jsd[N]; 
#pragma omp parallel num_threads(50) 
for (int i = 0; i < N; i++) { 
    double Hl = obj.function1(sequenceVctr, i, LEFT); 
    double Hr = obj.function1(sequenceVctr, i, RIGHT); 
    jsd[i]= obj.function2(H, i + 1, N, Hl, Hr); 

} // for 
#pragma omp master 
{ 
    vector<double> jsd2 (jsd,jsd+N); 
    vector<double>::iterator jsditer; 
    jsditer = std::max_element(jsd2.begin(), jsd2.end()); 
    maxval=*jsditer; 
    pos=std::distance(jsd2.begin(),jsditer) ; 
// cout<<"pos"<<pos<<endl; 
} 
#pragma omp barrier 
+0

你怎麼測量時間? – user463035818

+0

不是一個答案,但我認爲你的if(jsd [i]> = maxval)屬於關鍵部分 – Shmoopy

+0

你能花一點時間讓你的文章更有趣嗎? –

回答

3

第一種優化,我建議是先計算迴路中的所有JSD值,然後通過std::max_element()找到最大元素。 這樣你就不會強制線程同步。

我要做的第二件事是轉移到英特爾TBB而不是OpenMP並使用parallel_reduce()

但是最大的問題是,您評估的目標函數有多複雜。

+2

您的第一段正是我所建議的。同步會嚴重限制多線程的好處 – vu1p3n0x

+0

函數1是減慢應用程序的速度,因爲它有一個哈希映射。但函數2也是計算 –

+0

也是。 std :: max_element()只適用於vecors,jsd是一個數組,當我想在並行代碼中插入(push_back)到vector中時,它會產生衝突。 –