【发布时间】:2021-02-19 07:31:14
【问题描述】:
CPU 缓存是否首选连续缓冲区?
我正在尝试编写一个对图像执行多项操作的应用程序(一些非常局部的操作,例如移位、导数和一些结果之间的减法)。 我有一个很大的结果缓冲区(每个计算都有一个图像的形状,所以我从分配 X * 图像形状字节开始)
我应该怎么做才能最大限度地提高 CPU 缓存命中率?
【问题讨论】:
-
CPU 缓存首选连续缓冲区吗? 是的。缓存是您拥有的最快的内存。如果您可以保留在缓存中,那么您将尽可能快,至少在读写方面是这样。
-
您可能还想考虑使用 GPU。
-
不只是缓存,还有预取器。拥有可预测且清晰的数据访问模式有助于 CPU 在您需要之前预取数据。当 CPU 可以为您准备好数据时,仅此一项就可以节省数千个等待 RAM 的周期。
-
如果图像操作比单纯的减法更复杂,例如平滑/过滤,应该考虑多线程
-
尝试将您的图像分成小方块。在该正方形上执行尽可能多的功能。然后移动到下一个方块。也许按行更好;只有基准测试会告诉我们。换句话说,尽可能在数据在缓存中的时候做,防止缓存重新加载。