それらの長さと、それぞれが単独で実行できるサイクルごとの uop の数によって異なります。
また、ハードウェアの幅にも依存します。例えば
- 2 つの ALU 実行ユニットと 1 クロックあたり 3 つの融合ドメイン uop スループットと比較した PIII。
- 4 つの ALU 実行ユニット (ベクトルを処理できるのはそのうちの 3 つだけ) と、クロックごとに 4 つの融合ドメイン uop スループットを備えた Haswell。
「最もクリティカルな命令」とは、クリティカル パスの長さの大部分を占める命令のことだと思います。ループキャリーの依存関係チェーンが、レイテンシが異なる複数の命令で構成されている場合、それはある種の平均です。(多分幾何平均のような?)
良い例は FP 加算です (例: 配列の合計):
Sandybridge では、スループットは 1 クロックあたり 1 ですが、レイテンシは 3c であるため、従属addps
命令の単一チェーンは 3c あたり 1 uop で実行され、最大 FP 乗算スループットの 1/3 しか維持されません。(そして、他の 2 つの実行ポートは完全に空のままにします。)
3 つの並列 dep チェーンにより、ポート 1 を命令で飽和状態に保つことができaddps
ます。したがって、3 つのアキュムレータを使用すると、3 つのアドを飛行中に維持できます。また、飛行中に 5 つの FP 乗算を維持すると、ポート 0 も飽和させることができます。ループ オーバーヘッドがポート 5 で実行される可能性があります (p01 からサイクルを盗まないことを願っています)。ロード uop は add とマイクロ融合できるため、融合ドメインの帯域幅を消費しません。ただし、ロードの一部を個別のmovaps
命令で実行しても、クロックあたり 4 つの融合ドメイン uop スループットを飽和させることはできませんが、フロントエンドのボトルネックによってスループットが制限される可能性があります。
Haswell の FP add のスループットはクロックごとに 1 つだけですが、FP mul と FMA のスループットはクロックごとに 2 つです。
したがって、FMA (乗数 1.0) を使用して配列を合計する場合、10 個の FMA を飛行させて p01 を飽和させるには、10 個のベクトル アキュムレータ (10 個の dep チェーン) が必要です。p5 と p6 は使用されませんが、マイクロフューズド ロードでロード ポートを飽和させることもできます。
Skylake は、FMA のレイテンシを 1 サイクル減らして 4 まで減らし、FP 追加ユニットを削除しました。(したがって、FP の追加は FMA ユニットで行われ、[v]addps
1c の遅延が発生する代わりに のスループットが 2 倍になります)。
したがって、SKL では、p01 を飽和させるために 8 つのベクトル アキュムレータ (8 つの dep チェーン) のみが必要です。しかし、レジスターを使い果たしない限り、dep チェーンを増やしても問題はありません。したがって、10 個のアキュムレータを使用する Haswell で理想的なコードは、SKL でも理想的であるはずです。ただし、定数ベクトル 1.0 のaddps
代わりに(または何でも) を使用するだけで、電力を節約できるかもしれません。fma213ps
スループット/レイテンシ/ポート番号については、Agner の命令表を参照してください。詳細については、彼の microarch PDF を参照してください。ポート番号やレイテンシー番号はチェックしませんでしたが、この例を何度も入力したので、正しいと確信しています:P.
x86タグ wikiの他のリンクも参照してください。