Программно получить точную информацию об иерархии кэша ЦП на Linux - PullRequest
9 голосов
/ 27 апреля 2020

Я пытаюсь получить точное описание иерархии кэша данных текущего процессора на Linux: не только размер отдельных кэшей данных L1 / L2 / L3 (и, возможно, L4), но и способ, которым они разделены или распределены по ядрам.

Например, на моем процессоре (AMD Ryzen Threadripper 3970X) каждое ядро ​​имеет свои 32 КБ кэш-памяти данных L1 и 512 КБ кэш-памяти L2, однако кэш-память L3 используется совместно. через ядра в ядро ​​комплекса (CCX). Другими словами, есть 8 различных кешей L3, каждый из которых по 16 МБ.

Раздел «Кэш» этого снимка экрана CPU-Z на Windows - это то, что я пытаюсь выяснить:

CPU-Z Screenshot

У меня нет проблем с получением этой информации по Windows с GetLogicalProcessorInformation().

Однако, на Linux кажется, что sysconf() дает мне только размер кэша для каждого ядра для кэшей данных L1 и L2 (_SC_LEVEL1_DCACHE_SIZE и _SC_LEVEL2_DCACHE_SIZE), или общий размер кэша L3 (_SC_LEVEL3_CACHE_SIZE).

EDIT: вывод lstopo под VMWare . Виртуальная машина имеет 8 ядер. Информация кэша L1 и L2 в порядке, но размер кэша L3 выглядит неверным:

lstopo Screenshot

1 Ответ

3 голосов
/ 28 апреля 2020

Полную картину иерархии кэша можно найти программным способом, открыв файлы в /sys (sysfs).

Каждый «поток» или «логический процессор» представлен подкаталогом в /sys/devices/system/cpu/. В этом каталоге вы найдете каталог кеша. Например, информацию о кеше для первого логического процессора можно найти здесь:

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

Каждый объект кеша, связанный с этим логическим процессором, представлен каталогом index[0-9]*. Число после индекса не представляет уровень. Один и тот же объект кэша может быть указан несколько раз под разными логическими процессорами. В этих каталогах вы можете найти все свойства объекта кэша (уровень, наборы, размер строки и т. Д. c).

$ 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

Полную документацию можно найти здесь .

Самое главное, чтобы получить желаемый результат, вам нужно проверить 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, вы можете программным образом получить доступ ко всем требуемым данным.

Обратите внимание, что ваш гипервизор не обязан передавать точную информацию. Это покажет вам только иерархию кэша в том виде, в каком ее видит гостевое ядро.

...