gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 23:02:53 27 4
gpt4 key购买 nike

假设我必须编写一个 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com