標準ライブラリのの計算コストはいくらですか?


26

分子シミュレーションで対処しなければならない主要な問題の1つは、距離に依存する力の計算です。我々は、分離距離の偶数乗持っている力と距離の機能を制限することができた場合は、そして私たちは、距離の二乗を計算することができ心配する必要はありません。ただし、奇数のべき乗がある場合は、を処理する必要があります。rr2=rrrr=r2

私の質問は、共通言語(C / C ++、Fortran、Python)などのライブラリに実装されている計算はどれくらい高価ですか?特定のアーキテクチャ向けにコードを手動で調整することで、本当に多くのパフォーマンスの改善が必要ですか?x

回答:


39

moynerの答えの拡張として、オンチップsqrtは通常、rsqrtを計算する逆数平方根です。したがって、コード内でのみを使用する場合(分子動力学を行う場合はそうです)、直接計算して除算を保存できます。の代わりに計算される理由は、そのニュートン反復には除算がなく、加算と乗算のみがあるためです。a1/a1/rr = rsqrt(r2)rsqrtsqrt

補足として、除算も反復的に計算されrsqrt、ハードウェアとほぼ同じくらい遅いです。効率を求めている場合は、余分な部門を削除することをお勧めします。

IBMのPOWERアーキテクチャーなどのいくつかのより新しいアーキテクチャーrsqrtそれ自体ではありませんが、FRSQRTEのように数ビットまで正確な見積もりを提供します。ユーザーがを呼び出すとrsqrt、これにより、推定値が生成され、その後、通常の乗算​​と加算を使用して、ニュートンまたはゴールドシュミットのアルゴリズムが1回または2回(必要なだけ)反復されます。このアプローチの利点は、反復ステップがパイプライン化され、FPUをブロックせずに他の命令とインターリーブできることです(このアーキテクチャの非常に優れた概要については、古いアーキテクチャですが、Rolf StrebelのPhD Thesisを参照してください)。

相互作用ポテンシャルの場合、sqrtポテンシャル関数の多項式補間を使用することで操作を完全に回避できますがmdcoreこの領域での自分の作業(で実装)は、少なくともx86タイプのアーキテクチャでは、sqrt命令が十分に速いことを示しています。

更新

この答えはかなり注目を集めているようですので、あなたの質問の2番目の部分にも対処したいと思いますsqrt

分子動力学シミュレーション、またはカットオフが制限された相互作用を伴う粒子ベースのシミュレーションのコンテキストでは、近傍検索のためのより良いアルゴリズムから多くを得る必要があります。セルリストなどを使用して隣接セルを検索したり、Verletリストを作成したりすると、多数の誤ったペアワイズ距離が計算されます。素朴なケースでは、検査された粒子ペアの16%のみが実際に互いのカットオフ距離内にあります。そのようなペアについては相互作用は計算されませんが、粒子データにアクセスし、偽のペアワイズ距離を計算するには大きなコストがかかります。

この領域(ここここ、およびここ)での私自身の仕事、および他(例えばここ)の仕事は、これらの偽の計算をどのように回避できるかを示しています。ここで説明されているように、これらの近隣探索アルゴリズムはVerletリストよりも優れています。

私が強調したい点は、基礎となるハードウェアアーキテクチャをより良く理解/活用することで得られる改善があるかもしれませんが、より高いレベルのアルゴリズムを再考することで得られる潜在的に大きな利益があることです。


6
SSE rsqrtpsとAVX vrsqrtpsも推定値であり、最初の11〜12 ビットが正しいので、さらに精度が必要な場合は、ニュートンの反復を1〜2回使用して調整する必要があります。これらは、Sandy Bridgeの5/1および7/1(レイテンシ/逆スループット)命令です(IntelのドキュメントまたはAgner Fogの乗算に相当する命令表を参照してください。これに対して、完全な精度(v)sqrtps(または倍精度(v)sqrtpd)は10-43 / 10-43(詳細については、指示表を参照してください。)
ジェドブラウン

@JedBrown:それを指摘してくれてありがとう!SSEとその拡張機能もこれを提供することを忘れていました。
ペドロ

16

平方根は、ほとんどのプロセッサのハードウェアに実装されています。つまり、特定のアセンブリ命令があり、実装を台無しにするのが非常に難しいため、ほとんどの言語でパフォーマンスは同等です。FSQRT命令は、スマートハードウェアの設計者によって設計されているため、おそらく、FSQRT命令に勝るものはありません。

ハードウェアでの実装方法は異なる場合がありますが、おそらく何らかの固定小数点の反復です。たとえば、必要な桁数が計算されるまで特定の数の反復を行うNewton-Raphsonの方法などです。一般に、ハードウェアでの反復法は、結果の準備ができるまでにいくつかのサイクルを完了する必要があるため、他の操作よりもはるかに遅くなります。

ここにある高速ベクトル計算のためにXMMレジスタで使用できるいくつかのストリーミングSIMD命令もあります。これらのレジスタはかなり小さいですが、既知の数の座標(たとえば、3次元のデカルト座標系)がある場合は、かなり高速になります。

言語のレベルが十分に低い場合、常に低精度に型キャストするか、座標に低精度の数値を使用できます。多くの場合、単精度で十分であり、平方根を計算する場合、反復をより早く終了できるため、私が覚えているよりも速くなります。

さまざまな言語のベンチマークを行うのに十分簡単でなければなりません。長い一連の乱数をファイルに書き込み、さまざまな言語を使用してロードし、平方根の時間を計ります。


0

パフォーマンスが向上する可能性がありますが、最初に、sqrtの逆数の計算がボトルネックであることを知るためにプロファイルを作成する必要があります(たとえば、位置のロードや力の節約ではありません)。

GROMACS MDプロジェクトは、IEEE浮動小数点形式の詳細を活用して、平方根の逆数の許容可能な近似を計算するためのニュートンラプソン反復スキームをシードするというアイデアから生まれました(http:/の付録B.3を参照/www.gromacs.org/Documentation/Manual)が、GROMACSがまだこのアイデアを使用しているHPC CPUは使用されていません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.