为什么std :: fill(0)比std :: fill(1)慢?
我在一个系统std::fill上观察到,与恒定值或动态值相比,将恒定值std::vector<int>设置为大时显着且始终较慢:01 5.8 GiB /秒和7.5 GiB /秒 但是,对于较小的数据,结果会有所不同,但fill(0)速度更快: 如果有多个线程,则在4 GiB数据大小下,fill(1)斜率更高,但峰值要低得多fill(0)(51 GiB / s与90 GiB / s): 这就提出了第二个问题,即为什么峰值带宽 fill(1)这么低。 为此的测试系统是双插槽Intel Xeon CPU E5-2680 v3,设置为2.5 GHz(通过/sys/cpufreq),带有8x16 GiB DDR4-2133。我使用GCC 6.1.0(-O3)和Intel编译器17.0.1(-fast)进行了测试,两者均得到相同的结果。GOMP_CPU_AFFINITY=0,12,1,13,2,14,3,15,4,16,5,17,6,18,7,19,8,20,9,21,10,22,11,23被设定。Strem / add / 24线程在系统上的速度为85 GiB / s。 我能够在不同的Haswell双套接字服务器系统上重现这种效果,但在任何其他体系结构上均无法重现。例如,在Sandy Bridge EP上,内存性能是相同的,而在高速缓存fill(0)中则要快得多。 这是要重现的代码: #include <algorithm> #include <cstdlib> #include <iostream> #include <omp.h> #include <vector> using value = …