当从连续的内存位置执行一系列_mm_stream_load_si128()调用(MOVNTDQA)时,硬件预取器是否仍会启动,或者我应该使用显式软件预取(使用NTA提示)以获得预取的好处,同时仍然避免缓存污染?
我问这个的原因是因为他们的目标似乎与我相矛盾.流加载将获取绕过缓存的数据,而预取器尝试主动将数据提取到缓存中.
当顺序迭代一个大型数据结构(处理过的数据不会在很长一段时间内被修饰)时,我有必要避免污染chache层次结构,但我不想因频繁出现频繁的~100次循环处罚-fetcher闲置.
目标架构是Intel SandyBridge
我已经阅读了很多关于内存排序的文章,并且所有这些文章都只说CPU重新加载和存储.
CPU(我对x86 CPU特别感兴趣)是否仅重新排序加载和存储,并且不重新排序它具有的其余指令?
该PREFETCHNTA指令基本上用于通过预取器将数据从主存储器带到缓存,但是NT已知带有后缀的指令会跳过缓存并避免缓存污染。
那么PREFETCHNTA,与PREFETCH指令有何不同?
考虑对大量浮点数据(数百 GB)进行大规模 SIMD 矢量化循环,理论上,这些数据应该受益于非时间(“流”,即绕过缓存)加载/存储。
使用非临时存储 (_mm256_stream_ps) 实际上确实比普通存储 (_mm256_store_ps) 显着提高了约 25% 的吞吐量
但是,当使用 _mm256_stream_load 而不是 _mm256_load_ps 时,我无法测量到任何差异。
有谁有一个可以使用 _mm256_stream_load_si256 来实际提高性能的示例?
(指令集和硬件是 AMD Zen2 上的 AVX2,64 核)
for(size_t i=0; i < 1000000000/*larger than L3 cache-size*/; i+=8 )
{
#ifdef USE_STREAM_LOAD
__m256 a = _mm256_castsi256_ps (_mm256_stream_load_si256((__m256i *)source+i));
#else
__m256 a = _mm256_load_ps( source+i );
#endif
a *= a;
#ifdef USE_STREAM_STORE
_mm256_stream_ps (destination+i, a);
#else
_mm256_store_ps (destination+i, a);
#endif
}
Run Code Online (Sandbox Code Playgroud)