簡體   English   中英

以編程方式獲取 Linux 上的准確 CPU 緩存層次結構信息

[英]Programmatically get accurate CPU cache hierarchy information on Linux

我試圖准確描述 Linux 上當前 CPU 的數據緩存層次結構:不僅是單個 L1/L2/L3(可能還有 L4)數據緩存的大小,還有它們被拆分或共享的方式核心。

例如,在我的 CPU (AMD Ryzen Threadripper 3970X) 上,每個核心都有自己的 32 KB 一級數據緩存和 512 KB 二級緩存,但是 L3 緩存在核心復合體 (CCX) 內的核心之間共享。 換句話說,有 8 個不同的 L3 高速緩存,每個 16 MB。

Windows 上的 CPU-Z 屏幕截圖的“緩存”部分基本上是我想要找出的內容:

CPU-Z 截圖

使用GetLogicalProcessorInformation()獲取有關 Windows 的這些信息沒有問題。

但是,在 Linux 上,似乎sysconf()只給了我 L1 和 L2 數據緩存的每核緩存大小( _SC_LEVEL1_DCACHE_SIZE_SC_LEVEL2_DCACHE_SIZE ),或總 L3 緩存大小( _SC_LEVEL3_CACHE_SIZE )。

編輯:lstopo在 VMWare 下的 output 。 虛擬機有 8 個核心。 L1 和 L2 緩存信息很好,但 L3 緩存大小似乎不正確:

lstopo 截圖

可以通過在/sys (sysfs) 中打開文件以編程方式找到緩存層次結構的完整圖片。

每個“線程”或“邏輯處理器”都由/sys/devices/system/cpu/中的一個子目錄表示。 在該目錄中,您將找到一個緩存目錄。 例如,第一個邏輯處理器的緩存信息可以在這里找到:

$ ls /sys/devices/system/cpu/cpu0/cache/
index0
index1
index2
index3
power
uevent

與該邏輯處理器關聯的每個緩存實體由index[0-9]*目錄表示。 索引后的數字不代表級別。 相同的緩存實體可能在不同的邏輯處理器下多次列出。 在這些目錄中,您可以找到緩存實體的所有屬性(級別、集合、行大小等)。

$ ls /sys/devices/system/cpu/cpu0/cache/index0
coherency_line_size
level
number_of_sets
physical_line_partition
power
shared_cpu_list
shared_cpu_map
size
type
uevent
ways_of_associativity

完整的文檔可以在這里找到。

最重要的是,要獲得您想要的 output,您需要檢查shared_cpu_list

$ cat /sys/devices/system/cpu/cpu0/cache/index0/shared_cpu_list
0,28

這將向您展示哪些邏輯處理器共享此緩存實體。 通過檢查所有實體( /sys/devices/system/cpu/cpu*/cache/index*/ )並使用shared_cpu_list消除重復項,您可以以編程方式訪問您需要的所有數據。

請注意,您的管理程序不需要傳遞准確的信息。 這只會向您顯示緩存層次結構,因為來賓 kernel 看到它。

暫無
暫無

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

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