gcc选项同时使用i87,AVX但也不使用SSE

时间:2012-12-05 12:27:25

标签: gcc sse instruction-set avx fpu

针对支持AVX扩展名的处理器进行编译时(例如-m64 -march=corei7-avx -mtune=corei7-avx适用),同时使用-mfpmath=both -mavx键是否有意义?是不是因为它导致编译器同时使用三组指令(i87SSEAVX)?或者只是i87用于标量(在某种意义上)和AVX仅用于向量?

2 个答案:

答案 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)寄存器之间反弹数据。只是将一些常量保留在内存中会更好。