CPU と GPU での結果のわずかな違いは、CPU での倍精度 (64 ビット) fp 数値の使用から単精度 (32-ビット) GPU の fp 番号。
私はこの違いをエラーとは呼びません。むしろ、浮動小数点数を使用してコンピューターで算術演算を行った結果です。CPU のみのコードで得られた結果は、理論的に「正しい」結果とはすでに異なっていました。数値計算の技術の多くは、計算の全期間にわたって理論上の計算と実際の計算の差を十分に小さく保つことにあります (それが何を意味するにせよ)。これを詳しく説明するには、今よりも多くの時間とスペースが必要ですが、浮動小数点演算とは何か、そうでないものとは何かを理解していないことから生じる驚きは、SO に関する豊富な質問の源です。これらの質問に対するいくつかの回答は、非常に興味深いものです。 これで始められるはずです。
CPU と GPU の両方で同じ精度を使用するように注意した場合、報告された違いは、浮動小数点演算の非可換性によって説明される可能性があります。浮動小数点演算では、(a+b)+c == a+(b+c)
. 操作の順序は重要です。SIMD を実行している場合、2 つの実装で操作の順序が同じではないことは間違いありません。そうでない場合でも、GPU と CPU の両方で操作が同じ順序になるようにするために何をしましたか?
あなたがそれについて何をすべきかについては、むしろあなた次第です。(個人的にはお勧めしませんが) GPU で倍精度 fp 演算を行うための独自のルーチンを作成できます。これを行うことを選択した場合、GPU が約束する高速化の多くに別れを告げることを期待してください。
より適切な方法は、単精度ソフトウェアが目的に対して十分な精度を提供することを確認することです。たとえば、私が働いている世界では、環境からの元の測定値は一般に有効数字が約 3 桁を超えるほど正確ではありません。したがって、5 番目以降の s-fs でエラーを保持できれば、それで十分です。
残念ながら、あなたの観点からは、単精度計算から十分な精度を得ることは、グローバルに置き換えdouble
てfloat
再コンパイルすることによって必ずしも保証されるわけではありません。(一般的には) 異なるアルゴリズムを実装する必要がある場合があります。計算が進むほどドリフトしません。繰り返しになりますが、GPU が約束する速度の利点の一部が失われます。