[英]Parallelizing two for loops with OpenMP in C++ does not give better performance
我在使用C ++中的OpenMP並行化兩個for循環時遇到問題。 我有一個成員函數CallFunction(i,j),它為每個i和j獨立成員變量設置一個特定值,並返回該值的加權和。 因為這些函數對於i和j的不同組合是獨立的,所以我想並行化此過程。 我以以下方式嘗試了它:
double optimal_value = 0;
#pragma omp parallel for reduction(+:optimal_value)
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if(i == j) continue;
optimal_value += CallFunction(i,j);
}
}
上面的代碼對我的運行時沒有重大影響。 無論有沒有“ #pragma omp parallel for”,我都能實現幾乎相同的運行時。 將嵌套循環編寫為一個循環並並行化會更好嗎? 我必須知道如何使其工作。 除了激活的openmp之外,是否還需要其他命令或設置?
我的系統使用雙核CPU運行。
您能幫我正確的做法嗎?
提前謝謝了!
這是兩個循環的並行化
double optimal_value = 0;
double begin = omp_get_wtime();
#pragma omp parallel for reduction(+:optimal_value)
for (int i = 0; i < n; i++)
{
num_tr = omp_get_num_threads();
double optimal_value_in = 0.0;
#pragma omp parallel for reduction(+:optimal_value_in)
for (int j = 0; j < n; j++)
{
if((i == j)) continue;
optimal_value_in += CallFunction(i,j);
}
optimal_value += optimal_value_in;
}
double end = omp_get_wtime();
double elapsed_secs = double(end - begin);
cout<<"############# "<<"Using #Threads "<<num_tr<<endl;
cout<<"############# "<<optimal_value<<" Time For Parallel Execution :: "<<elapsed_secs<<endl;
這里的事情是(在上面的其他評論中也提到過)...我不確定您是否會看到CallFunction的主體將n=25
加速一些
double CallFunction(int i, int j){
return i*j;
}
在n=250000
和8個線程的情況下,我的速度提高了4.43
因此它在很大程度上取決於CallFunction中執行的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.