3

いくつかの大きな MEX 関数を使用するいくつかの matlab コードがあり、openCL を使用して高速化したいと考えています (openCL API を使用して、MEX 関数のコードの一部を openCL コードに置き換えています)。コードのごく一部を openCL カーネルに変換しましたが、すでに問題に直面しています。

GPU での実行後の結果の行列の一部の要素は、元の MEX 関数が呼び出され、誤差が 0.01 未満の場合の結果の行列の対応する要素とは異なります。これにより、最終結果に小さなエラーが発生しますが、コードを翻訳するにつれてエラーが蓄積されるのではないかと心配しています。

これはおそらく、CPU と GPU での計算の精度の違いに関連しています。同じ精度を確保する方法を知っている人はいますか? Ubuntu 12.04 で 64 ビットの matlab R2012b を実行しています。使用しているハードウェアは Intel Core2 Duo E4700 と NVIDIA GeForce GT 520 です。

4

2 に答える 2

3

CPU と GPU での結果のわずかな違いは、CPU での倍精度 (64 ビット) fp 数値の使用から単精度 (32-ビット) GPU の fp 番号。

私はこの違いをエラーとは呼びません。むしろ、浮動小数点数を使用してコンピューターで算術演算を行った結果です。CPU のみのコードで得られた結果は、理論的に「正しい」結果とはすでに異なっていました。数値計算の技術の多くは、計算の全期間にわたって理論上の計算と実際の計算の差を十分に小さく保つことにあります (それが何を意味するにせよ)。これを詳しく説明するには、今よりも多くの時間とスペースが必要ですが、浮動小数点演算とは何か、そうでないものとは何かを理解していないことから生じる驚きは、SO に関する豊富な質問の源です。これらの質問に対するいくつかの回答は、非常に興味深いものです。 これで始められるはずです。

CPU と GPU の両方で同じ精度を使用するように注意した場合、報告された違いは、浮動小数点演算の非可換性によって説明される可能性があります。浮動小数点演算では、(a+b)+c == a+(b+c). 操作の順序は重要です。SIMD を実行している場合、2 つの実装で操作の順序が同じではないことは間違いありません。そうでない場合でも、GPU と CPU の両方で操作が同じ順序になるようにするために何をしましたか?

あなたがそれについて何をすべきかについては、むしろあなた次第です。(個人的にはお勧めしませんが) GPU で倍精度 fp 演算を行うための独自のルーチンを作成できます。これを行うことを選択した場合、GPU が約束する高速化の多くに別れを告げることを期待してください。

より適切な方法は、単精度ソフトウェアが目的に対して十分な精度を提供することを確認することです。たとえば、私が働いている世界では、環境からの元の測定値は一般に有効数字が約 3 桁を超えるほど正確ではありません。したがって、5 番目以降の s-fs でエラーを保持できれば、それで十分です。

残念ながら、あなたの観点からは、単精度計算から十分な精度を得ることは、グローバルに置き換えdoublefloat再コンパイルすることによって必ずしも保証されるわけではありません。(一般的には) 異なるアルゴリズムを実装する必要がある場合があります。計算が進むほどドリフトしません。繰り返しになりますが、GPU が約束する速度の利点の一部が失われます。

于 2013-01-09T11:01:30.680 に答える
2

よくある問題は、毎回切り捨てられて格納されるのではなく、浮動小数点値が 80 ビットの CPU レジスタ内に保持されることです。これらの場合、追加の精度は偏差につながります。したがって、そのような問題に対処するためにコンパイラが提供するオプションを確認できます。リリース ビルドとデバッグ ビルドの違いを確認するのも興味深いでしょう。

于 2013-01-09T10:01:03.897 に答える