Размер и порядок расположения кешей L1 и L2
Как я могу программно измерить (не запрашивать ОС) размер и порядок ассоциативности кешей L1 и L2 (кэши данных)?
Предположения о системе:
- У этого есть кеш L1 и L2 (может также быть L3, может быть совместное использование кеша),
- Он может иметь аппаратную часть предварительной выборки (как и P4 +),
- У него стабильный источник синхронизации (tickcounter или хорошая HPET для gettimeofday).
Нет предположений об ОС (это может быть Linux, Windows или что-то еще), и мы не можем использовать запросы POSIX.
Язык - это C, и оптимизация компилятора может быть отключена.
Ответы
Ответ 1
Я думаю, что все, что вам нужно сделать, - это многократно получать доступ к памяти в постоянно растущих фрагментах (чтобы определить размер кеша), и я думаю, что вы можете изменить шаги для определения ассоциативности.
Итак, вы начнете пытаться получить доступ к очень коротким сегментам памяти и удвоить размер до тех пор, пока доступ не замедлит работу. Каждый раз, когда доступ замедляется, вы определяете размер другого уровня кеша.
Ответ 2
Вот код от ATLAS. Он предназначен для размера кеша L1
ATLAS/мелодия/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 и только его размер, а не путь-счет.
Ответ 3
Вы можете найти тест STREAM полезный или интересный или и тот, и другой.
Ответ 4
Вопрос устарел немного, но ответ здесь.