Tag: 编译器优化的

为什么std :: fill(0)比std :: fill(1)慢?

我在一个系统上观察到,当设置一个常数值0与一个常量值1或一个dynamic值相比时, std::fill在一个大的std::vector<int>上显着且一致地慢: 5.8 GiB / s vs 7.5 GiB / s 但是,对于更小的数据大小,结果是不同的,其中fill(0)更快: 使用多于一个线程,在4 GiB数据大小时, fill(1)显示的斜率更高,但达到比fill(0) (51 GiB / s vs 90 GiB / s)低得多的峰值: 这引起了第二个问题,为什么fill(1)的峰值带宽要低得多。 这个testing系统是双通道Intel Xeon CPU E5-2680 v3,设置为2.5 GHz(通过/sys/cpufreq ),带有8×16 GiB DDR4-2133。 我testing了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上,内存性能是相同的,而在caching中fill(0)要快得多。 这里是重现的代码: #include […]