計算のためにOpenCLカーネルがあります。私は1つのスレッドだけがCPUコードで異なる結果を出すことが分かった。私はvs2010 x64リリースモードを使用しています。OpenCLカーネル浮動小数点除算で異なる結果が出る
いくつかの例でOpenCLコードを調べると、興味深い結果がいくつか見つかりました。カーネルコードのテスト例を以下に示します。 Iは、OpenCLのカーネルの3症例を試験
、精度がprintf("%.10f", fval);
ケース1によって確認された:
float fval = (10296184.0)/(float)(x*y*z); // which gives result fval = 3351.6225585938
float fval = (10296184.0f)/(float)(x*y*z); // which gives result fval = 3351.6225585938
変数は:int x,y, z
これらの値はいくつかの操作によって計算されます。その値はx = 12、y = 16、z = 16です。
ケース2:
float fval = (10296184.0)/(float)(12*16*16); // which gives result fval = 3351.6223144531
float fval = (10296184.0f)/(float)(12*16*16); // which gives result fval = 3351.6223144531
ケース3:私は二つの表現の上に使用してfval
の差を計算する際10296184.0
を使用する場合
しかし、結果は0です。
float fval = (10296184.0)/(float)(x*y*z) - (10296184.0)/(float)(12*16*16); // which gives result fval = 0.0000000000
float fval = (10296184.0f)/(float)(x*y*z) - (10296184.0f)/(float)(12*16*16); // which gives result fval = 0.0001812663
誰もがその理由を説明したり、私にいくつかのヒントを与えるだろうか?
[浮動小数点演算が壊れていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-broken)を参照してください。これらの不正確さは、いくつかの制約が私に劣った 'float'を使用させない限り、私はいつも' double'を使います(同じことに苦しんでいますが)。 –
それ以上の精度が必要な場合は、倍精度FPがGPU上のものである理由です。レンダリングにはほとんど応用されていません。 –
「3351.6226,3351.6223および0」の値がどのようにして決定されたかを記入してください。 'printf("%f "、...)'、デバッガなど – chux