是否有"保留"缓存分数的解决方法?

VAn*_*rei 13 c c++ optimization caching memory-management

假设我必须编写一个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
...
Run Code Online (Sandbox Code Playgroud)

我知道有一些机制可以帮助驱逐:clflush,clevict,_mm_clevict等.是否有相反的机制?

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

  • 如果已被驱逐,则不时使用_mm_prefetch来获取数据.然而,这可能会产生不必要的流量加上我需要非常小心何时引入它们;
  • 尝试对较小的数据块进行处理.然而,只有在问题允许的情况下,这才有效;
  • 禁用硬件预取程序可以降低不必要的驱逐率.

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

Kal*_*anS 0

我试图更好地理解这个问题:

如果“输出”数组确实是严格用于输出的,并且您从不执行类似的操作

output[i] = Foo(newVal, output[i]);
Run Code Online (Sandbox Code Playgroud)

然后,output[] 中的所有元素都被严格写入。如果是这样,您只需“保留”一个缓存行即可。这不是正确的吗?

在这种情况下,对“输出”的所有写入都会生成缓存填充,并可能与“输入”数组所需的缓存行竞争。

您是否不希望对可以消耗的缓存行“输出”设置上限,而不是保留一定数量的行。