问题的目的是询问与程序行为有关的可能原因,作为icc 2019编译标志的函数,考虑两种现象和以下注释中提供的信息。
一个程序可以运行三种类型的模拟,我们将它们命名为S1
、S2
和S3
。
该程序在Intel Xeon Gold 6126节点上编译(并运行),具有以下行为,表示为
A ± B
其中A
是平均时间,B
是标准偏差,单位为微秒。
使用-O3
:编译时
S1
:104.7612±108.7875EDIT: it's 198.4268 ± 3.5362
S2
:3.8355±1.3025EDIT: it's 3.7734 ± 0.1851
S3
:11.8315±3.5765EDIT: it's 11.4969 ± 1.313
使用-O3 -march=native
:编译时
S1
:102.0844±105.1637EDIT: it's 193.8428 ± 3.0464
S2
:3.7368±1.1518EDIT: it's 3.6966 ± 0.1821
S3
:12.6182±3.2796EDIT: it's 12.2893 ± 0.2156
使用-O3 -xCORE-AVX512
:编译时
S1
:101.4781±104.0695EDIT: it's 192.977±3.0254
S2
:3.722±1.1538EDIT: it's 3.6816 ± 0.162
S3
:12.3629±3.3131EDIT: it's 12.0307 ± 0.2232
两个结论:
-xCORE-AVX512
生成的代码比-march=native
更具性能- 该程序的模拟称为S3,在编译时考虑到该体系结构会降低其性能
注1:标准偏差很大,但重复测试的平均值总是相似的,从而保持总体排名不变。
注2:代码运行在24个处理器上,Xeon Gold 6126有12个物理内核。它是超线程化的,但每个内核的两个线程并不共享内存。
注3:CCD_;"非常连续";,即不能被矢量化。
没有MWE。抱歉,代码太大,无法在此处发布。
编辑:与印刷品相关的异常值是造成大偏差的原因。手段略有改变,但趋势和等级制度依然存在。
您的前提是错误的。所有情况下的差异都只是一个标准偏差的一小部分。统计上显著的结果通常是>2个标准偏差。
当然,如果我们看到104.7612 ± 108.7875
的持续时间,我们就知道预期的运行时不能正态分布,因为这意味着>在比赛开始前完成比赛的几率为16%!(负运行时)。但也有其他具有长尾的分布,其中标准偏差可能大于平均值。在不知道确切分布的情况下>2个标准偏差";经验法则成立,但<0.1标准差的差异绝对不显著。
[编辑]新的数字是S1相差约3西格玛,S2相差约05西格玛,S3相差约1.2西格玛。就个人而言,这仍然没有定论,而且仍然没有足够的代码来说明是否存在相关性。当然不能简单地把它们加起来,但即使你加起来了,你仍然不会达到2西格玛。
评论中列出了一个可接受的可能解释,内容如下:
代码生成的调优选择之间的微小差异可能会导致最终变得更加重要的对齐差异。尤其是我该怎么做减轻英特尔jcc勘误表对gcc的影响?关于Skylake家族CPU,如果-march=本机或-xCORE-AVX512未启用解决方法选项
进一步阅读:
32字节对齐的例程不适合uops缓存
英特尔JCC勘误表-JCC真的应该单独处理吗?