Невозможно найти правильное время доступа к вытесненным строкам кэша 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)

Другие вопросы по тегам