私は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 個を超えると、合計するとかなりの差になります。
ソース コードは非常に大きく、非常に複雑であるため、追加しません。
そもそもなんでこんなに違うのだろうと思っていました。最適化に関しては、デバッグ バージョンとリリース バージョンの間に大きな違いがあることを知っています。デバッグ情報があるリリースとないリリースには、同様の違いがあると思います。しかし、最適化によって計算精度がどのように変化するのでしょうか?