2011-05-16 40 views
5

我刚刚阅读这个相当有趣的文章,Copying Accelerated Video Decode Frame Buffers流媒体加载和非USWC内存

他们在哪里解释如何使用流式加载尽可能快地从USWC内存中进行复制。

我的问题是为什么这种技术不会加速正常的副本,从非USWC内存?

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

+0

对于暗示性标题+1(蒸煮负荷最好是倾倒原料) – sehe 2011-05-16 07:41:34

+0

您最后一段的描述完全倒退。流加载/存储意味着完全**绕过缓存,而常规加载/存储('MOVDQA')是在缓存的帮助下执行的。另外请记住,单个高速缓存行通常比每个体系结构上的SIMD寄存器长度更宽。 – rwong 2015-03-23 16:06:24

回答

6

http://software.intel.com/en-us/articles/increasing-memory-throughput-with-intel-streaming-simd-extensions-4-intel-sse4-streaming-load/

“流式传输加载指令的目的是从USWC存储器类型加速的数据传输。对于其它类型的存储器,如高速缓存(WB)或不可缓存(UC),该指令的行为作为一个典型的16 -byte MOVDQA加载指令,但未来的处理器可能会使用其他内存类型(例如WB)的流加载指令作为暗示,预期的缓存行应从内存直接流式传输到内核,同时将缓存污染降到最低。

也就是说,“正常”内存是WB,因此使用非时间加载/存储与正常存储没有优势。同样,对于普通的可缓存内存,高速缓存行的第一次加载将把整个高速缓存行拉入到L1中,类似于第一个非时间加载将整个高速缓存行拉入特殊“非时间缓冲区”的方式。

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

+0

正确的,'memcpy'输出经常被使用,所以你可能会得到一个更快的'memcpy',但是代码会在所有缓存未命中后放慢。 (请参阅http://svn.0x00ff00ff.com/mirror/package/avisynth/x86/FilterSDK/IsMovntqFaster.htm) – 2015-04-30 21:31:55