Полная перезапись/обновление для ясности (и ваше здравомыслие, это слишком долго)... (Старый пост)
Для назначения мне нужно найти уровни (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 32K
- L2: 2 x 256K
- L3: 3MB
Результаты, полученные на графике:
lengthMod: от 1KB до 512K
База 1-го пика 32K... разумная... вторая - 384K... почему? Я ожидаю 256?
lengthMod: от 512k до 4MB
Тогда почему этот диапазон может быть беспорядочным?
Я также читал о предварительной выборке или помехах от других приложений, поэтому я закрыл как можно больше вещей, пока работает script, он последовательно (через несколько запусков) последовательно показывает, что данные 1 МБ и выше всегда настолько грязны?