Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 流式加载和非USWC内存_C++_Sse_Memcpy_Cpu Architecture - Fatal编程技术网

C++ 流式加载和非USWC内存

C++ 流式加载和非USWC内存,c++,sse,memcpy,cpu-architecture,C++,Sse,Memcpy,Cpu Architecture,我刚刚读了这篇相当有趣的文章 其中,他们解释了如何使用流式加载尽可能快地从USWC内存进行复制 我的问题是,为什么这种技术不能同时加速非USWC内存中的正常拷贝 流式加载将一次性读取整个缓存线,而不是一次只加载16个字节的常规加载。我错过了什么?从填充缓冲区复制到将写入缓存的“缓存缓冲区”不会有太大的开销,不是吗 “流式加载指令旨在加速USWC内存类型的数据传输。对于其他内存类型,如可缓存(WB)或不可缓存(UC),该指令的行为类似于典型的16字节MOVDQA加载指令。但是,未来的处理器可能会将

我刚刚读了这篇相当有趣的文章

其中,他们解释了如何使用流式加载尽可能快地从USWC内存进行复制

我的问题是,为什么这种技术不能同时加速非USWC内存中的正常拷贝

流式加载将一次性读取整个缓存线,而不是一次只加载16个字节的常规加载。我错过了什么?从填充缓冲区复制到将写入缓存的“缓存缓冲区”不会有太大的开销,不是吗

“流式加载指令旨在加速USWC内存类型的数据传输。对于其他内存类型,如可缓存(WB)或不可缓存(UC),该指令的行为类似于典型的16字节MOVDQA加载指令。但是,未来的处理器可能会将流式加载指令用于其他内存类型(如WB)作为一个提示,预期的缓存线应该从内存直接流到核心,同时最大限度地减少缓存污染。”

也就是说,“正常”内存是WB,因此与正常内存相比,使用非临时加载/存储没有任何优势。此外,对于普通可缓存内存,缓存线的第一次加载将把整个缓存线拉入L1,类似于第一次非时间加载将把整个缓存线拉入特殊的“非时间缓冲区”的方式


如上所述,未来的处理器可能会使用非临时加载/存储作为不污染缓存的提示。在某些情况下,这可能是一个好主意,但对于通用的memcpy()实现来说,可能不是正确的选择?

+1对于提示性标题(热气腾腾的负载最好是原始转储),您最后一段中的描述完全是反向的。流式加载/存储意味着完全绕过缓存,而常规加载/存储(
MOVDQA
)是在缓存的帮助下执行的。还请记住,在每个体系结构上,单个缓存线通常比SIMD寄存器长度宽。对,
memcpy
输出通常立即使用,因此您可能会得到更快的
memcpy
,但所有缓存未命中都可能会降低代码的速度。(见附件)