安全性とパフォーマンスに関する考察

一般に、レデューサーは、並列実行を通じて再現性のある結果を提供するためにロックを必要としません。結果は、シリアル実行の場合と同じになります。

プログラムを開発する場合は、次の安全性とパフォーマンスに関する考察に留意してください。

安全性

厳密に決定性のある結果を得るためには、レデューサーの値を変更するすべての操作 (更新およびマージ) が結合則に則っていなければなりません。

レデューサー・ライブラリーで定義されているレデューサーは、結合則を満たしている演算子を提供します。一般に、これらの演算子だけを使用してレデューサーにアクセスする場合、決定性のあるシリアル・セマンティクスが得られます。結合則を満たしていない演算子とともに独自のレデューサーを記述したり、安全でない操作で任意のレデューサーの値を参照/変更したりすることによって、結合的でない演算子でレデューサーを用いることは可能です。

決定性

レデューサーが浮動小数点型としてインスタンス化された場合は、その操作は厳密には結合的ではありません。特に、値の指数が異なる場合は、操作の順序によって結果が異なることがあります。つまり、ストランドが実行される順序によって、結果が異なります。一部のプログラムではこの違いは許容できるものですが、プログラムを実行するたびに結果が厳密には同じにならないことがあります。

パフォーマンス

レデューサーを適切に使用すると、ランタイムのパフォーマンス低下はほとんど、あるいはまったくありません。ただし、次の場合には著しいオーバーヘッドが発生します。オーバーヘッドは、スチールの数に比例します。

多数のレデューサー (例えば、レデューサーの配列またはベクトル) を作成した場合、cilk_sync でマージするときにプログラム内のレデューサーの数に比例するオーバーヘッドが発生します。

多くの状態を持つレデューサーを定義し、スチール後それらのレデューサーが参照される場合、単位元の生成のコストが高くつくかもしれません。

マージ操作に時間がかかる場合は、スチールが成功した後の同期ごとにマージが発生している可能性があります。


このヘルプトピックについてのフィードバックを送信