並列簡約のために数値の非結合性に対処する方法は?


17

並列簡約では、対応する操作が結合的であると仮定します。浮動小数点数の追加については、この仮定に違反しています。なぜ私がこれを気にするのか尋ねるかもしれません。まあ、それは結果の再現性を低下させます。また、シミュレートされたアニーリングを使用して、このような非再現性のある結果を生成するサブルーチンを最適化(またはパラメーターに適合)すると、さらに悪化します。

この問題に対処する一般的な方法は何ですか?次の戦略について何が言えますか?

  • 非再現性を気にしないでください。
  • 浮動小数点数と加算で並列リダクションを使用しないでください。
  • 適切なサイズのワークパッケージを再現可能な方法で作成し、最終的な縮小を手作業で行います。
  • 加算に高精度を使用します(ただし、すべてのコンパイラが高精度の浮動小数点型を提供するわけではありません)。

同じ数のプロセスでの再現性や、異なる数のプロセッサーでの再現性が心配ですか?ビット単位の再現性のためにどれだけのパフォーマンスヒットを引き受けますか?シミュレーテッドアニーリングにのみ興味がありますか?
ジェドブラウン

@JedBrownたとえば、潜在的な問題をデバッグするために、再現可能な結果が得られる可能性が心配です。たとえば、同じ数のプロセッサを使用して(または元々使用されていたプロセッサの数を「知る」だけで)結果を再現する方法があれば大丈夫です。加算自体に高精度の浮動小数点型を使用することに関連するパフォーマンスヒットを喜んで受け取ります。私の具体的な問題は、シミュレートされたアニーリングと予期しない違いにほとんど関連していましたが、これらはすべて本当のバグであることが判明しました。
トーマスクリンペル

回答:


15

MPI_Allreduce()MPI-2.2規格のセクション5.9.1に記載されている次の注意事項を実装が遵守していれば、同じ数のプロセッサを使用している限り、を使用して実装した削減を再現できます。

実装者へのアドバイスMPI_REDUCE関数が同じ引数に適用され、同じ順序で表示される場合は常に同じ結果が得られるように実装することを強くお勧めします。これにより、プロセッサの物理的な場所を利用する最適化が妨げられる可能性があることに注意してください。(実装者へのアドバイスの終わり。)

すべてのコストで再現性を保証する必要がある場合は、次の段落のガイドラインに従うことができます。

ユーザーへのアドバイス。一部のアプリケーションは、浮動小数点演算の非連想性を無視できない場合や、特別な縮小順序を必要とし、連想として扱うことができないユーザー定義の演算(セクション5.9.5を参照)を使用する場合があります。そのようなアプリケーションは、評価の順序を明示的に実施する必要があります。たとえば、厳密な左から右(または右から左)の評価順序を必要とする操作の場合、単一のプロセス(たとえば、MPI_GATHER)ですべてのオペランドを収集 し、縮約操作を適用することでこれを実行できます。必要な順序で(例:with MPI_REDUCE_LOCAL)、必要に応じて、結果を他のプロセスにブロードキャストまたは分散します(例:with MPI_BCAST)。(ユーザーへのアドバイスの終わり。)

物事のより広いスキームでは、ほとんどのアプリケーションの効率的なアルゴリズムは局所性を利用します。アルゴリズムは異なる数のプロセスで実行すると実際に異なるため、異なる数のプロセスで実行した場合に結果を正確に再現することは実際的ではありません。可能性のある例外は、減衰ヤコビまたは多項式(チェビシェフなど)スムーザーを使用したマルチグリッドです。この場合、この単純な方法は非常にうまく機能します。

同じ数のプロセスを使用すると、メッセージを受信した順序で処理する(たとえば、使用するMPI_Waitany())ことでパフォーマンスが向上することが多く、非決定性が導入されます。そのような場合、2つのバリアントを実装できます。任意の順序で受信する高速のものと、静的な順序で受信する「デバッグ」のものです。これには、この動作を提供するために、基礎となるライブラリもすべて作成する必要があります。

場合によっては、デバッグのために、この再現可能な動作を提供しない計算の一部を分離し、冗長に実行できます。コンポーネントの設計方法によっては、その変更はごくわずかなコードまたは非常に邪魔になる場合があります。


6

ほとんどの場合、私はジェッドの答えと同じです。ただし、別の方法があります。通常の浮動小数点数のサイズを考えると、4000程度のビットの固定小数点数にすべての数値を格納できます。そのため、このように埋め込まれた浮動小数点数を削減すると、結合性に関係なく正確な計算が得られます。(申し訳ありませんが、誰がこのアイデアを思いついたのかはわかりません。)


1
私は彼が最初だったとは思わないが、あなたの同僚博士の帯域幅は、確かにこのトピックの素敵なの過去記事があります。sites.utexas.edu/jdm4372/2012/02/15/...
ジェフ

5

シリアルで実行できるのと同じように、MPIで数値的に安定したリダクションアルゴリズムを実装できます。もちろん、パフォーマンスが低下する可能性があります。ベクトルを複製する余裕がある場合は、MPI_Gatherを使用して、ルート上で数値的に安定したシリアル削減をシリアルで実行します。場合によっては、パフォーマンスの低下は大した問題ではないことがわかります。

別の解決策はここで説明されるように広いアキュムレータを使用することです。ユーザー定義の削減としてMPIでこれを行うことができますが、より多くの帯域幅を使用します。

上記の妥協点は、補償された合計を使用することです。詳細については、参照「Kahan summation」を参照してください。Highamの「数値アルゴリズムの精度と安定性」は、このトピックに関する優れたリソースです。



2

加算に高精度の算術演算を使用する代わりに、補正された加算を使用する可能性があることを指摘したいと思います([1]を参照)。これにより、より大きなデータ型に頼ることなく、集計の精度を高めることができます。

[1]ニュージャージー州ハイアム浮動小数点加算の精度。SIAM Journal on Scientific Computing 14、783–799(1993)。

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