流式处理加载和非 USWC 内存
streaming loads and non USWC memory
我刚刚读了这篇相当有趣的文章,复制加速视频解码帧缓冲区。
他们解释了如何使用流式加载尽可能快地从 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 加载指令。但是,未来的处理器可能会使用其他内存类型(如WB)的流加载指令作为提示,即预期的缓存行应从内存直接流式传输到内核,同时最大限度地减少缓存污染。
也就是说,"正常"内存是WB,因此与正常加载/存储相比,使用非时间加载/存储没有任何优势。此外,对于普通的可缓存内存,缓存行的第一次加载会将整个缓存行拉入 L1,类似于第一次非临时加载将整个缓存行拉入特殊的"非临时缓冲区"。
正如上面引用的那样,未来的处理器可能会使用非临时加载/存储作为提示,以免污染缓存。在某些情况下,这可能是一个好主意,但对于通用 memcpy() 实现来说可能不是正确的选择?
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 流式处理加载和非 USWC 内存