Как я могу программно иметь размеры (не, запрашивают ОС), размер и порядок ассоциативности L1 и кэшей L2 (кэши данных)?
Предположения о системе:
Нет никаких предположений об ОС (это может быть Linux, Windows или что-то еще), и мы не можем использовать запросы POSIX.
Язык является C, и оптимизация компилятора может быть отключена.
Вот код из ATLAS. Это для размера кэша L1
ATLAS / tune / sysinfo / L1CacheSize.c
( https://github.com/vtjnash/atlas-3.10.0/blob/master/tune/sysinfo/L1CacheSize .c )
int GetL1Size(int MaxSize, double tol)
{
int L1Size, tmp, correct=1;
fprintf(stderr, "\n Calculating L1 cache size:\n");
, но это только кэш l1 и только его размер, а не счетчик путей.
Я думаю, что все, что вам нужно сделать, это многократно обращаться к памяти постоянно увеличивающимися частями (для определения размера кеша), и я думаю, что вы можете варьировать шаги для определения ассоциативности.
Таким образом, вы должны начать с попытки получить доступ к очень коротким сегментам памяти и продолжать увеличивать их вдвое, пока доступ не замедлится. Каждый раз, когда доступ замедляется, вы определяете размер другого уровня кеша.
Тест STREAM может оказаться полезным или интересным, либо и то, и другое.