単精度と倍精度の浮動小数点精度


13

単精度の浮動小数点数はメモリの半分を占有し、最新のマシン(GPUの場合でも)では、倍精度に比べてほぼ2倍の速度で操作を実行できます。私が見つけた多くのFDTDコードは、単精度の算術演算とストレージのみを使用しています。大規模なスパース方程式を解くために単精度を使用することが許容される場合の経験則はありますか?マトリックス条件数に大きく依存する必要があると思います。

さらに、必要に応じて倍精度を使用し、倍精度を必要としない単一精度を使用する効果的な手法はありますか。たとえば、行列ベクトル乗算またはベクトルドット積の場合、結果を倍精度変数に蓄積して(キャンセルエラーを回避する)ことをお勧めしますが、個々のエントリは互いに乗算する必要があります単精度を使用して乗算できます。

最新のFPUでは、単精度(浮動)から倍精度(倍)へ、またはその逆にシームレスに変換できますか?または、これらの費用のかかる操作ですか?

回答:


7

すべての自明ではない問題(つまり、パフォーマンスが重要な問題)については、ほとんどすべてのメモリがマトリックス内にあり、ベクトル内にはほとんどありません。たとえば、ストークス方程式の3Dテイラーフード要素の場合、行列内の行ごとに数百の要素があり、これはベクトルに必要なメモリ量を大幅に上回ります。したがって、マトリックスを浮動小数点数として、ベクトルを倍精度浮動小数点数として格納するというアイデアを試しました。タイミングの結果は思い出せませんが、丸めなどの問題が発生していないことは確かです。したがって、このアプローチは間違いなく機能します。


ありがとう、バンガース教授。反復行列ソルバーはどうですか?行列ベクトル積の倍精度にスケールアップしますか、または乗算の場合ベクトル要素をシングルにスケールダウンし、累積のために倍精度に戻しますか?
Costis

もちろん、反復ソルバーについて話していました。すべてのベクトルは(重要ではないため)倍精度で実行されるため、dst = matrix src操作はdouble = float double として実行されます。その後、累積は倍精度で行われますが、実際にそれが問題になる場合は非常に驚くでしょう。
ウルフギャングバンガース

ドット積は倍精度よりも高い精度で行われるべきであることを示す論文が(おそらく20年前から)どこかにあります。便利なリファレンスはありませんが、後で見つけることができるかどうかを確認します。
ビル・バルト

はい、それは私を驚かせません。それは私たちのすることとも一致します。
ウォルフガングバンガース

ドット積に4倍精度を使用しますか?もしそうなら、クール!図書館でこれをしている人はいませんでした。
ビル・バルト


3

私のアドバイスは、単精度(float)を使用する場合の決定のためのメモリ消費に主に焦点を当てることです。したがって、FDTD計算のバルクデータはfloatを使用する必要がありますが、問題の説明自体(ジオメトリ、材料パラメーター、励起条件など)および関連するすべてのメタデータを二重に保持します。

私はすべてのパフォーマンスを重要ではなく、深く分析されていない計算を二重に保ちます。特に、理論的には可能であっても、コードの計算幾何学的部分を完全に堅牢にすることは決してないという経験から、多角形データや幾何学の他の記述は二重(おそらく可能であれば整数)に保ちます。

二重に保持する3番目の部分は、非対称固有値分解を使用するショートカットを含む分析計算です。例として、区分的に定義された回転対称2D関数があり、そのフーリエ変換が必要です。「効率的に」FFTを取得するためのFFTと適切な「分析ローパスフィルター」を含むさまざまな数値的方法があります。パフォーマンスは重要ではないため、代わりにベッセル関数を含む「正確な」分析式を使用しました。これは最初のショートカットであり、複雑な数式のエラー伝播の分析に時間を費やすことはないので、その計算には倍精度を使用した方がよいでしょう。(式の分析的に等価な式の一部のみが使用可能であることが依然として判明しましたが、

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.