Программа C для определения уровней и размера кэша
Полная перезапись / обновление для ясности (и ваше здравомыслие, его abit слишком долго) ... (Старый пост)
Для назначения мне нужно найти уровни (L1, L2, ...) и размер каждого кэша. Учитывая подсказки и то, что я нашел до сих пор: я думаю, что идея состоит в том, чтобы создавать массивы разных размеров и читать их. Сроки этих операций:
sizes = [1k, 4k, 256K, ...]
foreach size in sizes
create array of `size`
start timer
for i = 0 to n // just keep accessing array
arr[(i * 16) % arr.length]++ // i * 16 supposed to modify every cache line ... see link
record/print time
ОБНОВЛЕНО (28 сентября 18:57 UTC + 8)
Смотрите такжеполный источник
Хорошо, теперь после @mah 'Совет, я мог бы исправить проблему отношения SNR ... а также нашел способ синхронизации моего кода (wall_clock_time
из лабораторного примера кода)
Тем не менее, я, кажется, получаю неправильные результаты: я на Intel Core i3 2100: [SPECS]
L1: 2 x 32KL2: 2 x 256KL3: 3 МБРезультаты, которые я получил, на графике:
длинаМод: от 1КБ до 512К
Основание 1-го пика - 32K ... разумно ... 2-е - 384K ... почему? Я'м, ожидая 256?
lengthMod: от 512 КБ до 4 МБ
Тогда почему этот диапазон может быть в беспорядке?
Я также читал о предварительной загрузке или вмешательстве из других приложений, поэтому я закрыл как можно больше вещей во время работы скрипта, и последовательно (через многократные прогоны) кажется, что данные размером 1 МБ и выше всегда такие грязные?