c++ - 流式加载和非 USWC 内存

标签 c++ sse memcpy cpu-architecture

我刚读了这篇相当有趣的文章,Copying Accelerated Video Decode Frame Buffers .

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

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

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

最佳答案

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

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

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

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

关于c++ - 流式加载和非 USWC 内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6014199/

相关文章:

c++ - 给定两个点 (x1,y1) (x2,y2),我如何计算 N 个不同的点均匀地位于给定点之间的线上

android - 无法使用 GDB 和 Eclipse 调试 NDK 的 C++ 代码(OS - Windows 7)

c++ - 程序状态的任何变化是否构成可观察到的行为?

与 memcpy 连接

c++ - 我如何摆脱此错误main.cpp :43:19: error: no viable overloaded '=' novowels[100] = remove(name[100]);

c++ - SSE:将 __m128 转换为 float

c++ - 在 Clang 下解决缺少 Yz 机器约束的问题?

cpu - XMM 寄存器总数或每个内核

c - 为什么编译器在这种情况下不发出警告

使用 memcpy 复制指针(而不是它的内容)