Размер и порядок расположения кешей 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

Вопрос устарел немного, но ответ здесь.