HLSL を使用して GPU にアルゴリズムを実装することに興味がありますが、主な懸念事項の 1 つは、可変レベルの精度が必要なことです。GPU に実装できる 64 ビット以上の精度をエミュレートする手法はありますか。
ありがとう!
GPUは、ハードウェアで倍精度をサポートし始めたばかりですが、近い将来、単精度よりもはるかに低速になります。複数の浮動小数点数で構成される表現を使用して、ハードウェアを高速にサポートする精度でより高精度の浮動小数点を合成するために長年にわたって開発されてきたさまざまな手法がありますが、オーバーヘッドはかなり大きくなります。IIRC、crlibmマニュアルには、エラー分析と擬似コードを使用して、これらの手法のいくつかについてかなりよく説明されています(CRLIBMは、数値を複数の倍精度値として表すためにそれらを使用しますが、同じ手法を単一で使用できます)
あなたが何をしようとしているのかをもっと知らなければ、より良い答えを出すのは難しいです。一部のアルゴリズムでは、計算の1つの小さな部分だけが高精度を必要とします。そのような場合は、GPUでまともなパフォーマンスを得ることができるかもしれませんが、コードは必ずしも非常にきれいで操作しやすいとは限りません。アルゴリズム全体に広く高精度が必要な場合、GPUは現時点ではおそらく魅力的なオプションではありません。
最後に、なぜHLSLであり、CUDAやOpenCLのような計算指向の言語ではないのですか?
2 つの float (単精度値) を使用すると、約 56 ビットの精度を実現できます。これは double の精度に近づきますが、この "double single" データ型に対して実装できる演算の多くは遅く、double を使用するよりも正確ではありません。ただし、単純な算術演算の場合は、通常はこれで十分です。
このペーパーでは、この考え方について少し説明し、乗算演算を実装する方法について説明します。実行できる操作の完全なリストとその実装方法については、こちらの DSFUN90 パッケージを参照してください。このパッケージは Fortran 90 で書かれていますが、単精度の数値であれば何でも変換できます。ただし、商用目的で使用するには、ライブラリのライセンスを取得する必要があることに注意してください。Mersenne-Twister CUDA デモ アプリケーションには、加算演算と乗算演算の実装もあると思います。
これは少しトピックから外れた答えですが、一部の演算を単精度演算に切り替えることで問題がどのように影響を受けるかを確認したい場合は、精度を混在させるときに区間演算を使用して不確実性の境界を経験的に測定することを検討する必要がありますさまざまな方法で。Boostには、私がかつて既存の C++ 科学コードを計測するために使用した区間演算ライブラリがあります。これは非常に使いやすかったです。
しかし、注意してください: 区間演算は悲観的であることで有名です: つまり、境界を誇張することがあります。アフィン演算の方が優れているはずですが、そのための使用可能なライブラリは見つかりませんでした。
ATIのStreamSDKは、ネイティブの倍精度をサポートしていますが、HLSLではありません。
キャッチは次のとおりです。
OpenCLは拡張機能として倍精度をサポートしますが、それはまだベータ版です。