いくつかの数学演算を GPU にオフロードすることを考えていました。私はすでに D3D11 を使用しているので、計算シェーダーを使用して作業を行います。しかし、問題は、ユーザーがどの GPU を使用していても、同じ入力に対して結果が同じである必要があるということです。(計算シェーダー 4.0 をサポートするという要件のみ)。
では、浮動小数点演算は GPU で決定論的ですか?
そうでない場合、GPU は整数演算をサポートしていますか?
いくつかの数学演算を GPU にオフロードすることを考えていました。私はすでに D3D11 を使用しているので、計算シェーダーを使用して作業を行います。しかし、問題は、ユーザーがどの GPU を使用していても、同じ入力に対して結果が同じである必要があるということです。(計算シェーダー 4.0 をサポートするという要件のみ)。
では、浮動小数点演算は GPU で決定論的ですか?
そうでない場合、GPU は整数演算をサポートしていますか?
私は DirectCompute を使用しておらず、OpenCL のみを使用しています。
GPU は、32 ビット整数と 64 ビット整数の両方の整数演算を確実にサポートしています。いくつかの質問には、すでにこの議論があります。
基本的に、最新の GPU では、32 ビットの浮動小数点演算と整数演算のパフォーマンスは同等です。
決定論的な結果については、コードによって異なります。たとえば、複数のスレッドが同じメモリでアトミック操作を実行し、そのメモリを他のスレッドから読み取り、その値に応じて操作を実行することに依存している場合、結果は毎回まったく同じではない可能性があります。
個人的な経験から、乱数を生成する必要がありましたが、一貫した結果も必要でした。したがって、基本的には、スレッドごとに 1 つずつ、シードの大規模な配列があり、それぞれが完全に独立していました。アトミック操作とバリアに依存する他の乱数ジェネレーターはそうではありませんでした。
決定論的な結果を得ることの残りの半分は、異なるハードウェアで同じ結果を得ることです。整数演算を使用すると、かなり安全になるはずです。OpenCL の浮動小数点演算では、高速で緩和された数学オプションと関数のネイティブ バリアントを回避すると、異なるハードウェアで同じ結果が得られる可能性が高くなります。