c++ - 如何在不污染缓存的情况下读取大量数据?

标签 c++ performance caching x86

我正在尝试对执行图像处理的代码进行性能优化。例如,unsharp masking .它以光栅顺序对图像每个像素周围的正方形区域应用计算。

我想检查将几行图像复制到专用的“工作区”,同时绕过缓存是否会有帮助。这个想法是,图像中的数据不会从缓存中逐出其他有用的数据,这应该会提高性能。

如何实现不更新缓存的特殊形式的memcpy

我不使用 OpenCV,但如果它有这样的支持,我准备尝试一下。

我不想将整个图像标记为未缓存区域,因为我有很多算法在上面运行,我想衡量我的优化尝试对一种算法的影响。

最佳答案

完全按照您的意愿行事的方法是结合使用 MOVNTDQA 指令和 WC 内存类型。这从内存中读取到流加载缓冲区而不是缓存中。从流式加载缓冲区提供对同一流式传输线的后续流式加载。请参阅 SDM 第 1 卷中的第 12.10.3 节。此指令是随 SSE4.1 添加的。

其他引用资料:
https://software.intel.com/en-us/articles/copying-accelerated-video-decode-frame-buffers
https://www.embedded.com/print/4007238
(请注意,我还没有彻底阅读这些内容,所以我不知道它们有多大用处。)

请注意,MOVNTDQA 未针对来自其他核心的写入进行排序,但根据您的描述,这在您的情况下似乎不是问题。

您绝对不想使用 UC 内存类型,因为正如 Peter 所提到的,每次访问都会导致单独的 DRAM 读取,更糟糕的是,UC 访问是序列化的,破坏了代码中的任何并行性。

关于c++ - 如何在不污染缓存的情况下读取大量数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54953619/

相关文章:

C++11 并行化 : bottleneck in Armadillo's set_seed_random()

ios - AWSMobileHub 使用 Swift 在 IOS 中缓存来自 S3 的图像

c++ - 使用 boost 将 C++ 对象传递给 python

c++ - SPI 代码不稳定 - RPi 上的 Raspbian (Debian) Linux

ruby - 你如何在 Ruby webapps 中进行性能测试?

caching - 如何将 Expires 响应 header 添加到 Web API 操作响应?

android - 清除所有 Activity 的 Glide 缓存?

c++ - 类模板,允许用户定义类型 C++

c++ - 模板内部的非常量非类型表达式

performance - GAE HR 数据存储上的 db.get([keys]) 速度极慢