3

当为支持AVX扩展的处理器编译时(比如说适用),同时使用键-m64 -march=corei7-avx -mtune=corei7-avx是否有意义?-mfpmath=both -mavx这不是导致编译器同时使用三组指令(i87, SSE, AVX)吗?还是仅i87针对标量(在某种意义上)和AVX仅针对向量?

4

2 回答 2

5

AVX 寄存器只是 SSE 寄存器的扩展。您不能混合使用 SSE 和 AVX 指令来增加可用寄存器的数量(您仍然可以混合使用 x87 和 AVX 指令,我认为这就是-mfpmath=both这种情况下的作用)。

例如,参见本页上的“混合 AVX 和 SSE”讨论。

于 2012-12-05T12:37:41.843 回答
3

你通常不想要这个;我认为 gcc 在注册压力很大时决定使用 x87 时不够聪明以使其值得。

x87 和 SSE/AVX 指令在普通 x86 CPU(Intel 和 AMD)上竞争相同的 FP 执行单元,因此您不会从交错中获得更多吞吐量。

通常你应该只使用-mfpmath=sse(这意味着 AVX 与-mavx, 或更好一起使用时-mfpmath=sse -march=native。x86-64 的默认值是sse,所以-mfpmath=sse只更改-m32AFAIK 的任何内容。

的主要好处-mfpmath=both是更多的总寄存器,但管理 x87 寄存器堆栈通常需要额外的指令。在 x87 和 AVX 之间移动数据也需要存储/重新加载(存储转发往返,Haswell 上约 6 个周期延迟,http://agner.org/optimize/),所以只有当你有两个独立的集合时它才真正有用编译器交错的计算。否则,它并不比正常的溢出/重新加载好。

上次我查看时gcc -O3 -mfpmath=both,结果并不令人印象深刻:https : //godbolt.org/g/p2KLEC 显示 gcc5.4 使用一些存储/重新加载在 x87 和 xmm (AVX) 寄存器之间反弹数据。将一些常量保留在内存中会更好。

于 2018-04-25T11:13:42.647 回答