AVX
拡張機能をサポートするプロセッサ用にコンパイルされた場合(たとえば適用可能)、キーを同時に-m64 -march=corei7-avx -mtune=corei7-avx
使用することは理にかなっていますか?コンパイラが3セットの命令( 、、 )を同時に-mfpmath=both -mavx
使用するほどではありませんか?または、スカラー(ある意味で)とベクトルのみの場合はどうでしょうか。i87
SSE
AVX
i87
AVX
2 に答える
AVXレジスタは、SSEレジスタの拡張にすぎません。SSE命令とAVX命令を組み合わせて、使用可能なレジスターの数を増やすことはできません(x87命令とAVX命令を混在させることはできますが-mfpmath=both
、この場合はこれが行われると思います)。
たとえば、このページの「AVXとSSEの混合」の説明を参照してください。
通常、これは必要ありません。gccは、レジスターのプレッシャーが高く、価値がある場合にx87を使用することを決定するのに十分賢いとは思いません。
x87およびSSE/AVX命令は、通常のx86 CPU(IntelおよびAMD)で同じFP実行ユニットをめぐって競合するため、それらをインターリーブしてもスループットが向上することはありません。
通常は、を使用する必要があります(これは、、またはそれ以上-mfpmath=sse
で使用する場合はAVXを意味します。x86-64のデフォルトは、であるため、AFAIKのすべてを変更するだけです。-mavx
-mfpmath=sse -march=native
sse
-mfpmath=sse
-m32
の主な利点は-mfpmath=both
、レジスタの総数が増えることですが、x87レジスタスタックの管理には、多くの場合、追加の命令が必要です。x87とAVXの間でデータを移動するには、ストア/リロード(ストア転送ラウンドトリップ、Haswellで最大6サイクルのレイテンシ、http://agner.org/optimize/)もかかるため、2つの独立したセットがある場合にのみ非常に役立ちます。コンパイラがインターリーブするための計算。それ以外の場合は、通常のスピル/リロードよりも優れていません。
前回見たgcc -O3 -mfpmath=both
とき、結果は印象的ではありませんでした。https : //godbolt.org/g/p2KLECは、gcc5.4がいくつかのストア/リロードを使用してx87とxmm(AVX)レジスタ間でデータをバウンスすることを示しています。定数の一部をメモリに保持する方がよいでしょう。