web-dev-qa-db-ja.com

CPU周波数を下げるSIMD命令

私はこれを読みます 記事 。なぜAVX-512命令かについて話しました:

Intelの最新のプロセッサには高度な命令(AVX-512)が搭載されているため、コアを使用したり、CPUの残りの部分が、使用する電力量が原因で動作が遅くなる場合があります。

Agnerのブログ でも同様のことを述べていると思います(ただし、正確な投稿が見つかりません)。

Skylakeでサポートされている他のどのような命令が、後でスループットを最大化するために電力を下げるという同様の効果があるのでしょうか。すべてのv接頭辞付きの命令(vmovapdvmulpdvaddpdvsubpdvfmadd213pdなど)?

Xeon Skylake用のC++アプリケーションをコンパイルする際に回避するための手順のリストをコンパイルしようとしています。

18
HCSF

頻度の影響は、使用する命令のwidthおよび命令に依存します。

3つの周波数レベル、いわゆるlicensesがあり、高速から低速までL0、L1、L2です。 L0はボックスに書かれている「公称」速度です。チップに「3.5 GHzターボ」とある場合、それらはシングルコアL0ターボを指します。 L1はAVXターボまたはAVX2ターボとも呼ばれる低速です。5、当初はAVXおよびAVX2命令に関連付けられていました1。 L2はL1よりも低速で、「AVX-512ターボ」と呼ばれることもあります。

各ライセンスの正確な速度は、アクティブなコアの数にも依存します。最新のテーブルについては、通常 WikiChip を参照してください。たとえば、Xeon Gold 5120のテーブルは here です。

Xeon Gold 5120 Frequencies

Normal、AVX2、AVX512の各行は、それぞれL0、L1、L2ライセンスに対応しています。コアの数が増えると、L1およびL2ライセンスの相対的な速度低下は一般に悪化します。1つまたは2つのアクティブコアの場合、L1およびL2の速度はL0の97%および91%ですが、13または14コアの場合は85%です。と62%それぞれ。これはチップによって異なりますが、一般的な傾向は通常同じです。

これらの予備知識はさておき、私があなたが質問していると思うところに行きましょう:どのライセンスがアクティブ化される原因になるか

次の表は、幅とその分類に基づいて、命令の暗黙のライセンスをlightまたはheavyとして示しています。

_   Width    Light   Heavy  
 --------- ------- ------- 
  Scalar    L0      N/A
  128-bit   L0      L0     
  256-bit   L0      L1*    
  512-bit   L1      L2*

*soft transition (see below)
_

したがって、allスカラー(非SIMD)命令とすべての128ビット幅の命令がすぐにわかります2 L0ライセンスでは常にフルスピードで実行されます。

256ビット命令は、それらがlightまたはheavyであるかどうかに応じて、L0またはL1で実行され、512ビット命令は、L1またはL2で同じように実行されます。

それで、この軽くて重いものは何ですか?

軽いvs重い

重い指示を説明することから始めるのが最も簡単です。

重い命令は、FP/ [〜#〜] fma [〜#〜] ユニットで実行する必要があるすべてのSIMD命令です。基本的には、FP命令(通常、psまたはpdで終わるもの、addpdのようなもの)の大多数です整数 SIMD整数乗算は実際にはSIMDユニットで実行されるため、主にvpmulまたはvpmadで始まる乗算命令、および明らかに実行されるvplzcnt(q|d) FMAユニット。

それを考えると、軽い指示が他のすべてです。特に、乗算、論理命令、シャッフル/ブレンド(FPを含む)、SIMDのロードとストア以外の整数演算は簡単です。

トランジション

Heavy列のL1およびL2エントリは、_L1*_のようにアスタリスクでマークされています。これは、これらの命令が発生するとsoft遷移が発生するためです。他のL1エントリ(512ビットlight命令用)はハード遷移を引き起こします。ここでは、2つの遷移タイプについて説明します。

ハードトランジション

指定されたライセンスの命令が実行されるとすぐにハード遷移が発生します4。 CPUは停止し、いくつかの 停止サイクル を取り、新しいモードに入ります。

ソフトトランジション

ハード遷移とは異なり、ソフト遷移は、命令が実行されてもすぐには発生しません。むしろ、命令は最初は、周波数を変更せずに、スループットを低下させて(通常の速度の1/4)実行します。 「十分な」重い命令が実行されているとCPUが判断した場合単位時間あたり特定のしきい値に達すると、番号が大きいライセンスへの移行が発生します。

つまり、CPUは、少数の重い命令しか到着しない場合、または多くの命令が到着してもdenseでない場合、他の重いでない命令を検討する場合、頻度を減らす価値がないことを理解しています。

ガイドライン

上記を踏まえ、合理的なガイドラインを確立することができます。ライセンス関連の命令が発生することはないため、128ビット命令を恐れる必要はありません。 ダウンクロック。

さらに、ダウンクロックを引き起こさないため、light 256ビット幅の命令についても心配する必要はありません。多くのベクトル化されたFP=数学を使用していない場合は、重い命令を使用している可能性が低いため、これは当てはまります。実際、コンパイラはすでに256ビット命令を自由に挿入しています適切な_-march_オプションを使用する場合、特にデータ移動と自動ベクトル化ループの場合。

重いAVX/AVX2命令と軽いAVX-512命令を使用することは、L1ライセンスで実行するため、よりトリッキーです。プロセスのごく一部(たとえば10%)だけが利用できる場合、アプリケーションの残りの部分を遅くする価値はないでしょう。 L1に関連するペナルティは一般的に中程度ですが、チップの詳細を確認してください。

L2ライセンスにはほとんどのチップで重大な周波数ペナルティが伴うため、AVX-512の重い命令を使用するとさらにトリッキーになります。一方、FPと整数乗算命令のみがheavyカテゴリに分類されるため、実際には整数512-ビット幅で使用すると、L1ライセンスのみが発生します。


1 後で説明するように、AVX-512命令は速度をこのライセンスに設定でき、一部のAVX/2命令はそうしないため、これは少し誤った名称です。

2 128ビット幅とは、xmmレジスタを使用することを意味します。regardlessそれらが導入された命令セット-メインストリームAVX-512には、ほとんどすべての新しい命令に対応する128ビットバリアントが含まれています。

 イタチ句に注意してくださいライセンス関連-サーマル、電力、または電流制限などの他のダウンクロックの原因が確実に発生する可能性があり、128ビット命令がこれをトリガーする可能性がありますが、デスクトップまたはサーバーシステムではほとんどありません(低電力、スモールフォームファクターデバイスは別の問題です)。

4 明らかに、我々は、例えば、ハード遷移L1命令が実行されるときのL0からL1への上位レベルライセンスへの遷移についてのみ話している。すでにL1またはL2にいる場合は何も起こりません-すでに同じレベルにいて、特定の指示に基づいて低い番号のレベルに移行せず、指示なしに一定時間実行している場合、移行はありませんより高い番号のレベル。

5 2つのうちAVX2 turboの方が一般的ですが、256ビット命令はAVX2と比較してAVXに関連付けられているため、ほとんど理解していませんheavy実際にトリガーする命令AVX turbo(L1ライセンス)は、実際にはAVX2ではなくAVX内のFP命令です。唯一の例外はAVX2整数乗算です。

24
BeeOnRope

重要なのは命令ニーモニックではなく、重要なのは512ビットのベクトル幅ですべてです

256ビットバージョンのAVX-512VL命令を使用できます。 vpternlogd ymm0, ymm1, ymm2 AVX-512ターボペナルティを発生させることなく。

関連: 不正なAVX-512命令が実行されている場所を動的に決定 は、glibc initコード内の1つのAVX-512命令または何かが残りの部分の最大ターボを妨害するダーティな上部ZMMを残した場合についてですプロセスの寿命。 (またはvzeroupper多分まで)

256ビットFP数学命令の軽度/重度の使用によるターボインパクトその他が存在する可能性がありますが、その一部は熱によるものです。しかし、通常、最新のCPUでは256ビットの価値があります。

とにかく、これがgcc -march=skylake-avx512のデフォルトは-mprefer-vector-width=256。どのようなワークロードでも、試してみる価値はあります-mprefer-vector-width=512と128も有効な自動ベクトル化が可能な作業量に応じて128です。

GCCにCPUを調整するように伝えます(例:-march=native)そしてうまくいけば良い選択をするでしょう。デスクトップSkylake-Xでは、ターボペナルティはXeonよりも小さくなっています。コードが実際に512ビットのベクトル化の恩恵を受ける場合、ペナルティを支払う価値はあります。

(また、SkylakeファミリCPUが512ビットのベクターモードに入る他の主要な効果にも注意してください。ポート1のベクターALUがシャットダウンされるため、popcntaddのようなスカラー命令のみがポートを使用できます1.したがって、vpandvpaddbなどのスループットは、1クロックあたり3から2に低下します。また、2つの512ビットFMAユニットを備えたSKXを使用している場合は、ポート5に1つ追加すると電力が供給されますしたがって、FMAはシャッフルと競合します。)

8
Peter Cordes