2017-07-06 45 views
1

如果我有一個OpenMP並行化的C++程序,其中不同的線程不斷地使用一些小的共享數組,只爲讀取數據,在這種情況下會發生錯誤共享嗎?換句話說,錯誤共享只涉及內存寫入操作,或者也可能發生在內存讀取操作中。在openmp中讀取數據時是否發生錯誤共享?

+0

afaik錯誤分享是關於不必更改數據的不必要的重新加載,因爲它與確實發生更改的數據在同一頁面上。如果什麼都沒有寫,那麼就沒有必要重新加載任何東西,因此沒有虛假的共享 – user463035818

+0

在這裏看到:https://en.wikipedia.org/wiki/False_sharing – user463035818

+0

我想到了假分享的情況下,當幾個線程工作使用相同的緩存行,處理器必須同步它們才能維持一致性,如此處所述http://www.drdobbs.com/architecture-and-design/sharing-is-the-root-of-all-contention/214100002 –

回答

2

通常使用的緩存一致性協議(如MESI(修改,排他,共享,無效))對稱爲「共享」的緩存行具有特定狀態。如果多個處理器讀取高速緩存行,則處於這種狀態。每個處理器都有一個高速緩存行的副本,並且可以安全地從中讀取,而不會發生虛假共享。在寫入時,通知所有處理器使作爲虛假共享的主要原因的緩存線無效

+0

這是否意味着如果爲每個線程創建此數組的本地副本,那麼將不會有性能增益? –

+1

這取決於實際的底層硬件,但我認爲不會有性能提升。我建議寫一個微基準 – max

+1

我想過了一點。由於緩存使用率更高,複製數據可能會更糟糕。大多數情況下,只有小型一級緩存是核心私有的。通過包含緩存,您可以在更高級別的緩存中獲得冗餘數據。 – max

3

虛假共享是一個性能問題,因爲它會導致需要時間的緩存行的額外移動。當兩個並不真正共享的變量駐留在同一行中並且單獨的線程更新每個變量時,線必須在機器周圍反彈,這會增加每個訪問的延遲。在這種情況下,如果變量位於不同的行中,則每個線程將保留「其」行的本地修改副本,並且不需要數據移動。

但是,如果您沒有更新某行,則不需要進行數據移動,並且分享對性能沒有影響,除了您可能已經能夠獲得每個線程確實需要的數據,而不是它沒有的數據。這是一個小的,次要的效果。雖然。所以除非你知道你的緩存容量有限,否則忽略它!

相關問題