c++ - "reserve"缓存部分是否有任何解决方法?

标签 c++ c caching memory-management optimization

假设我必须编写一个 C 或 C++ 计算密集型函数,该函数有 2 个数组作为输入,一个数组作为输出。如果计算使用 2 个输入数组的频率高于它更新输出数组的频率,我最终会遇到输出数组很少被缓存的情况,因为它被逐出以获取 2 个输入数组。

我想为输出数组保留一部分缓存,并以某种方式强制这些行在获取后不会被驱逐,以便始终将部分结果写入缓存

Update1(output[]) // Output gets cached
DoCompute1(input1[]); // Input 1 gets cached
DoCompute2(input2[]); // Input 2 gets cached
Update2(output[]); // Output is not in the cache anymore and has to get cached again
...

我知道有一些机制可以帮助驱逐:clflush、clevict、_mm_clevict 等。有没有相反的机制?

我正在考虑 3 种可能的解决方案:

  • 不时使用 _mm_prefetch 来取回已被驱逐的数据。但是,这可能会产生不必要的流量,而且我需要非常小心何时引入它们;
  • 尝试对较小的数据 block 进行处理。但是,这只有在问题允许的情况下才有效;
  • 在可能的情况下禁用硬件预取器以降低不必要的驱逐率。

除此之外,还有什么优雅的解决方案吗?

最佳答案

Intel CPU 有一种叫做 No Eviction Mode (NEM) 的东西,但我怀疑这是你需要的。

当您尝试优化输出 [] 的第二次(不必要的)获取时,您是否考虑过使用 SSE2/3/4 寄存器来存储中间输出值,在必要时更新它们,并仅在与该部分 output[] 相关的所有更新都完成了吗? 我在计算 FFT(快速傅立叶变换)时做了类似的事情,其中​​部分输出在寄存器中,并且只有在知道它们将不再被访问时才将它们移出(到内存)。在那之前,所有更新都发生在寄存器上。您需要引入内联汇编来有效地使用 SSE* 寄存器。当然,这样的优化很大程度上取决于算法和数据放置的性质。

关于c++ - "reserve"缓存部分是否有任何解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29881603/

相关文章:

c++ - 字节顺序如何影响 C++ 中的枚举值?

C++验证驾照程序

c - 在 C 中读取具有可变列数的空格分隔文件

c - C语言的调度例程和时序要求

java web 应用程序缓存数据,如何停止它以使数据不陈旧!

c++ - TableWidget 不显示项目的更新值

c++ - 带有一个选项卡的 QTabBar 太宽

检查指针数组中的指针是否为空

caching - 如何以编程方式使 Bitbucket Pipeline 的缓存失效?

android - 如何从 picasso 的缓存中检索图像?