Когда мне следует использовать потоковую версию, а когда SSE2 или _mm_load_si128? Каков компромисс производительности?
Внутренности SIMD: _mm_stream_load_si128 против _mm_load_si128
Ответы (1)
Встроенная функция потоковой загрузки (mm_stream_load_si128
) выполняет загрузку «с использованием невременной подсказки памяти» (согласно Руководство по внутренним компонентам Intel). Это означает, что загруженное значение не приведет к удалению чего-либо из кеша.
Это полезно, если вы собираете большое количество данных, с которыми собираетесь работать немедленно, а не просматривать их снова в течение «долгого» времени. Чаще всего это происходит во время потоковой передачи. Я использовал его, когда знаю, что выполняю простую операцию с большим набором данных, где я знаю, что данные все равно будут быстро удалены из кеша. Такие операции, как memcpy
, также попадают в эту категорию.
Непотоковая загрузка (mm_load_si128
) извлечет значение, и оно будет подчиняться обычным правилам кэширования. При необходимости он может удалить старые записи кэша, и его можно будет извлечь из кэша до тех пор, пока он не будет удален.
Если вы планируете снова использовать данные до того, как произойдет обычное вытеснение кэша, предпочтительнее использовать непотоковую загрузку. Если вы работаете с большим набором данных, где не ожидается повторного доступа к данной части данных до того, как она будет удалена из кэша, предпочтительнее использовать потоковую загрузку.