针对支持AVX
扩展名的处理器进行编译时(例如-m64 -march=corei7-avx -mtune=corei7-avx
适用),同时使用-mfpmath=both -mavx
键是否有意义?是不是因为它导致编译器同时使用三组指令(i87
,SSE
,AVX
)?或者只是i87
用于标量(在某种意义上)和AVX
仅用于向量?
答案 0 :(得分:5)
AVX寄存器只是SSE寄存器的扩展。你不能混合使用SSE和AVX指令来增加可用寄存器的数量(你仍然可以混合x87和AVX指令,我认为这是-mfpmath=both
在这种情况下的作用。)
例如,请参阅this页面上的“混合AVX和SSE”讨论。
答案 1 :(得分:3)
你通常不想要这个;我不认为gcc在决定使用x87时会非常聪明,因为它有很高的注册压力值得它。
x87和SSE / AVX指令在普通的x86 CPU(Intel和AMD)上竞争相同的FP执行单元,因此交错它们不会获得更多的吞吐量。
通常情况下,您应该使用-mfpmath=sse
(这意味着AVX与-mavx
一起使用,或更好-mfpmath=sse -march=native
。x86-64的默认值为sse
,因此{{ 1}}只更改-mfpmath=sse
,AFAIK的任何内容。
-m32
的主要好处是更多的总寄存器,但管理x87寄存器堆栈通常需要额外的指令。在x87和AVX之间移动数据也需要存储/重新加载(存储转发往返,Haswell上的约6个周期延迟,http://agner.org/optimize/),因此只有在编译器有两个独立的计算集时它才真正有用。交错。否则它不会比正常的溢出/重装更好。
Last time I looked at gcc -O3 -mfpmath=both
,结果并不令人印象深刻:https://godbolt.org/g/p2KLEC显示gcc5.4使用一些存储/重新加载来在x87和xmm(AVX)寄存器之间反弹数据。只是将一些常量保留在内存中会更好。