编译器优化如何影响对缓存不友好的算法?

时间:2017-03-10 09:55:16

标签: c++ optimization volatile cpu-cache

我注意到this question的代码中有一个有趣的行为,它也来自Optimizing software in C++中的Agner Fog,它减少了数据访问和存储在缓存中的方式(缓存关联性)。这个解释对我来说很清楚,但后来却有人对volatile进行了抨击...... 也就是说,如果我们将volatile限定符添加到矩阵声明中:volatile int mat[MATSIZE][MATSIZE];512的运行时间显着降低:2144→1562μs。

正如我们所知volatile阻止编译器缓存值(在CPU寄存器中)以及在程序的POV中看起来不必要时优化对该值的访问。

一个可能的版本假设计算过程仅在RAM中发生,并且在volatile的情况下不使用cpu高速缓存。但另一方面,值513的运行时间再次 <{1}}:512 ...

1 个答案:

答案 0 :(得分:2)

不幸的是我无法确认易失性版本运行得更快。我对易失性和非易失性版本进行了测试,两者的时间比较可以在下面的图表中看到。在测量性能以优化代码时,总是很重要的是采取几个步骤(不只是一个或两个,但在数千个范围内),并根据Alexandrescu的Fastware采用所收集数据的模式(https://en.wikipedia.org/wiki/Mode_(statistics))。

enter image description here

有各种各样的山峰和深谷,但是看图表你不能断定波动更快。

实际上,编译器生成的代码是不同的,但在某种程度上,您可以在https://godbolt.org/g/ILw3tg上查看