簡體   English   中英

使用C ++中的OpenMP並行處理兩個for循環不會提供更好的性能

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM