编译器优化如何影响缓存不友好的算法?
How can compiler optimizations affect on a cache-unfriendly algorithm?
我注意到 this question which is also comes from Agner Fog in Optimizing software in C++ 的代码中有一个有趣的行为,它简化了数据在缓存中的访问和存储方式(缓存关联性)。解释对我来说很清楚,但后来有人对 volatile
...
也就是说,如果我们在矩阵声明中添加 volatile
限定符:volatile int mat[MATSIZE][MATSIZE];
值 512
的 运行 宁时间显着 减少 :2144 → 1562 微秒
正如我们所知,volatile
阻止编译器缓存该值(在 CPU 寄存器中),并在从程序的 POV 看来不需要时优化访问该值。
一个可能的版本假定计算过程只发生在 RAM 中,并且在 volatile
的情况下不使用 cpu 缓存。但另一方面,价值 513
的 运行 时间再次比 512
少 :1490 μs
...
遗憾的是,我无法确认 volatile 版本 运行ning 更快。我对 volatile 和 non-volatile 版本都进行了测试 运行,两者的时间比较可以在下图中看到。在为了优化代码而测量性能时,采取几个步骤(不仅仅是一两个步骤,而是在数千个范围内)并按照 Alexandrescu 的 Fastware 采用收集数据的模式 (https://en.wikipedia.org/wiki/Mode_(statistics)) 始终很重要。
有各种波峰和深谷,但看图表您不能得出波动更快的结论。
的确,编译器生成的代码是不同的,但没有到这种程度,你可以在https://godbolt.org/g/ILw3tg上查看
我注意到 this question which is also comes from Agner Fog in Optimizing software in C++ 的代码中有一个有趣的行为,它简化了数据在缓存中的访问和存储方式(缓存关联性)。解释对我来说很清楚,但后来有人对 volatile
...
也就是说,如果我们在矩阵声明中添加 volatile
限定符:volatile int mat[MATSIZE][MATSIZE];
值 512
的 运行 宁时间显着 减少 :2144 → 1562 微秒
正如我们所知,volatile
阻止编译器缓存该值(在 CPU 寄存器中),并在从程序的 POV 看来不需要时优化访问该值。
一个可能的版本假定计算过程只发生在 RAM 中,并且在 volatile
的情况下不使用 cpu 缓存。但另一方面,价值 513
的 运行 时间再次比 512
少 :1490 μs
...
遗憾的是,我无法确认 volatile 版本 运行ning 更快。我对 volatile 和 non-volatile 版本都进行了测试 运行,两者的时间比较可以在下图中看到。在为了优化代码而测量性能时,采取几个步骤(不仅仅是一两个步骤,而是在数千个范围内)并按照 Alexandrescu 的 Fastware 采用收集数据的模式 (https://en.wikipedia.org/wiki/Mode_(statistics)) 始终很重要。
有各种波峰和深谷,但看图表您不能得出波动更快的结论。
的确,编译器生成的代码是不同的,但没有到这种程度,你可以在https://godbolt.org/g/ILw3tg上查看