Затраты времени _mm_lfence () не являются детерминированными? - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь определить время, необходимое для чтения элемента, чтобы убедиться, что это попадание в кэш или его отсутствие.чтобы чтение было в порядке, я использую функцию _mm_lfence ().Я получил неожиданные результаты, и после проверки я увидел, что издержки lfence-функции не являются детерминированными.Поэтому я выполняю программу, которая измеряет эти издержки в цикле, например, 100 000 итераций.Я получаю результаты более 1000 тактов за одну итерацию, а в следующий раз - 200. Что может быть причиной такой разницы между издержками функции lfence и, если она настолько ненадежна, как я могу правильно оценить задержку попаданий в кэш и пропусков кеша?Я пытался использовать тот же подход, что и в этом посте: Измерение задержки памяти со счетчиком отметок времени

код, который дает ненадежные результаты, таков:

for(int i=0; i < arr_size; i++){
  _mm_mfence();
  _mm_lfence();
   t1 = __rdtsc();
  _mm_lfence();
  _mm_lfence();
   t2 = __rdtsc();
  _mm_lfence();

   arr[i] = t2-t1;
}

значения в arr варьируются в разных диапазонах, arr_size - 100 000

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Я получаю результаты более 1000 тактов за одну итерацию, а в следующий раз - 200.

Звучит так, как после первых нескольких итераций ваш ЦП перешел с простоя на обычную тактовую частоту.

Помните, что RDTSC отсчитывает ссылочных циклы (фиксированная частоту, равную или близкую к максимальным нетурбо частотам CPU), не основных часовциклов .(холостой / турбо / что угодно).Старые ЦП имели тактовые частоты ядра RDTSC, но в течение многих лет производители ЦП устанавливали частоту RDTSC, делая ее полезной для clock_gettime(), и рекламировали этот факт с помощью invariant_tsc признака CPUID .См. Также Получить счетчик циклов ЦП?

Если вы действительно хотите использовать RDTSC вместо счетчиков производительности, отключите turbo и используйте цикл разогрева, чтобы ваш процессор работал с максимальной нагрузкойчастота.


Существуют библиотеки, которые позволяют программировать счетчики производительности HW и устанавливать разрешения, чтобы вы могли запускать rdpmc в пользовательском пространстве.Это на самом деле имеет меньшие накладные расходы, чем rdtsc.См. Какой будет точный код для подсчета количества пропущенных кэш-памяти последнего уровня в архитектуре Intel Kaby Lake для получения краткой информации о способах доступа к счетчикам производительности в пользовательском пространстве.

Я также нашелстатья о добавлении поддержки пользовательского пространства rdpmc в Linux perf (PAPI): ftp: //ftp.cs.uoregon.edu/pub/malony/ESPT/Papers/espt-paper-1.pdf.IDK, если это вошло в основной / исполняемый код ядра или нет.

0 голосов
/ 04 февраля 2019

Практический ответ: Используйте rdtscp вместо rdtsc (наряду с барьером компилятора, я не уверен, что найденная вами версия будет иметь его) и отбросьте границы между вашими экземплярами rdtscp.Это не будет идеально, но это должно уменьшить ошибку. Вот несколько устаревший пост, который должен быть полезен.

Больше, чем вы хотели знать: Порядок инструкций и спекуляции очень трудно рассуждать.Лфенс - очень тяжелый, сложный молоток.Это также уничтожает спекуляции после него, но само по себе может быть спекулятивно (забавно).Для более подробной информации проверьте этот blogpost .

...