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

C++ 编译器优化如何影响缓存不友好算法?,c++,optimization,volatile,cpu-cache,C++,Optimization,Volatile,Cpu Cache,我注意到代码中有一个有趣的行为,它也是来自Agner Fog in,它简化了数据在缓存中的访问和存储方式(缓存关联性)。这些解释对我来说很清楚,但后来有人ping了一下volatile。。。 也就是说,如果我们在矩阵声明中添加volatile限定符:volatile int mat[MATSIZE][MATSIZE]值512的运行时间大大减少的运行时间:2144→ 1562μs 正如我们所知,volatile阻止编译器缓存该值(在CPU寄存器中),并在程序的POV看来不必要时优化对该值的访问 一

我注意到代码中有一个有趣的行为,它也是来自Agner Fog in,它简化了数据在缓存中的访问和存储方式(缓存关联性)。这些解释对我来说很清楚,但后来有人ping了一下
volatile
。。。 也就是说,如果我们在矩阵声明中添加
volatile
限定符:
volatile int mat[MATSIZE][MATSIZE]
512的运行时间大大减少
的运行时间:2144→ 1562μs

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


一种可能的版本假设计算过程只发生在RAM中,在
volatile
的情况下不使用cpu缓存。但另一方面,value
513
的运行时间再次小于
512
1490μs

不幸的是,我无法确认易失性版本运行得更快。我对volatile和non-volatile版本进行了测试运行,下面的图表中可以看到两者的时间比较。当为了优化代码而测量性能时,采取几个步骤(不仅仅是一个或两个步骤,而是数千个步骤)并按照Alexandrescu的Fastware采用收集数据的模式()总是很重要的

有各种各样的峰值和深谷,但看图表,你不能得出波动更快的结论


事实上,编译器生成的代码是不同的,但没有达到这样的程度,您可以在

上查看它。不幸的是,我无法确认volatile版本是否运行得更快。我对volatile和non-volatile版本进行了测试运行,下面的图表中可以看到两者的时间比较。当为了优化代码而测量性能时,采取几个步骤(不仅仅是一个或两个步骤,而是数千个步骤)并按照Alexandrescu的Fastware采用收集数据的模式()总是很重要的

有各种各样的峰值和深谷,但看图表,你不能得出波动更快的结论


事实上,编译器生成的代码是不同的,但并没有达到这样的程度,您可以在

上查看它,这听起来像是测试错误/噪音。根据您的体系结构和操作系统,不同的虚拟内存可以具有不同的缓存特性。尤其是对于这样的测试。重要的是,一个好的基准测试在各种虚拟地址上测试操作,以确保它不会被一个棘手的VM补丁严重扭曲。就是说,;您分配了大量内存,然后在该分配中以不同的偏移量运行测试。纯粹的推测:volatile的引入可能会产生更多的内存访问,从而影响缓存替换行为(即,缓存线可能最近被访问,因此在下次使用之前不会被逐出).听起来像是测试错误/噪音。根据您的体系结构和操作系统,不同的虚拟内存可以具有不同的缓存特性。尤其是对于这样的测试。重要的是,一个好的基准测试在各种虚拟地址上测试操作,以确保它不会被一个棘手的VM补丁严重扭曲。就是说,;您分配了大量内存,然后在该分配中以不同的偏移量运行测试。纯推测:volatile的引入可能会产生更多内存访问,从而影响缓存替换行为(即,缓存线可能是最近访问的,因此在下次使用之前不会被逐出)。