SIMD 内部函数:_mm_stream_load_si128 与 _mm_load_si128

SIMD intrinsics: _mm_stream_load_si128 vs _mm_load_si128

我什么时候应该使用流媒体版本,什么时候使用 SSE2 vs _mm_load_si128?什么是性能权衡?

流加载内在 (mm_stream_load_si128) 执行加载 "using a non-temporal memory hint"(根据 Intel Intrinsics Guide)。这意味着加载的值不会导致从缓存中逐出任何内容。

如果您将大量数据组合在一起,您将立即对其进行操作并且 "long" 时间不再查看,这将非常有用。最常见的情况是在流操作期间发生这种情况。当我知道我正在对一个大数据集执行一个简单的操作时,我就使用过它,我知道数据无论如何都会很快从缓存中被逐出。 memcpy 等操作也属于此类。

非流式加载 (mm_load_si128) 将检索该值,并且它将遵循正常的缓存规则。如果需要,它可能会驱逐旧的缓存条目,并且能够从缓存中检索直到它被驱逐。

如果您希望在正常缓存逐出发生之前再次使用数据,则首选非流式加载。如果您在大型数据集上操作,其中给定的数据片段在被踢出缓存之前预计不会再次访问,则首选流式加载。