9

GPUで2つの浮動小数点数を除算すると、結果はになり0.196405ます。それらをCPUで分割すると、結果は0.196404です。電卓を使用した実際の値はです0.196404675。GPUとCPUの分割を同じにするにはどうすればよいですか?

4

3 に答える 3

11

別の回答へのコメントが示唆するように、CPU と GPU で実行される浮動小数点計算から同じ結果を期待することが現実的ではない理由はたくさんあります。それよりもはるかに強力です。同じソース コードが異なるターゲット アーキテクチャ (x86 や x64 など) に対してコンパイルされた場合や、異なる最適化レベルでコンパイルされた場合に、FP の結果が同じになるとは想定できません。

実際、コードがマルチスレッド化されていて、FP 操作が実行ごとに異なる順序で実行される場合、EXACT SAME SYSTEM で実行されている EXACT SAME EXECUTABLE は、実行ごとにわずかに異なる結果を生成する可能性があります。

理由には次のようなものがありますが、これらに限定されません。

  • 浮動小数点演算は連想的ではないため、一見無害な並べ替え (上記のマルチスレッドによる競合状態など) によって結果が変わる可能性があります。
  • アーキテクチャが異なれば、サポートされる精度と丸めのレベルも、さまざまな条件 (コンパイラ フラグ、制御ワードと命令ごとなど) によって異なります。
  • コンパイラが異なれば、言語標準の解釈も異なります。
  • FMAD (融合乗加算) をサポートするアーキテクチャもあれば、サポートしないアーキテクチャもあります。

この議論の目的上、CUDA 用の JIT コンパイラ (まだ利用可能になっていない GPU アーキテクチャに対して PTX コードを将来にわたって保証できるようにする魔法) は、確かに FP の結果を乱すと予想されるべきであることに注意してください。

上記にもかかわらず、堅牢な FP コードを作成する必要があります。

今日これを書いている時点で、CUDA GPU は、浮動小数点演算に関して、現在のどの CPU よりもはるかに優れた設計のアーキテクチャを備えていると信じています。GPU には、16 ビット float と FMAD のネイティブ IEEE 標準 (c. 2008) サポートが含まれており、denormals のフルスピード サポートがあり、設定がすべての FP 命令に副作用を持つ制御ワードではなく、命令ごとに丸め制御を有効にします。変更するのに費用がかかります。

対照的に、CPU はスレッドごとの状態が過剰になり、パフォーマンスが低下しますが、SIMD 命令を使用する場合を除きます。主流のコンパイラは、パフォーマンスを悪用するのが苦手です (そのような命令セットを利用するためにスカラー C コードをベクトル化することは、 CUDA などの疑似スカラー アーキテクチャ用のコンパイラ)。ウィキペディアの履歴ページを信じるなら、Intel と AMD は説明に反する方法で FMAD サポートの追加を完全に失敗させたようです。

NVIDIA GPU での浮動小数点の精度と IEEE のサポートに関する優れた議論をここで見つけることができます。

https://developer.nvidia.com/content/precision-performance-floating-point-and-ieee-754-compliance-nvidia-gpus

于 2012-12-19T08:27:23.383 に答える
1

どの GPU が計算に使用されますか?

通常、単精度浮動小数点演算を使用している場合、仮数部の 6 桁目で +1/-1 の精度エラーが発生します。これは、GPU の丸め誤差によるものです。

倍精度を使用している場合は、CPU で得られる正確な精度が得られます。ただし、速度は浮動小数点精度のほぼ半分になり、メモリ使用量は 2 倍になります。現在、FERMI ベースのアーキテクチャ以降、NVIDIA GPU は倍精度点計算のサポートをサポートしています。

于 2012-12-19T09:13:08.757 に答える
1

あなたはそうしない。浮動小数点値が数学演算後に期待する値と正確に等しいと想定しないでください。これらは、指定された精度に対して正確であるように定義されているだけであり、プロセッサが CPU であるか GPU であるかに関係なく、プロセッサごとにわずかに異なります。たとえば、x86 プロセッサは、実際にはデフォルトで 80 ビットの精度で浮動小数点計算を行い、要求された精度に結果を切り捨てます。浮動小数点数の等価比較では、常に許容範囲を使用する必要があります。これは、任意の 2 つのプロセッサ (または、異なるが数学的に同等の命令シーケンスによる同じプロセッサでさえも) が同じ結果を生成するという保証はできないためです。たとえば、浮動小数点数 a と b は、次の場合にのみ等しいと見なされます。a - b | <

于 2012-12-18T19:00:12.050 に答える