2011-10-23 112 views
5

我有一個#pragma omp parallel for循環內的類方法。每個線程只讀訪問少數方法局部變量,很少調用私有數據和一個方法的參數。所有這些都在shared條款中聲明。 我的問題:OpenMP共享與firstprivate performancewise

  • 性能方面不應有任何區別聲明這些 變量sharedfirstprivate。對?
  • 如果我不小心使變量不共享相同的緩存行,是否也是如此?
  • 如果其中一個共享變量是一個指針,並且在線程內部,我通過它讀取一個值,是否有像普通循環中的別名問題?

明天我會嘗試剖析我的代碼。同時感謝您的建議!

回答

9
  1. 嗯,它們不是一回事。通過shared,它們在所有線程之間共享。通過firstprivate,每個線程都獲得它自己的副本。如果只讀取變量,則最好將其保存爲shared以避免複製它。 (在C++中,firstprivate將隱式調用複製構造函數。)

  2. 正確地說,多線程讀取和寫入坐在同一緩存行上的值稱爲false sharing。高速緩存行將在訪問它的核心之間來回反彈 - 如果經常發生,可能會導致顯着的減速。

  3. 如果您只是通過共享指針讀取數據,那麼應該沒有問題。但是如果你也寫信給它,那麼你需要確保你沒有競爭狀態。