我有以下部分的代碼,我運行它的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
你怎麼測量時間? – user463035818
不是一個答案,但我認爲你的if(jsd [i]> = maxval)屬於關鍵部分 – Shmoopy
你能花一點時間讓你的文章更有趣嗎? –