0

私はCUDAアプリケーション持っています。リリース バージョンに対して 2 回コンパイルします。フロート (expf、sinf、cosf などの関数を含む) でいくつかの計算を行うアプリケーションを実行します。2 つのバージョンで作成された数値にわずかな違いがあることに気付きました。ここでは、それらを並べて示しています。

0: (-8.000000,0.000000,0.000000)        0: (-8.000000,0.000000,0.000000)
1: (-8.212574,-0.112065,0.970697)       1: (-8.212575,-0.112065,0.970697)
2: (-8.365530,-0.250361,1.949206)       2: (-8.365531,-0.250361,1.949206)
3: (-8.332600,-0.251884,2.948662)       3: (-8.332601,-0.251885,2.948662)
4: (-8.593035,-0.619825,3.841295)       4: (-8.593036,-0.619826,3.841295)
5: (-8.507285,-0.778658,4.824870)       5: (-8.507286,-0.778658,4.824870)
6: (-8.441058,-1.001207,5.797539)       6: (-8.441058,-1.001207,5.797539)
7: (-8.680929,-1.051136,6.767059)       7: (-8.680929,-1.051136,6.767059)

これらは最初の 7 つの値です (どちらのバージョンも -8,0,0 で始まります)。この時点でわかるように、小数点以下 6 桁目にわずかな違いしかありません。ただし、回転行列の計算中にこれらを使用するため、これらが 1000 個を超えると、合計するとかなりの差になります。

ソース コードは非常に大きく、非常に複雑であるため、追加しません。

そもそもなんでこんなに違うのだろうと思っていました。最適化に関しては、デバッグ バージョンとリリース バージョンの間に大きな違いがあることを知っています。デバッグ情報があるリリースとないリリースには、同様の違いがあると思います。しかし、最適化によって計算精度がどのように変化するのでしょうか?

4

1 に答える 1

2

浮動小数点演算は結合的ではないため、演算の順序が重要です。コンパイラ オプションを変更すると (デバッグあり/なしなど)、コンパイラによって出力されるコードが異なる可能性があり、通常はかなり異なります。いくつかの浮動小数点命令を並べ替えるだけで、結果が変わることがあります。

確認する唯一の方法は、デバイスで実行されている最終的なコードを確認することです。cuobjdumpNVIDIA は、 CUDA オブジェクト コードを逆アセンブルするために使用できるツールを提供しています。2 つの方法のそれぞれでコンパイルされたカーネルを並べて比較すると、特定の入力に対して 2 つの浮動小数点の結果に違いが生じる場所を見つけることができる場合があります。

于 2013-09-11T11:14:32.773 に答える