C/C++ встроенные для невременной загрузки 32- и 64-битных значений на x86_64?
Существуют ли встроенные функции C/C++ для невременных нагрузок (т. Е. Загрузок без кэширования, непосредственно из DRAM) 32- и 64-разрядных значений в x86_64?
Мой компилятор - MSVC++2017 toolset v141. Но приветствуются встроенные функции для других компиляторов, а также ссылки на базовые инструкции по сборке.
2 ответа
На момент написания статьи (август 2017 г.) нет временных нагрузок на регистры GP.
Единственные доступные невременные инструкции:
Целочисленный домен
(v)movntdqa
(load) несмотря на название, эта инструкция перемещает 128/256/512 битов, выровненных по их естественной границе, вxmm/ymm/zmm
регистрирует соответственно.(v)movntdq
(магазин), несмотря на название, эта инструкция перемещаетсяxmm/ymm/zmm
записывается в 128/256/512 бит, выровненных по их естественной границе, ячейке памяти.
Регистры ГП
movnti
(сохранить) сохранить 32/64-битный регистр GP в DWORD/QWORD в памяти.
MMX регистры
movntq
(сохранить) сохранить MMX регистр в QWORD в памяти.
Домен с плавающей точкой
(v)movntpd/s
(хранить) (устаревшие и закодированные в VEX) хранитьxmm/ymm/zmm
зарегистрировать в выровненной ячейке памяти 128/256/512 бит. подобноmovntdq
но в домене FP.
(v)movntpd/s
(сохранить) (в кодировке EVEX) сохранитьxmm/ymm/zmm
зарегистрировать в выровненной ячейке памяти 512 бит, очистив верхние неиспользуемые биты. подобноmovntdq
но в домене FP.
Руководства Intel по этому вопросу противоречивы
Маскированные мовы
(v)maskmovdqu
(магазин) хранит байтыxmm
зарегистрироваться по маске в другомxmm
регистр.
(v)maskmovq
(сохранить) сохраняет байты регистра MMX в соответствии с маской в другом регистре MMX.
Посмотрите здесь: https://software.intel.com/sites/landingpage/IntrinsicsGuide/
void _mm_stream_pi (__m64* mem_addr, __m64 a)
void _mm_stream_si32 (int* mem_addr, int a)
и некоторые другие
а также
https://msdn.microsoft.com/en-us/library/hh977023.aspx
это на самом деле документация VS2015, но документ VS2017 (по крайней мере для меня) странный, неорганизованный, и я ничего не могу найти там:).
для этого по крайней мере, как я знаю
void _mm_prefetch (char const* p, int i) is used for it.
эти нагрузки являются достаточно короткими, чтобы информировать uP только о том, чтобы не извлекать другие данные из кэша без снижения производительности (поэтому даже для невременной нагрузки, если в кеше есть место, она будет кэширована, но не будет выселена любые данные)