インテル® ソフトウェア・ツールにおける浮動小数点結果の再現性

インテル® DPC++/C++ コンパイラーインテル® Fortran コンパイラー
parallel_v34

ほとんどの実数のバイナリー浮動小数点 (FP) 表現は不正確で、浮動小数点数を含むその演算結果には特有の不確実性があります。そのため、異なる条件下で計算を行うと、結果は予想される不確実さの範囲内で一貫していますが、異なる可能性もあります。通常は問題になりませんが、一部のコンテキストではより高い再現性が求められます (例: 品質保証、法的問題、機能安全要件など)。しかし、完全な再現性または高い再現性を達成するには、通常、パフォーマンスが犠牲になります。

再現性とは?

再現性の定義は人それぞれです。最も基本的なことは、同じプロセッサー上で、同じデータを使用して、同じ実行ファイルを繰り返し実行した場合、常に同一の結果が生成されることです。これは、繰り返し性または実行再現性と呼ばれます。結果が必ずしも決定的ではなく、再現性が自動的に提供されないことに驚いたり、ショックを受けるユーザーもいます。

再現性はまた、異なるプロセッサー・タイプをターゲットとし実行した場合、異なる最適化レベルでビルドした場合、あるいは異なる並列処理タイプやレベルで実行した場合に、同一の結果が生成されることを意味します。これは、条件付き数値再現性と呼ばれます。完全に再現性のある結果を得るために必要な条件はコンテキストに依存し、パフォーマンスが低下する可能性があります。

多くのソフトウェア・ツールは、デフォルトでは完全に再現性のある結果をもたらしません。

差異の原因

浮動小数点結果が異なる主な原因は、最適化です。最適化には、次のものが含まれます。

  • ビルド時または実行時に特定のプロセッサーと命令セットをターゲットにする
  • さまざまな形式の並列処理

現代のプロセッサーでは、パフォーマンスの利点が非常に大きいため、大規模なアプリケーションでも最適化を行わないことはほとんどありません。精度が異なる原因として、次のようなものがあります。

  • 数学関数や除算などの操作の近似値が異なる
  • 中間結果の計算と格納に使用される精度
  • 正規化されていない非常に小さな値がゼロとして扱われる
  • FMA (Fused Multiply Add) 命令などの特殊命令の使用

FMA のような特殊命令は、通常、乗算と加算を個別に行うよりも高い精度が得られますが、最終結果は変わる可能性があります。

FMA の生成は、インテル® アドバンスト・ベクトル・エクステンション 2 (インテル® AVX2) 以上の命令セットをターゲットとする場合に O1 以上で有効になる最適化です。言語標準ではカバーされていないため、コンパイラーは異なるコンテキストでは異なる最適化を適用する可能性があります (例: FMA をサポートする異なるプロセッサーに対して異なる最適化を適用することがあります)。

おそらく、差異の最も重要な原因は、特に並列アプリケーションの場合、操作の順序でしょう。異なる順序は数学的には等価かもしれませんが、有限精度演算では、丸め誤差により差異が生じたり、合計結果が異なることがあります。異なる結果が必ずしも精度が低いわけではありませんが、ユーザーは最適化されていない結果が正しいと見なすことがあります。

例えば、図 1 に示すような、コンパイラーがパフォーマンス向上のために行う変換があります。

タイトルとURLをコピーしました