Почему _mm_mfence () производит подсчет для перф события ALL_LOADS? - PullRequest
0 голосов
/ 26 февраля 2019

Я тестирую поведение некоторых внутренних операций.Я удивился, когда заметил, что _mm_mfence () выдает инструкцию загрузки из пользовательского пространства, но она не учитывается в кэше данных L1 - попадание в буфер, пропуск или заполнение буфера.Я использую собственные события papi, такие как MEM_INST_RETIRED и MEM_LOAD_RETIRED для чтения счетчиков производительности.Этот фрагмент кода:

 for(int i=0; i < 1000000; i++){

    _mm_mfence();

  }

считает ALL_LOADS: 737030, L1_HIT: 99, L1_MISS: 10, FB_HIT: 25. хотя без mfence накладные расходы на счетчики чтения выглядят примерно так: ALL_LOADS: 125, L1_HIT:94, L1_MISS: 11, FB_HIT: 24

Я проверил, и защита и защита не оказывают такого влияния.Я использую -O3 для компиляции.Из скомпилированного файла, я думаю, он вызывает функцию __builtin_ia32_mfence, но я не смог найти много на нем.

В целом я понимаю, что делает _mm_mfence () и почему мы его используем, но теперь вопрос больше в том, как это работает.Было бы замечательно, если бы кто-нибудь мог объяснить или дать какую-нибудь статью, чтобы понять это поведение.

1 Ответ

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

_mm_mfence() компилируется только с инструкцией mfence , которая не является загрузкой или хранилищем, если говорить архитектурно

Один или несколько мопов, которые он декодирует, может микроархитектурно работает на порте загрузки и учитывается как нагрузка.

Какой процессор вы используете?Если Skylake, я предполагаю, что вы обновили микрокод, поэтому mfence стоит дороже, чем указано в таблицах Агнер Фог.(и он блокирует exec-порядка exec неопиций памяти, как lfence. См. Является ли загрузка и хранение только инструкции, которые переупорядочиваются? Очевидно, некоторые процессоры Intel до Skylake не делали этогодля mfence.)

...