_mm_stream_load_si128
声明为:
__m128i _mm_stream_load_si128 (__m128i * mem_addr)
虽然_mm_load_si128
的声明如下:
__m128i _mm_load_si128 (__m128i const* mem_addr)
这个前面修饰了mem_addr
指向的内容吗?如果不是,那么为什么要使用非const声明呢?
_mm_stream_load_si128
声明为:
__m128i _mm_stream_load_si128 (__m128i * mem_addr)
虽然_mm_load_si128
的声明如下:
__m128i _mm_load_si128 (__m128i const* mem_addr)
这个前面修饰了mem_addr
指向的内容吗?如果不是,那么为什么要使用非const声明呢?
我认为这样声明没有任何原因。请参见更广泛操作数的 _mm256_stream_load_si256
和 _mm512_stream_load_si512
,它们使用 const
参数。
在 Visual Studio 2015 附带的 <smmintrin.h>
中也是使用 const
:
/*
* Load double quadword using non-temporal aligned hint
*/
extern __m128i _mm_stream_load_si128(const __m128i*);
movntdqa
只是当前 CPU 上慢速的movdqa
;它们不会对 NT 提示进行任何操作以尝试最小化缓存污染(例如,只像prefetchnta
一样加载到 L3 的一个“路”中)。另请参见Non-temporal loads and the hardware prefetcher, do they work together? - 这里有硬件预取器不支持 NT 的情况,因此实际上绕过缓存并没有什么意义。它只对已经弱排序的 WC 内存有用。 - Peter Cordessfence
。与其他负载一样,movntdqa
负载与sfence
无序。movntdqa
就是一个负载。SSE2 SIMD-integer NT存储器是movntdq
,和其他NT 存储器 一样,确实做到了你所说的覆盖WB内存区域的强Mem-Order语义以更像WC。这就是为什么libc memset / memcpy在大数据复制时使用它。(但不适用于NT加载)。 - Peter Cordes