![](/img/trans.png)
[英]openMP lastprivate and firstprivate to the same variable
[英]Is this the correct use of OpenMP firstprivate?
我需要並行化以下內容:
for(i=0; i<n/2; i++)
a[i] = a[i+1] + a[2*i]
並行輸出將與順序輸出不同,因為“讀取”值將被“重寫”。 為了獲得順序輸出,然后並行化,我想利用 firstprivate(a)。 因為 firstprivate 給了每個步驟一個副本。
讓我們想象一下 4 個線程和 100 個循環。
這意味着每個步將重寫陣列的 25%。
當並行區域結束時,所有線程“合並”。 這是否意味着您得到的 a 與按順序運行的結果相同?
#pragma omp parallel for firstprivate(a)
for(i=0; i<n/2; i++)
a[i] = a[i+1] + a[2*i]
題:
正如您所指出的,使用firstprivate
為每個線程復制數據並不能真正幫助您取回數據。
最簡單的解決方案實際上是將輸入和輸出分開並共享(默認)。
為了避免復制,最好在代碼中使用新變量而不是 b 。 或者,您可以只使用指針並交換它們。
int out[100];
#pragma omp parallel for
for(i=0; i<n/2; i++)
out[i] = a[i+1] + a[2*i]
// use out from here when you would have used a.
有沒有簡單的和通用的方式有傳抄a
為每個線程,然后再把它們合並。 lastprivate
只是復制從線程執行最后一次迭代和一個不完整的輸出數組reduction
不知道從哪個數組采取哪些元素。 即使是這樣,為每個線程復制整個數組也是一種浪費。 在這里共享輸入/輸出會更有效率。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.