1

最近はCUDA開発環境、OSはWindows server 2008、グラフィックカードはTeslaC2070、コンパイラはVS2010を使ってプログラム(FDTD操作)を作っています。このプログラムは、単精度および倍精度の浮動小数点を使用して計算します。

CUDA プログラミング ガイド 3.2 および 4.0 を読んでいました。付録では、ガイドが教えてくれますsin()cos()最大精度は 2 ULP です。私のオリジナルの CPU プログラムは、CUDA バージョンとは異なる結果を生成します。

結果を正しく同じにしたい。出来ますか?

4

1 に答える 1

3

ゴールドバーグの言葉を引用すると (すべてのコンピューター科学者、計算科学者、そしておそらくプログラミングを行うすべての科学者が読むべき論文):

丸め誤差のため、代数の結合法則は必ずしも浮動小数点数に適用されません。

これは、表向きは連想演算を使用している場合でも、演算の順序を変更すると、わずかに異なる結果が得られる可能性が高いことを意味します。

定義によると、並列処理では、シリアル演算とは異なる順序で操作が行われます。「非常に並列」な計算、つまり、各出力要素が他のすべての要素から独立して計算される計算では、これについて心配する必要がない場合があります。しかし、リダクションやスキャンなどの集合演算や、ステンシル (FDTD など) などの空間近傍計算では、この効果が発生します。

実際には、別のコンパイラ (さらには別のコンパイラ オプション) を使用しても、並列処理の有無にかかわらず、同じコードをコンパイルした場合でも、浮動小数点計算の結果が変わる可能性があります。

于 2012-08-01T22:15:38.637 に答える