簡體   English   中英

操作員“ - ”的Openmp減少

[英]Openmp Reduction for operator “-”

int main()
{
    int a=0;
    omp_set_num_threads(2);
    #pragma omp parallel reduction(+ : a)
    {
        a = omp_get_thread_num()+1;
    }
    std::cout << "Output:" << a;
    return 1;
}

我使用openmp減少輸出錯誤...對於下面的代碼,減少(+)給出threadnum()的總和的輸出,但是當我提到減少( - )時,它給出相同的輸出......我得到了輸出為“+”和“ - ”為3。

OpenMP函數的減少如下:每個線程都有減少變量的本地副本,而+=-=會影響本地副本。 然后在最后執行以下減少操作:

a = init_value op a_0 op a_1 op a_2 op ... op a_(N-1)

其中N是線程數, init_value是還原操作的初始化值。 +-還原操作的初始化值為0(零)。 雖然減法有一個問題,但它在OpenMP標准中作為對最終值形成方式的評論(§2.9.3.6 reduction條款)進行了解釋:

(添加減法的部分結果以形成最終值。)

這意味着通過reduction(-:a)您仍然可以將所有私有值相加,即+-減少相等。 這是實現它的正確方法,因為假設- reduction只與var -= exprvar = var - expr表達式相結合。 因此,您的程序不符合標准,因為您沒有閱讀OpenMP的復雜細節,您將得到您應得的。

reduction(-:a)的正確例子是:

#pragma omp parallel reduction(-:a)
{
    a -= omp_get_thread_num() + 1;
}

使用-減少總是很棘手,因為減法運算符的非交換性...你最好添加所有內容然后否定結果; 任何閱讀代碼的人都可以清楚地閱讀標准!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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