簡體   English   中英

多個OpenMP線程讀取(不寫入)共享變量的性能成本?

[英]Performance cost to multiple OpenMP threads reading (not writing) a shared variable?

在OpenMP(我使用的是C ++)中,如果您有一個共享(甚至全局)變量被多個線程重復讀取(而不是寫入),會不會降低性能? 我知道,如果他們正在寫變量,這將是不正確的。 我只問只讀問題-如果多個線程重復讀取同一個變量,是否會有潛在的性能成本?

如果該變量(更精確的內存位置)僅由所有線程讀取,則從正確性和性能方面來說,您基本上都可以。 緩存協議具有“共享”狀態-因此該值可以緩存在多個內核上。

但是,您還應該避免將數據寫入變量所在的同一緩存行,因為這會使其他內核的緩存無效。 同樣在NUMA系統上,您還必須考慮讀取某些內核/線程的某些內存區域可能更昂貴。

如果您只是閱讀,那么就沒有安全問題。 一切都會正常。 根據定義,您沒有競賽條件 您無需進行任何鎖定,因此不會發生高爭用問題。 您可以使用Clang ThreadSanitizer在運行時測試線程安全性。

另一方面,還有一些性能問題需要注意。 通過使每個線程(最好是所有線程)一次訪問一堆在內存中連續的數據,來避免錯誤共享 這樣,當CPU緩存加載數據時,不需要每次都訪問多次內存。 與訪問CPU緩存相比,訪問內存被認為非常昂貴(至少要慢幾百倍)。

祝好運!

暫無
暫無

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

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