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种可能的解决方案:
除此之外,还有什么优雅的解决方案吗?
我试图更好地理解这个问题:
如果“输出”数组确实是严格用于输出的,并且您从不执行类似的操作
output[i] = Foo(newVal, output[i]);
Run Code Online (Sandbox Code Playgroud)
然后,output[] 中的所有元素都被严格写入。如果是这样,您只需“保留”一个缓存行即可。这不是正确的吗?
在这种情况下,对“输出”的所有写入都会生成缓存填充,并可能与“输入”数组所需的缓存行竞争。
您是否不希望对可以消耗的缓存行“输出”设置上限,而不是保留一定数量的行。