簡體   English   中英

這是 OpenMP firstprivate 的正確使用嗎?

[英]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 個循環。

  • 1 --> i = 0 到 24
  • 2 --> i = 25 到 49
  • 3 --> i = 50 到 74
  • 4 --> i = 75 到 99

這意味着每個步將重寫陣列的 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.

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