2016-07-04 30 views
4

私はいくつかのintel-intrinsincsで書かれたCコードを持っていました。最初にavxでコンパイルした後、ssse3フラグでコンパイルした後、2つの全く異なるアセンブリコードが得られました。例えば:新しいAVX命令の構文

AVX:

vpunpckhbw %xmm0, %xmm1, %xmm2 

SSSE3:

movdqa %xmm0, %xmm2 
punpckhbw %xmm1, %xmm2 

それはvpunpckhbwがちょうどpunpckhbwが、AVX 3つのオペランドの構文を使用していることは明らかです。しかし、最初の命令のレイテンシとスループットは、最後のもののレイテンシとスループットに相当しますか? 答えは私が使用しているアーキテクチャに依存しますか? It's IntelCore i5-6500ところで。

私はAgner Fogの指示表で回答を検索しようとしましたが、回答が見つかりませんでした。 Intelの仕様も助けにはなりませんでした(しかし、私が必要としていたものを見逃した可能性が高いです)。

可能であれば、新しいAVX構文を使用する方が良いですか?

+5

* mov al、8 * :-)の昔のことをしばらくお待ちください。 – Neil

+2

@Neil Ohはい、私は 'rep movsb'がSIMDとみなされた日を待っています。 – fuz

+1

AVXをサポートする必要がある場合は、実行時に旧タイプの(非VEX)SSE命令とVEXでエンコードされたSSE/AVX命令を切り替える際のパフォーマンス上のペナルティがあるため、 。したがって、それは「すべてか何か」です。 –

答えて

4

できるだけ新しいAVX構文を使用する方が良いですか?

最初の質問は、フォルダの命令が非フォルダの命令のペアよりも優れているかどうかを確認することです。アイビーブリッジ移動命令を登録するためのレジスタがゼロレイテンシーを持つことができ、使用することができますので、折り畳みは、読み取りのペアを取り、この

vmovdqa %xmm0, %xmm2 
vpunpckhbw %xmm2, %xmm1, %xmm1 

と組み合わせて1つの命令

vpunpckhbw %xmm0, %xmm1, %xmm2 

に「ひだ」、それらを同じよう指示を変更します実行ポートはゼロです。しかし、展開されていない命令ペアは、依然としてフロントエンド上で2つの命令としてカウントされるため、全体のスループットに影響する可能性があります。しかし、折り畳まれた命令はフロントエンドの1つの命令としてカウントされるだけで、フロントエンドの負担を軽減します。これにより、全体のスループットが向上する可能性があります

しかし、フロントエンドの圧力を下げても、メモリを移動させるために、折りたたみ式のには副作用があります(現在はsome debateがあります)。その理由は、フロントエンドの観点からのアウト・オブ・オーダー・エンジンは、(this answerが正しいと仮定して)折りたたまれた命令しか見ておらず、なんらかの理由でメモリ読み出し操作を並べ替えることが最適である場合(なぜなら実行ポートを必要とし、待ち時間を有する)、折り畳まれた命令における他の動作とは独立して、アウトオブオーダーエンジンはこれを利用することができない。私は初めてこれを観察したhere

特定の操作では、AVX構文はレジスタをフォールドして移動を登録するので常に優れています。しかし、登録するメモリがあれば、フォルダーのAVX命令は展開されていないSSE命令のペアよりも悪い場合があります。


一般的に、vexでエンコードされた命令を使用する方がよいことに注意してください。しかし、私はすべてのコンパイラではないにしても、折り畳みが常に優れていると考えているので、組み込み(組み込み関数ではない)を除いて、あるいはAVXでコンパイルしないようにコンパイラに指示することを除いて、

+1

はい、reg-regの 'mov'命令を避けるために、VEXエンコーディングの非破壊的なデスティネーション機能を使う方が良いでしょう。私は「折りたたみ」が正しいことだとは思っていません。実際に「movdqa」命令とALU操作を組み合わせることを考えているのは間違った精神的な絵です。レジスタの名前変更は、 'punpckhbw%xmm1、%xmm2'の結果がいずれかの入力とは別の物理レジスタに既に書き込まれていたため、ALU命令に負荷をフォールディングするようなものではありません。用語については、「mov削除」も既に行われています。/ –

+2

Sandy Bridge Processorで「何を意味するのかわかりません...reg-regの場合でも、[3オペランド]命令が悪くなる可能性があります。これは間違っています、あなたが取り除いているmovdqaが、 (IvB以降ではない)Snex上の実行ポートを取り、それを避けるためにVEXエンコーディングが勝っている。 –

+0

@PeterCordes、あなたはSandy Bridgeに対する私のコメントについて完全に正しい。メモリ読み取り/書き込みに適用されるmicro-op fusionを意味しますが、私は、折り畳みがうまくいけば、折り畳みがうまくいくと思います。 –

関連する問題