11

AVXの導入に伴い、IntelはVEXエンコーディングスキームをIntel64およびIA-32アーキテクチャに導入しました。このエンコード方式は、主にAVX命令で使用されます。VEXでエンコードされた命令と現在「レガシーSSE」命令と呼ばれている命令を混在させても大丈夫かどうか疑問に思いました。

私がこの質問をする主な理由は、コードサイズです。次の2つの手順を検討してください。

shufps xmm0, xmm0, 0
vshufps xmm0, xmm0, xmm0, 0

私は通常、最初のものを使用して、XMMレジスタ内のすべての場所にスカラー値を「ブロードキャスト」します。ここで、命令セットは、これら2つ(この場合)の唯一の違いは、VEXでエンコードされたものがYMMレジスタの上位(> = 128)ビットをクリアすることです。私がそれを必要としないと仮定すると、この場合、VEXでエンコードされたバージョンを使用する利点は何ですか?最初の命令は4バイト(0FC6C000)、2番目の命令は-5(C5F8C6C000)を取ります。

事前にすべての回答をありがとう。

4

2 に答える 2

12

現在の実装では、(少なくとも)上半分がリセットされている場合(VZEROUPPERまたはVZEROALL)、レガシーSSE命令を使用してもペナルティはありません。

Agner Fog:アセンブリ内のサブルーチンの最適化の128ページで詳しく説明されているように、(一部の)上半分が使用されているときにレガシーSSE命令を使用すると、パフォーマンスが低下します。このペナルティは、YMMレジスタが途中で分割される状態に入るときに一度発生し、その状態を離れるときにもう一度発生します。

VEXでエンコードされた128ビット命令とレガシーSSE命令を混在させることは問題ではありません。

于 2012-06-02T22:07:45.323 に答える
-1

安全ではありません。Intelのソフトウェア開発者マニュアルによると、VEX.128バージョンはYMMレジスタの上半分をゼロにしますが、レガシーSSEバージョンはそうではありません。最悪の事態:一部のアセンブラ(ガスなど)は、オブジェクトファイルの作成中に(フラグが適用されている場合)に変換SHUFPSされる場合があります。アセンブリファイルでの作業とまったく同じ問題が見つかりました。VSHUFPS-mavx

于 2017-01-13T01:21:21.377 に答える