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

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