Невозможно найти правильное время доступа к вытесненным строкам кэша L2 на компьютере с ядром i7
У меня есть система Core i7, имеющая размер кэша L1 32 КБ, размер кэша L2 256 КБ, общий размер кэша L3 8 МБ (общий для 4 ядер). Я написал программу, в которой я последовательно выполняю части A,B,C. (A) создайте большой массив int размером в 4 раза больше кеша L2 и обращайтесь к каждому 16-му элементу большого массива (размер строки кэша 64B, 16*4 B=64B), чтобы убедиться, что все мои данные загружены в L2. Записывая время доступа каждого элемента большого массива (B), затем используйте clflush для ручного удаления данных из нескольких мест в моем массиве данных, таких как clflush(&bigarray[0]) ...clflush (&bigarray[1024]). (C) снова доступ к каждому 16-му элементу большого массива, включая те строки, которые были выселены вручную в (B).
Я помещаю rdtsc() до и после строки, к которой я обращаюсь к моему большому массиву, чтобы найти время доступа. Я узнал об использовании clflush в машине i3/i7 по этой ссылке clflush() в процессорах i3 или i7
asm volatile ("cpuid; rdtsc" : "=a" (a), "=d" (d) : : "ebx", "ecx");
Я получаю более высокое время доступа после выселения для одной линии, как и ожидалось, до СЮРПРИЗА, но не получаю увеличения времени доступа для нескольких мест.
Позвольте мне объяснить это по-другому:
Сценарий 1: Доступ к одному элементу массива до и после clflush
- шаг1- доступ (a[x]) и поиск времени доступа
- step2- используйте clflush(&a[x]), чтобы удалить его из кэша и найти время доступа
Сценарий 2: Доступ к нескольким элементам массива до и после clflush
- шаг1- доступ к каждому элементу массива [i]
шаг 2-
for all i { clflush( &a[i]) } to evict from cache and find access time of all elements at i.
Я не получаю более высокого времени доступа к элементам массива после clflush, хотя получаю ожидаемый результат, как в Сценарии-1.
Какова причина? Как пройти и узнать правильное время доступа после выселения. Слышал о аппаратной и программной предварительной загрузке, влияют ли они на мой результат? Как преодолеть там влияние и узнать правильный результат?
1 ответ
Попробуйте перезапустить после того, как вы отключите предварительные сборщики HW через BIOS (или любым другим способом). Вы описываете очень устойчивый поток, который сразу же распознается устройством предварительной выборки HW и выбирается заблаговременно до ваших нагрузок (делая время доступа точно таким же, как при обычном поиске L2)