単精度浮動小数点はそれほど悪いですか?


8

私は、タスクPERF Highからパッケージのいくつかを見てきたビュー GPU計算を扱う、そしてほとんどのGPUは、DPのより単精度算術演算を行うの強い大きさのオーダーであるように見えることを考えるものを、私は思っていました。

  1. なぜ、どのパッケージも必要な精度のタイプをユーザーに制御することができないのですか?SP演算(つまり、7桁の精度でコード化された数値)が実用に十分な統計で多くのアプリケーションを見ることができます(関係するゲインを過大評価している場合は、お知らせください)。
  2. これでPythonはより柔軟ですか?もしそうなら、なぜですか?Rに「単一の」タイプがないと、なぜGPUtoolsやmagmaにそのようなオプション(警告と共に)を含めることができないのか(私は間違って表示されて喜んでいますが)わかりません。

PS:私は、具体的なアプリケーションを考えています番号はすでに次元ワイズ(チェビシェフのようにスケーリングされ、中央に配置された不等式は次元状に結合されます)。


2
私はこれを理解するのに数回苦労しているにもかかわらず、これに当惑していることを告白します。ここに質問がありますか?「とても悪い」は曖昧で、指示対象がありません。正確に何を理解したり調べたりしたいですか?
whuber

@Whuber:>私の質問は言葉遣いが不十分でした。それはおそらくそれが無知から生まれたためでした:私はGPUの使用に関するホワイトペーパーをいくつか読んだことがあり(残念ながら、GPUtoolsのRコマンドリファレンスではないことがわかりました)、すべてのテストが実行された理由を理解できませんでしたDPで。質問(およびタイトル)を言い換えます。
user603

回答:


5

GPUtoolsヘルプファイル、それはそうuseSingle=TRUE関数のデフォルトです。


@kwak:上記の答えは役に立ったと思いますが、「単精度はそれほど悪いのですか?」という質問には実際には答えません。おそらくあなたの質問を書き直すべきですか?
csgillespie

@csgellespie:あなたは完全に正しいです。この質問は、将来の読者が使用できるように言い換えます。確かに、言​​葉遣いは特に貧弱でした。
user603

4
  1. GPU以前は、単一の実数を使用するという実用的な感覚はなかったからです。精度が高すぎることはなく、メモリは通常問題ではありません。また、倍精度のみをサポートすることで、Rの設計が簡単になりました。(Rは単一の実数の読み取り/書き込みをサポートしていますが)。
  2. はい、Pythonはコンパイルされた言語との互換性を高めることを目的としているためです。それでも、Rライブラリのラッパーがその場で変換できることは正しいです(もちろんこれには時間がかかりますが、これは小さな問題です)。そのような変更を要求するGPUパッケージのメンテナーに電子メールを送ってみることができます。

3

GPUプログラミングとは、nvidiaカードのプログラミングを意味していると思いますか?その場合、Rおよびpythonからの基本的なコード呼び出しはC / CUDAに対するものです。


単精度のみが提供されるという単純な理由は、それがほとんどのGPUカードでサポートされているためです。

ただし、新しいnvidia Fermiアーキテクチャは倍精度をサポートしています。今年nvidiaグラフィックカードを購入した場合、それはおそらくフェルミでしょう。ここでも物事は単純ではありません:

  • 倍精度でコンパイルすると、パフォーマンスがわずかに低下します(正確に覚えていれば2倍になります)。
  • 安価なカードのフェルミカードでは、nvidiaは意図的に倍精度を無効にしました。ただし、これを回避して倍精度プログラムを実行することは可能です。LinuxのGeForce GTX 465でこれをなんとかしました。

タイトルの「単精度は大丈夫ですか?」という質問に答えるには、それはアプリケーションに依存します(申し訳ありませんが解答!)。パフォーマンスに影響を与えなくなったため、今ではすべての人が倍精度を使用していると思います。

GPUをいじると、プログラミングは突然、はるかに複雑になりました。次のようなことを心配する必要があります。

  • メモリをワープサイズにして適切に配置します。
  • カーネルごとの#threads。
  • デバッグは恐ろしい-GPUカーネルステートメントに印刷ステートメントがない
  • 乱数ジェネレータの欠如
  • 単精度。

@ccgillespie:>私の質問の言葉遣いが不十分だったと思います。私が見るパッケージ(GPUtools、magma)では、倍精度が標準として使用されているようです(説明したパフォーマンスが失われます)。なぜ単精度がオプションとして提供されないのかと思っていました。
user603

@kwak:倍精度値は、ラッパーによって単精度に変換する必要があります。ラッパーは単に役に立とうとしているだけでした。
csgillespie 2010年

@ccgillespie:>はい、しかしラッパーには引用した第2要素を超えるパフォーマンスコストが伴うようです(これについても、私が間違っている場合は修正してください)。 SP FP演算は大丈夫でしょう)。このラッパーをオフにするオプションを要求することが理にかなっているのではないかと思っていました。
user603

2
@kwak:GPUtoolsヘルプファイルをちらりと見るuseSingle=TRUEと、関数のデフォルトのようです。ここで何か不足していますか?
2010年

@csgillespie:比較的最近までほとんどNVIDIAカードは、単に、覚えていませんでした倍精度計算を行います。2ヒットの要素は、生のC / CUDAコードを使用して観察したものです。python / Rラッパーがあると、これが最悪になる可能性があります。
csgillespie 2010年

1

流通しているGPUの大部分は、単精度浮動小数点のみをサポートしています。

タイトルの質問に関しては、処理するデータを見て、単精度で十分かどうかを判断する必要があります。多くの場合、処理するデータの90%以上ではシングルは完全に許容可能ですが、最後の10%では見事に失敗します。特定のデータセットが失敗するかどうかを判断する簡単な方法がない限り、すべてに倍精度を使用してスタックしています。


もう少し詳しく説明してもらえますか?いくつかの反復アルゴリズム(行列反転、QR分解)はうまく機能しているようです。私はまた、SPの不正確さが、より大きな配列を含む操作で問題になるかどうかについても知りたいです。
user603

これには2つの部分があります。1)データは何を表していますか?2)データをどのように処理しますか?医学研究の何千ものポイントのデータを見ている場合、患者の健康状態を定量化するには単精度で十分であると思われます。一方、ジオメトリでは、スケールとズームに応じて、単精度または倍精度が必要になる場合があります。小さな誤差でも結果に劇的な影響を与える可能性があるため、土星への探査機の軌道を計算するには常に2倍が必要です。データを見て、許容範囲を決定する必要があります。
Benjamin Chambers、

1
これは、使用しているアルゴリズムの数値的安定性と、問題の状態がどの程度かによって異なります。倍精度を使用すると、小さい数値だけでなく大きい数値にもアクセスできることに注意してください。
James

1
必ずしも小さい数または大きい数ではありません。覚えておいてください、私たちは浮動小数点を扱っています。むしろ、有効数字を維持しながら、相互に関連して大きい数と小さい数を使用できます。
Benjamin Chambers、

1

さて、古い質問への新しい答えですが、今はもっと重要です。あなたが求めている質問は有限の精度、通常は信号解析と実験数学の領域に関係しています。

倍精度(DP)浮動小数点を使用すると、ほとんどの実際の数学の問題と同じように、有限精度の問題が存在しないように見せかけることができます。実験的な数学ではふりはありません。

単精度(SP)フロートでは、量子化ノイズを考慮する必要があります。ニューラルネット(NN)、たたみ込みネット(CNN)、残差ネット(ResN)などの機械学習モデルが本質的にノイズを拒否する場合、SPはほとんどの場合DPと同様の結果を示します。

半精度(HP)は(今CUDAツールキット7.5でサポートされている)浮かぶ必要が量子化効果(騒音及び丸め)が考慮されていること。おそらく、まもなく一般的な機械学習ツールキットにHPが浮かぶでしょう。

固定精度の数値だけでなく、浮動小数点でより低い精度の計算を作成する最近の作業があります。確率的丸めにより、収束をCNNで進めることができるようになりましたが、解はそれなしで分岐します。これらのペーパーは、機械学習で有限精度の数値を使用する場合の問題の理解を深めるのに役立ちます。

質問に対処するには:

SPはそれほど悪くない。ご指摘のとおり、2倍の速さですが、メモリにより多くのレイヤーを配置することもできます。おまけは、GPUでデータを取得および取得するオーバーヘッドを節約することです。計算が高速でオーバーヘッドが少ないほど、収束時間が短くなります。とは言うものの、HPは、一部の問題については、ネットワークのある部分ではより優れており、他の部分ではより優れています。

  1. 機械学習ツールキットの多くはSPとDPを処理しているようです。おそらく、ツールキットの幅広い経験を持つ他の誰かがそのニックネームを追加するでしょう。
  2. Pythonは、gpuツールキットがサポートするものをサポートします。あなたはCPUで解釈されたスクリプトを実行するので、Pythonデータタイプを使いたくないでしょう。

現在、ニューラルネットワークのトレンドは非常に深いレイヤーに移行する傾向にあり、最速のgpuクラスターでは数日以上の実行が一般的です。

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