Программа 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 МБ и выше всегда такие грязные?

Ответы на вопрос(6)

Ваш ответ на вопрос