同じ時代遅れの「フロップ」の定義に従ってフロップの数をカウントするのではなく、コードがFPUにどの程度バインドされているか、またはFPUをどれだけ効果的に使用しているかを評価する方法が必要なようです。つまり、すべての浮動小数点ユニットがサイクルごとにフルキャパシティで実行されている場合、同じピークに到達するメトリックが必要です。Intel Sandy Bridgeを見て、これがどのように揺れるかを見てみましょう。
ハードウェアでサポートされている浮動小数点演算
このチップはAVX命令をサポートしているため、レジスタは32バイト長です(4つの倍精度を保持)。スーパースカラーアーキテクチャでは、命令を重複させることができます。ほとんどの算術命令は、新しい命令が次のサイクルで開始できる場合でも、完了するまでに数サイクルかかります。これらのセマンティクスは通常、レイテンシ/逆スループットを記述することで省略されます。5/ 2の値は、命令が完了するのに5サイクルかかることを意味しますが、1サイクルごとに新しい命令を開始できます(オペランドが利用可能で、データがない場合)依存関係とメモリを待っていません)。
コアあたり3つの浮動小数点演算ユニットがありますが、3番目は説明に関係ありません。主な機能は加算と乗算であるため、関連する2つをAおよびMユニットと呼びます。手順の例(Agner Fogの表を参照)
vaddpd
:パックド加算、1サイクルの間ユニットAを占有、レイテンシー/逆スループットは3/1
vmulpd
:パックド乗算、ユニットM、5/1
vmaxpd
:パックドセレクトペアワイズマキシム、ユニットA、3/1
vdivpd
:パックド除算、ユニットM(および一部のA)、入力に応じて21/20〜45/44
vsqrtpd
:パックされた平方根、一部のAおよびM、入力に応じて21/21から43/43
vrsqrtps
:単精度入力用のパックされた低精度逆数平方根(8 floats
)
重複する可能性がvdivpd
ありvsqrtpd
、明らかに微妙でわかりにくいものの正確なセマンティクスは、どこにも文書化されていません。ほとんどの用途では、オーバーラップの可能性はほとんどないと思いますが、マニュアルの文言では、複数のスレッドがこの命令でオーバーラップの可能性を高める可能性があることを示唆しています。サイクルごとに開始し、サイクルごとに合計8フロップするvaddpd
と、フロップのピークに達する可能性がありvmulpd
ます。密行列-行列乗算(dgemm
)は、このピークにかなり近づくことができます。
特別な命令のためにフロップを数えるとき、私はFPUのどれだけが占有されているかを見ます。入力範囲内で、vdivpd
完了に平均24サイクルを要し、ユニットMを完全に占有しているが、(使用可能な場合は)加算を半サイクル同時に実行できるとの引数を想定します。FPUは、これらのサイクル中に24個のパックされた乗算と24個のパックされた加算(完全インターリーブvaddpd
およびvmulpd
)vdivpd
を実行できますが、a を使用すると、12個の追加のパック加算ができます。除算を行うための最良の方法がハードウェア(合理的)を使用することであると想定する場合vdivpd
、36個の「フロップ」としてカウントし、各スカラー除算を36個の「フロップ」としてカウントする必要があることを示します。
相互平方根を使用すると、特に完全な精度が必要ない場合や、入力範囲が狭い場合に、ハードウェアを破ることができる場合があります。前述のように、vrsqrtps
命令は非常に安価であるため、(単精度の場合)vrsqrtps
1回実行した後、1回または2回のニュートン反復を実行してクリーンアップできます。これらのニュートン反復は
y *= (3 - x*y*y)*0.5;
これらの操作の多くを実行する必要がある場合、これはの単純な評価よりも大幅に高速になりy = 1/sqrt(x)
ます。ハードウェア近似の逆平方根が利用可能になる前は、パフォーマンスに敏感なコードのいくつかは、悪名高い整数演算を使用して、ニュートン反復の初期推定値を見つけていました。
ライブラリが提供する数学関数
ライブラリが提供する数学関数に同様のヒューリスティックを適用できます。SSE命令の数を決定するためにプロファイルを作成できますが、これまで説明したように、それはストーリー全体ではなく、特別な機能の評価にすべての時間を費やすプログラムはピークに近づかないように見えるかもしれませんが、そうではありませんすべての時間がFPUの制御外に費やされていることを伝えるのに役立ちません。
ベースラインとして優れたベクトル数学ライブラリを使用することをお勧めします(たとえば、インテルのVML、MKLの一部)。各コールのサイクル数を測定し、そのサイクル数で達成可能なピークフロップを掛けます。そのため、パックされた指数関数の評価に50サイクルかかる場合、100フロップ×レジスタ幅としてカウントします。残念ながら、ベクトル数学ライブラリは呼び出すのが困難な場合があり、すべての特別な機能を備えていないため、スカラー計算を行うことになります。その場合、仮想スカラー指数を100フロップとしてカウントしますサイクルなので、これらの指数関数の評価にすべての時間が費やされた場合にのみ、「ピーク」の25%が得られます。
他の人が述べたように、PAPIまたはさまざまなインターフェイスを使用して、サイクルとハードウェアイベントカウンターをカウントできます。単純なサイクルカウントでrdtsc
は、インラインアセンブリのスニペットを使用して命令を使用して、サイクルカウンターを直接読み取ることができます。