我刚读了这篇相当有趣的文章,Copying Accelerated Video Decode Frame Buffers .
他们解释了如何使用流式加载尽可能快地从 USWC 内存中进行复制。
我的问题是为什么这种技术不能同时加速来自非 USWC 内存的正常拷贝?
流式加载会一次读取整个缓存行,而不是一次只加载 16 个字节的常规加载。我错过了什么?从填充缓冲区复制到将写入缓存的“缓存缓冲区”不会有太多开销,不是吗?
最佳答案
“流加载指令旨在加速来自 USWC 内存类型的数据传输。对于其他内存类型,例如可缓存 (WB) 或不可缓存 (UC),该指令的行为类似于典型的 16 字节 MOVDQA 加载指令。但是, future 的处理器可能会使用其他内存类型(例如 WB)的流式加载指令来暗示预期的缓存行应该从内存直接流式传输到内核,同时最大限度地减少缓存污染。”
也就是说,“普通”内存是 WB,因此与普通内存相比,使用非临时加载/存储没有任何优势。此外,对于普通的可缓存内存,缓存行的第一次加载会将整个缓存行拉入 L1,类似于第一次非临时加载将整个缓存行拉入特殊的“非临时缓冲区”。
正如上面引述的那样, future 的处理器可能会使用非临时加载/存储作为不污染缓存的提示。这在某些情况下可能是个好主意,但可能不是通用 memcpy() 实现的正确选择?
关于c++ - 流式加载和非 USWC 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6014199/