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

时间:2019-03-01 23:18:44

标签: c++ performance caching x86

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

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

如何实现一种特殊形式的memcpy,它不会更新缓存?

我不使用OpenCV,但如果有这种支持,我准备尝试。

我不想将整个图像标记为未缓存区域,因为我在其上运行了许多算法,并且只想评估优化尝试对一种算法的影响。

1 个答案:

答案 0 :(得分:1)

确切地执行所需操作的方法是将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访问正在序列化,从而破坏了代码中的任何并行性。