2010-05-24 64 views
0

我有這樣一個程序塊:同步構造內部編譯爲

for (iIndex1=0; iIndex1 < iSize; iIndex1++) 
    { 
     for (iIndex2=iIndex1+1; iIndex2 < iSize; iIndex2++) 
     { 
      iCount++; 
      fDist =(*this)[iIndex1].distance((*this)[iIndex2]); 
      m_oPDF.addPairDistance(fDist); 

      if ((bShowProgress) && (iCount % 1000000 == 0)) 
       xyz_exception::ui()->progress(iCount, (size()-1)*((size()-1))/2); 

     } 
    } 
} 
} 

我試圖parallelising內外環和通過將在ICOUNT關鍵區域。平行於此的最佳方法是什麼?如果我用omp single或omp原子打包iCount,那麼代碼會給出一個錯誤,我發現這在omp內部是無效的。我想我正在添加許多無關的東西來對此進行合併。需要一些建議...

感謝,

薩彥

回答

1

如果我正確地解釋你的意圖,你想用ICOUNT告訴時(每10^6次操作),程序更新UI?而iCount是全球性的,所有的主題都是分享價值,並且你想保持其一致性?

我會尋找一種方法來用每個線程專用的計數器替換這個全局計數器,並讓線程發送消息來獨立更新UI。如果你堅持使用全局計數器,你將不得不以某種方式跨線程進行同步,這將成爲一個性能問題。是的,你可以用這種方式編寫你的程序,但我不推薦它。

如果你不喜歡所有線程發送消息到用戶界面的想法,也許只有一個線程可以做到這一點;如果一個線程是程序的四分之一,其他線程(大約)也是如此。

0

再次感謝馬克。我嘗試了你所建議的方法。我已經把還原(+:iCount),並試圖圍繞編譯指示圍繞iCount ++關鍵,是的,它是一個性能打擊(也沒有看到加速)。另外,我讓一個線程處理iCount,但是我做出的方法沒有加速。

我預計如果我在內部循環周圍放置一個編譯指示,並將iCount聲明爲還原變量,我會注意到至少有一些加速。我的目標是針對Index1,Index2對的這些語句的並行執行:

 fDist =(*this)[iIndex1].distance((*this)[iIndex2]); 
     m_oPDF.addPairDistance(fDist); 

這會明顯影響程序運行時間。

+0

我建議你做的是忘掉ICOUNT了一會兒,parallelise你的最外層循環,並得到一些加速。完成之後,您可以嘗試實施櫃檯的方法並檢查其對加速的影響。現在,我認爲當您使用OpenMP的經驗表明您應該採取小步驟時,您正在嘗試採取巨大的措施。 – 2010-05-26 08:48:15

0

非常感謝馬克。我刪除了iCount並使外部循環並行,但是我正在挖這些代碼,因爲與串行版本相比,我仍然沒有加速。

我想借此機會得到一個基本事實澄清......在嵌套循環的環境,就像上面......哪一個可能是普遍較好:

  1. 使環路平行的內

    編譯OMP平行
    爲(...我...)
    編譯OMP對於
    爲(...,J ...)

  2. 使外環平行,(只是...在外環之前的平行於...的編譯指示)

  3. 使用摺疊(用於Omp 3。0)

感謝
薩彥