8

可変シフトは、で部分的なレジスタストール(またはレジスタ再結合µops)を生成できますecxか?もしそうなら、どのマイクロアーキテクチャに?

私はこれをCore2(65nm)でテストしましたが、これは読み取り専用のようclです。

_shiftbench:
    push rbx
    mov edx, -10000000
    mov ecx, 5
  _shiftloop:
    mov bl, 5   ; replace by cl to see possible recombining
    shl eax, cl
    add edx, 1
    jnz _shiftloop
    pop rbx
    ret

で置き換えmov bl, 5mov cl, 5も違いはありませんでした。これは、レジスタの再結合が行われている場合に発生します。これは、で置き換えることで実証できますshl eax, cladd eax, ecx私のテストでは、の代わりaddに書き込みを行うと、バージョンが2.8倍遅くなりました)。clbl


試験結果:

  • メロム:ストールは観察されません
  • ペンリン:ストールは観察されません
  • ネハレム:失速は観察されなかった

更新:shrxハスウェルのシフトの新しいグループは、そのストールを示していますshift-count引数は8ビットレジスタとして記述されていないため、予想されていたかもしれませんが、テキスト表現は実際にはそのようなマイクロアーキテクチャの詳細については何も述べていません。

4

1 に答える 1

5

現在表現されているように(「CLレジスタを使用してシフトできますか…」)、質問のタイトルには独自の答えが含まれています。最新のプロセッサでは、CLを小さいものから再結合できないため、CLで部分的なレジスタストールが発生することはありません。

はい、プロセッサは、シフトしている量がCLに効果的に含まれていることを認識しています。正確には、CLの最下位5ビットまたは6ビットです。ECXで停止する可能性のある1つの方法は、命令の依存関係を考慮した粒度が完全なレジスタを下回らない場合でした。ただし、この心配は時代遅れです。ECXレジスタ全体を依存関係と見なす最新のIntelプロセッサはPentium4でした。121ページのAgnerFogの非公式最適化マニュアルを参照してください。ただし、P4では、これは部分的とは呼ばれません。ストールを登録すると、プログラムは誤った依存関係の犠牲になる可能性があります(たとえば、CHがシフトの直前に修飾子であった場合)。

于 2012-11-08T22:06:03.373 に答える