[英]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 -= expr
或var = var - expr
表達式相結合。 因此,您的程序不符合標准,因為您沒有閱讀OpenMP的復雜細節,您將得到您應得的。
reduction(-:a)
的正確例子是:
#pragma omp parallel reduction(-:a)
{
a -= omp_get_thread_num() + 1;
}
使用-
減少總是很棘手,因為減法運算符的非交換性...你最好添加所有內容然后否定結果; 任何閱讀代碼的人都可以清楚地閱讀標准!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.