2012-11-19 54 views
2

關於性能,假設我們得到一個將被每個線程頻繁訪問的數據塊,並且這些數據是隻讀的,這意味着除讀取數據外,線程不會執行任何操作。共享內存多線程和數據訪問?

那麼是否有利於爲每個線程創建這些數據的一個副本(假設數據在那裏只讀)?

如果所有線程共享頻繁訪問的數據(而不是每個線程的一個副本),這是否會增加這些數據得到正確緩存的機會?

+0

1.關於創建一個副本是的,這是好的策略 2.如果頻繁訪問的數據被所有線程共享,它不會幫助緩存 –

+0

如果數據是隻讀的,那麼它將被正確緩存,即使共享。如果數據正在被修改,高速緩存一致性協議將會啓動。注意錯誤共享,即寫入與共享只讀部分相同的高速緩存行中的數據。 –

回答

8

只讀數據的一個副本每個線程不會幫你緩存;恰恰相反,當線程在同一個多核(可能是超線程)CPU上執行並共享其緩存時,它可能會傷害,因爲在這種情況下,數據的每個線程副本可能會爭奪有限的緩存空間。但是,在多CPU系統的情況下,實際上所有這些系統都是當今的NUMA,通常具有每CPU存儲體在「本地」和「遠程」存儲器之間存取成本有所不同的情況下,這可能是有益的有一個每個CPU副本的只讀數據,放置在它的本地內存中。內存映射是由操作系統控制的,所以如果你走這條路,研究操作系統的NUMA相關行爲是有意義的。例如,Linux使用第一次觸摸內存分配策略,這意味着內存映射不會發生在malloc,而是程序第一次訪問內存頁時,OS嘗試從本地庫中分配物理內存。

而通常的表現格言適用:措施,不要猜測。

+0

很好的答案,我特別喜歡最後一部分:「測量不要猜測」。 – Brady

+0

感謝您的輸入,我測試了算法(需要相當多的時間才能獲得適當的非平凡測試),實際上似乎one-copy-one-thread方法實際上比單份副本共享更快所有線程的方法,至少是我的情況下,一個CPU和多核心。 – user0002128