假设我必须编写一个C或C++计算密集型函数,它有两个数组作为输入,一个数组作为输出。如果计算使用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时间到取数据回来,如果它已被驱逐。然而,这可能会产生不必要的流量,另外我需要非常小心地何时介绍它们;
- 试图在较小的数据块上进行处理。然而,只有在问题允许的情况下,这才会起作用;
- 禁用硬件预取程序,可以降低不需要的驱逐速率。
除此之外,有没有优雅的解决方案?
当我处于类似的情况时,偶尔的预取指令已经产生了可测量的益处。诀窍是在*时聪明。 –
它通常会这样做,特别是当这行被驱逐但是如果我对已经在缓存中的行进行预取时,它是否会更新缓存替换算法中的重用距离? – VAndrei
你确定这将*实际*提高性能?我建议采取相反的方式:未缓存/非时间/写入组合商店。 – EOF