Свойство _mm_pause()
полностью задокументировано Intel и поддерживается всеми основными компиляторами x86, переносимыми между операционными системами.IDK, если документы MS отсутствовали в прошлом, или если вы только что пропустили его, ~ 7 лет.
#include <immintrin.h>
и используйте его.(Или для древних компиляторов #include <emmintrin.h>
для SSE2).
#include <immintrin.h>
void test() {
_mm_pause();
_mm_pause();
}
компилируется в этот ассемблер на всех 4 файлах gcc / clang / ICC / MSVC ( в проводнике компилятора Godbolt ):
test(): # @test()
pause
pause
ret
На процессорах без SSE2 он декодируется как rep nop
, что является просто nop
. Кроссплатформенная реализация инструкции паузы x86
Gcc даже знает об этом и по-прежнему принимает _mm_pause()
при компиляции с -mno-sse
.(Обычно gcc и clang отклоняют intriniscs для команд, которые не включены, в отличие от MSVC.) Забавно, что gcc даже выдает rep nop
в своем выводе asm, в то время как остальные три выдают pause
.Разумеется, они собираются на одном и том же машинном коде.
Пауза бездельничает передний конец этой гиперпотоки в течение примерно 5 циклов в семействе Сэндибридж до Скайлэйка.На Skylake Intel увеличила его до ~ 100 циклов, чтобы сэкономить больше энергии в циклах ожидания вращения.
См. Также Какова цель инструкции PAUSE в x86? .