7/13(土)-15(月) J-WAVE presents INSPIRE TOKYO(@代々木第一体育館)で自動運転車に試乗できます☆彡

26-24. GPUの単精度(FP32)倍精度(FP64)計算能力の見方

はじめに

先日、HOBO対応したアニーリングパッケージ「HOBOTAN」を紹介しました。現在は「TYTAN」に統合され、TYTANひとつでQUBOもHOBOもGPUアニーリングできるようになりました。

GitHub - tytansdk/tytan: Python SDK for large QUBO problems
Python SDK for large QUBO problems. Contribute to tytansdk/tytan development by creating an account on GitHub.

現在、有志でHOBOのテンソル計算の精度確認と高速化に取り組んでいるのですが、なんか間違ったエネルギーの値が返ってくるなと思ったら数値の型が原因のようでした。

通常、Numpyはデフォルトで「float64」ですが、PyTorchは「float32」らしいです。ですからNumpyでは正しい値が返ってきていたものが、PyTorch(GPUモード)に変えたら間違った値が返ってきたということでした。

非常に雑な言い方ですが、単精度(float32)は7桁、倍精度(float64)は15桁の数字を表現できるとのことで、「大きな数」や「小数点以下すごい細かい数」を正確に計算したい場合は倍精度を使おう、というイメージです。

ということでPyTorchのコードでfloat64を指定して問題は解決しましたが、計算速度は10分の1程度まで遅くなってしまいました。倍精度の計算は遅い!単精度用の計算ユニットをFP32ユニット、倍精度用をFP64ユニットと呼ぶことにすると、GPUによってはFP32ユニットに比べてFP64ユニットの搭載数が非常に少なく、単精度に比べて倍精度の計算がとても遅いということになります。

実際、FP32ユニットとFP64ユニットがどのような比率で搭載されているのか勉強してみました。

参考文献

様々なサイトで勉強させていただきました。専門的な用語を分かりやすく解説してくださっている先人たちに感謝申し上げます。

西川善司の3DGE:GeForce RTX 30シリーズのアーキテクチャを探る。CUDA Coreの増量とRT Coreの高性能化に注目だ
 去る9月2日,NVIDIAは,新世代GPU「GeForce RTX 30」シリーズを発表した。GeForce RTX 30シリーズは,「Ampere」アーキテクチャを採用するゲーム向けGPUで,既存のGeForce RTX 20シリーズと比べて,性能向上のためのさまざまな工夫が盛り込まれている。そのアーキテクチャを詳...
西川善司の3DGE:GeForce RTX 20完全理解。レイトレ以外の部分も強化が入ったTuringアーキテクチャにとことん迫る
 リアルタイムレイトレーシング,そしてAI推論用の専用ハードウェアを搭載するGPU「GeForce RTX」。そのアーキテクチャ詳細がついに明らかとなった。連載「西川善司の3Dゲームエクスタシー」,今回は,「リアルタイムグラフィックスの再発明」とも呼ばれる新世代GPUの正体に,とことん迫ってみたい。
GeForce RTX 2070 レビュー|ドスパラ通販【公式】
RTX 2070 製品レビューです。特徴、スペック、ベンチマークについてご紹介します。
GPUの新時代を切り開く「Turing」アーキテクチャ徹底解説
NVIDIAの新しいGPUアーキテクチャ「Turing」はこれまでと何が違うのか。その詳細を解説。
NVIDIA Turing Microarchitecture RTX GPU (TU102, TU104, TU106)|株式会社アークブレイン

GeForce RTX 2070のスペック

うちでメインで使用しているTuring世代のGPU「GeForce RTX 2070」について調べてみました。

ドスパラのサイトによると、CUDAコアが2304基、Tensorコアが288基、RTコアが36基と書かれています。

PyTorchでの数値計算に関係するのは「CUDAコア」と「Tensorコア」の数です。しかし、どうやらこれらのコアを分解してFP32ユニット、FP64ユニットの数を確認しないと計算速度が分からないようです。(RTコアはおそらく無関係なのでここでは考えないことにします)

FP32ユニットとFP64ユニットの数を求める

まずはスペック表に書かれているCUDAコア=2304基、Tensorコア=288基にたどり着くことを目指しましょう。

RTX 2070にはGPC(Graphics Processing Cluster)という塊が3つ入っているらしい。

Turingアーキテクチャには上位から順に「TU102」「TU104」「TU106」があり、RTX 2070はTU106のようです。TU106は1つのGPCあたり12個のStreaming Multiprocessor(SM)が入っています。

SMの中を見ていきましょう。ここには4個のProcessing Blockと1基のRTコア、2個のFP64ユニットが配置されています。RTコアとFP64ユニットの勘定はこの段階で完了です。

さらにProcessing Blockの中を見てみると、16個のFP32ユニット、16個のINT32ユニット、2基のTensorコアがあります。FP32ユニットとINT32ユニットをセットで「CUDAコア」とカウントしているらしいので、ここには16基のCUDAコアがあることになります。これですべてのコアとユニットの勘定が完了しました。

結局、RTX 2070は

  • CUDAコア=3×12×4×16=2304基
  • Tensorコア=3×12×4×2=288基

が搭載されていることになり、カタログと一致しました。Tensorコアはほとんど半精度(FP16)用、深層学習で活躍するものらしくここでは一旦無視します。

さらに、ユニットの数で言うと

  • FP32ユニット=3×12×4×16=2304個(CUDAコアと同じ)
  • FP64ユニット=3×12×2=72個

となっており、単精度に比べて倍精度の計算速度は32分の1になると見積もられました。

一般に「FP64の性能はFP32の32分の1」という情報をよく見ます。

しかし、グラフィックス向けのTuringでは、FP64の性能はFP32の32分の1となっている。各サイクルにSM毎に2命令のスループットだ。

https://pc.watch.impress.co.jp/docs/column/kaigai/1143278.html

GPGPU用ではないGeForceブランドのGPUは,一部の例外を除いてFP64の演算性能は,
・FP32演算性能:FP64演算性能=32:1

https://www.4gamer.net/games/527/G052743/20200911024/

このことは上記の計算を見れば納得できます。

まとめ

全体を一枚の画像にまとめるとこのようになります。

個々のレイヤーの解説は見つかるのですが、全体を俯瞰した解説がなかなか見当たらなかったのでこの記事を書きました。まあ多分いろいろ間違っていると思うので優しく指摘してください。

なお、「H100」や「A100」といったGPGPU用の製品ではFP64が有利になっており、精密な計算やシミュレーションに用いられています。また、NVIDIAは「データセンターでGeForceを使わないで」とも言っています(→GeForceのデータセンター利用を禁止する使用許諾契約に対してNVIDIAが声明)。GeForceと計算専用GPUの比較もしてみたいところですね。

一応、「H100」「A100」用の専用クーラーも販売していますのでぜひ見てみてください。

SNS等でお気軽にご連絡ください

※当ブログに関することは何でもご相談・ご依頼可能です(Servicesになくても)
※TwitterはFF外の場合はDMではなく返信orメンションでお願いしますm(_ _)m

情報発信しています

質問・コメントはSlackやDiscordでお気軽に

勉強会の告知はこちらで

[I] その他・雑記
この記事を書いた人

博士(理学)。専門は免疫細胞、数理モデル、シミュレーション。米国、中国で研究に携わった。遺伝的アルゴリズム信者。物価上昇のため半額弁当とともに絶滅寸前。

この記事をシェアする
Vignette & Clarity(ビネット&クラリティ)
タイトルとURLをコピーしました