Внутренности SIMD: _mm_stream_load_si128 против _mm_load_si128

Когда мне следует использовать потоковую версию, а когда SSE2 или _mm_load_si128? Каков компромисс производительности?


person user1235183    schedule 18.08.2015    source источник


Ответы (1)


Встроенная функция потоковой загрузки (mm_stream_load_si128) выполняет загрузку «с использованием невременной подсказки памяти» (согласно Руководство по внутренним компонентам Intel). Это означает, что загруженное значение не приведет к удалению чего-либо из кеша.

Это полезно, если вы собираете большое количество данных, с которыми собираетесь работать немедленно, а не просматривать их снова в течение «долгого» времени. Чаще всего это происходит во время потоковой передачи. Я использовал его, когда знаю, что выполняю простую операцию с большим набором данных, где я знаю, что данные все равно будут быстро удалены из кеша. Такие операции, как memcpy, также попадают в эту категорию.

Непотоковая загрузка (mm_load_si128) извлечет значение, и оно будет подчиняться обычным правилам кэширования. При необходимости он может удалить старые записи кэша, и его можно будет извлечь из кэша до тех пор, пока он не будет удален.

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

person Marty    schedule 11.12.2015
comment
Я не понимаю, почему это выгодно для memcpy другого кода, который обращается к непрерывным блокам или ОЗУ? Строка кэша составляет 64 байта = 4x __m128i, т.е. ее кеширование значительно ускоряет следующие 3 загрузки? - person Soonts; 28.09.2017
comment
Основано на последнем комментарии из старой темы по этому поводу: software.intel.com/en-us/forums/intel-isa-extensions/topic/ Предполагая, что процессор вообще оптимизирует такое чтение, данные загружаются в кэш-буфер размером строки, который отделен от данных кеш. Доступно не так много таких буферов, поэтому лучше всего, когда содержимое буфера считывается в последующих инструкциях, иначе оно может быть потеряно и его необходимо будет повторно получить с потенциально большим снижением производительности. Да и само копирование будет не быстрее, чем с кешированной памятью, но и не вытеснит из кеша весь рабочий набор. - person user377178; 16.01.2018