簡體   English   中英

Openmp 並行循環

[英]Openmp parallel loop

我想知道是否可以在下面的代碼中應用 openmp。 棘手的部分是 l 和 p。

    int l=0;
    for(j=0; j<len2;++j){
      if(pcons[imask ? j : p[j]] == 1){
        pans[imask ? j : p[j]] = pouts[(imask ? j : p[j]) & amask];
      } else {
        if(imask) pans[j]=pna;
        p[l++] = imask ? j : p[j];
      }
    }

如果您需要更多信息,請告訴我。 謝謝你。

這個簡短的回答是:不,不可能將 OpenMP 應用於此循環。

這是因為任何迭代中l的值取決於所有先前迭代中采用的代碼路徑,並且不能僅根據迭代次數( j的值)確定。 這會影響p中的哪個索引在條件的else分支中發生更改。

長答案仍然是不。

真正長的答案是可能的,如果正確的 OpenMP 子句集和關於存儲到p中的值排序的假設。 但是,鑒於這樣一個簡單的循環,它極不可能比單線程版本更快,並且無法確定它是否可以實際工作以及如果可以的話如何讓它這樣做。 所有寫入連續 memory 地址的線程都會導致大量緩存抖動、刷新和重新加載。

更大的幫助是將通用計算( imask? j: p[j] )存儲在每個循環開始時的局部變量中。

暫無
暫無

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

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