今回で第3回目の投稿だが、前回から1週間ほど間が空いてしまった。
一応、可能な限り1週間以内には更新をするということを目標に続けていこうと思っているが、なかなかに忙しく、じっくりと本に浸る時間が取れないのは惜しい。
今年も残すところごく僅かだが、少なくとも後1回は年内に更新できるようにしたい。
ただ、既におなじみだが、この辺の部分は流し読みにとどめておいた。
後半に科学技術計算の部分が少しあり、そちらをメインに読み進めたので3章の感想は短めだ。
西川善司さんの「ゲームグラフィックスとGPU」のコラムは面白そうなので後で読み返したい。
よく名前を聞くIntel coreシリーズはCPU内にGPUコアを内蔵している。中にはGPUのチップ面積の方が多いものもあるらしい。
計算ユニットにはEUという名前がついており、各EUは毎サイクルで8個の積和演算を行える。このEUが最大で72つ搭載されているため、合計576CUDAコア相当になるらしいが、動作周波数はおそらく違うのだろう。
仮に周波数をintel coreシリーズのCPUから勝手に推定して3GHzとすると
\[ \begin{align} &8 \times 72 = 576 \, \mathrm {MAC/cycle} \\ &576 \times (3 \times10^9) = 1728 \, \mathrm {GMACS}\\ &1728 \times 2 = 3456 \, \mathrm {GOPS}\\ \end{align} \]
ふむ、だいたい3.4 TOPS (FLOPS??) か。
確か、core i9 7900Xが1TFLOPSちょいなのでオンチップとしては結構高い方なのかも知れない (ref)。ただ、今年発表されたmovidiusのmyriad Xは4TOPSなので、こちらはハイエンドのオンチップGPUより高速だということになる (ref)。また、本書の1章?でかるく触れられていたように、L3キャッシュと連結しているので、メモリ帯域もディスクリートGPUより高そうに見える。
上記はあくまで推定なので、時間があれば後に詳しく調べてみようと思う。また、詳しい方がいたらぜひ教えていただきたい。
出展: 「GPUを支える技術」,p77,Hisa Ando,2017
計算資源とシュミレーション技術の発達のおかけで、DNAを水分子と混在した状態でシュミレートできるらしい。また、皆さんご存知のスパコン「京」で津波のシュミレーションができるとのことだ。
最後のほうではAlphaGoの話も少し出てきた。
精度が増えるに連れてExpとFrac共に増えているが、Fracのほうが増え幅が多い。これは浮動小数点の形式を考えればあたりまえのことだ。
グラフィックには一般で32bitで十分だが、高い精度を必要とする科学技術計算には倍精度を上半分と下半分にして利用する Double-Double という方法もよく利用される。
浮動小数点フォーマットで下半分と言うのはどういうこと?? (q)
2つの倍精度語でExpとFracパートをそれぞれ表現するのだろうか?
ただその場合はどうやって計算を行うのだろう。興味がある。
メインストリームで4GB - 8GB
メモリ容量は価格より、後述するメモリバンド幅によって決定されている
単精度だと同じデータを94.4回使いまわすような計算でないと、メモリバンドがボトルネックとなる。
-> 演算メモリ帯域比
\[ \frac {6.8 \times 10^{12}} {(288 \div 4) \times 10^9} = 94.4 \]
P100は 720GB/s (3D積層 HBM2) で 10.6TFlops なので、58.9回となる。
-> 演算メモリ帯域比:
\[ \frac {10.6 \times 10^{12}} {(720 \div 4) \times 10^9 } = 58.9 \]
改めて思うけどGPUの帯域すごいなー(_;)
ただ、これでもまだメモリアクセスネックである。
余談だが、以前IFTD2017に参加させた頂いた際に、intelのブースでFPGAを高帯域の独自インターフェイスで直接接続したマシンのデモを見たことがあるし、microsoftもサーバ側FPGAで同じようなことをやっているらしい。どの世界でも高帯域接続による高効率な分散システムは求められてるようだ。
フリップフロップだと一度ドレインが反転すると、インバータの相互作用で値が残ってしまうため、ロジックの場合と比べてエラー率が劇的に高まる。
出展: 「GPUを支える技術」,p111,Hisa Ando,2017
2章?でもあったように、上記のようなエラーに対応するためにメモリには一般的にECCがついている。
本ブログに対するご意見や間違いの指摘などがありましたら、ぜひコメントください。TwitterでもOKです。
皆で議論を深めて行けるような場にしていきましょー。
一応、可能な限り1週間以内には更新をするということを目標に続けていこうと思っているが、なかなかに忙しく、じっくりと本に浸る時間が取れないのは惜しい。
今年も残すところごく僅かだが、少なくとも後1回は年内に更新できるようにしたい。
3章 GPUと計算処理
3章ではGPUによる3D画像表示のロジックを説明していた。ただ、既におなじみだが、この辺の部分は流し読みにとどめておいた。
後半に科学技術計算の部分が少しあり、そちらをメインに読み進めたので3章の感想は短めだ。
西川善司さんの「ゲームグラフィックスとGPU」のコラムは面白そうなので後で読み返したい。
グラフィック処理を行うハードウェア構造
Intel HD Graphics Gen 9 GPU coreの基本構成が少し乗っていた。よく名前を聞くIntel coreシリーズはCPU内にGPUコアを内蔵している。中にはGPUのチップ面積の方が多いものもあるらしい。
計算ユニットにはEUという名前がついており、各EUは毎サイクルで8個の積和演算を行える。このEUが最大で72つ搭載されているため、合計576CUDAコア相当になるらしいが、動作周波数はおそらく違うのだろう。
仮に周波数をintel coreシリーズのCPUから勝手に推定して3GHzとすると
\[ \begin{align} &8 \times 72 = 576 \, \mathrm {MAC/cycle} \\ &576 \times (3 \times10^9) = 1728 \, \mathrm {GMACS}\\ &1728 \times 2 = 3456 \, \mathrm {GOPS}\\ \end{align} \]
ふむ、だいたい3.4 TOPS (FLOPS??) か。
確か、core i9 7900Xが1TFLOPSちょいなのでオンチップとしては結構高い方なのかも知れない (ref)。ただ、今年発表されたmovidiusのmyriad Xは4TOPSなので、こちらはハイエンドのオンチップGPUより高速だということになる (ref)。また、本書の1章?でかるく触れられていたように、L3キャッシュと連結しているので、メモリ帯域もディスクリートGPUより高そうに見える。
上記はあくまで推定なので、時間があれば後に詳しく調べてみようと思う。また、詳しい方がいたらぜひ教えていただきたい。
出展: 「GPUを支える技術」,p77,Hisa Ando,2017
科学技術計算とGPU
冒頭では物理シュミレーションの概要を説明している。計算資源とシュミレーション技術の発達のおかけで、DNAを水分子と混在した状態でシュミレートできるらしい。また、皆さんご存知のスパコン「京」で津波のシュミレーションができるとのことだ。
最後のほうではAlphaGoの話も少し出てきた。
科学技術計算と浮動小数点演算
IEEE754-2008で16bit 〜 128bitの浮動小数点演算が定義されている。精度が増えるに連れてExpとFrac共に増えているが、Fracのほうが増え幅が多い。これは浮動小数点の形式を考えればあたりまえのことだ。
精度 | N bit | Exp bit | Frac bit |
---|---|---|---|
半精度 | 16bit | 5 | 10 |
単精度 | 32bit | 8 | 23 |
倍精度 | 64bit | 11 | 52 |
倍精度 | 64bit | 15 | 112 |
浮動小数点の精度
バイナリデータで実数を近似する時、表現しきれない部分が出てくる。その際、近い大きさの数同士を引き算すると誤差が大きくなる??という説明があるが、この部分だけだけだと少し理解が難しい。グラフィックには一般で32bitで十分だが、高い精度を必要とする科学技術計算には倍精度を上半分と下半分にして利用する Double-Double という方法もよく利用される。
浮動小数点フォーマットで下半分と言うのはどういうこと?? (q)
2つの倍精度語でExpとFracパートをそれぞれ表現するのだろうか?
ただその場合はどうやって計算を行うのだろう。興味がある。
16bitの利用機会の増加
近年のDeep Learningの影響を受け、半精度(16bit)の利用機会が増してきている。この傾向は本職でもよく感じているので、わかりやすい。現在ではNVIDIAのPascal GPU, AMD Polaris、Intel Skylake CPU内の HD Graphics Gen9 も半精度をサポートしている。科学技術計算の並列計算
流体計算では空間を小さな格子で区切り、その内部を同一の空間として時間tの状態をシュミレートする。隣接する格子は隣の格子の時間tでの状態を受け、時間t + Δtをシュミレートする。精度を向上させるためには格子を細かくする必要があるが、1/100倍に小さくすると全体としては100^3倍計算量が増加する。一応、全格子は独立しているので並列に計算することができる。GPUの関連ハードウェア
GPUにおけるデバイスメモリ、CPUとの接続、バンド幅、エラー検知と修復について解説している。メモリ容量
GPUのデバイスメモリはハイエンドで12GB - 16GB、メインストリームで4GB - 8GB
メモリ容量は価格より、後述するメモリバンド幅によって決定されている
メモリバンド幅
Tesla M40 は288GB/s (GDDR5)で、演算性能 6.8TFlops であるため単精度だと同じデータを94.4回使いまわすような計算でないと、メモリバンドがボトルネックとなる。
-> 演算メモリ帯域比
\[ \frac {6.8 \times 10^{12}} {(288 \div 4) \times 10^9} = 94.4 \]
P100は 720GB/s (3D積層 HBM2) で 10.6TFlops なので、58.9回となる。
-> 演算メモリ帯域比:
\[ \frac {10.6 \times 10^{12}} {(720 \div 4) \times 10^9 } = 58.9 \]
改めて思うけどGPUの帯域すごいなー(_;)
ただ、これでもまだメモリアクセスネックである。
CPUとGPUの接続
一般的にCPUとGPUの接続はPCI Expressで行われる。PCI Expressは16レーンの単方向で15.75GB、双方向では31.5GBになる。NVIDIAが導入したNVLinkは一本で20Gbit/sで8本の信号線があるため、単方向20GB/s, 双方向40GB/sになる。なお、NVLinkはデータ通信用途のみなのでPCI Expressは別途必要。(1レーンで良い?)余談だが、以前IFTD2017に参加させた頂いた際に、intelのブースでFPGAを高帯域の独自インターフェイスで直接接続したマシンのデモを見たことがあるし、microsoftもサーバ側FPGAで同じようなことをやっているらしい。どの世界でも高帯域接続による高効率な分散システムは求められてるようだ。
電子回路のエラーメカニズムと対策
メモリ上のbit errorは宇宙からの中性子とシリコンの原子核が衝突し、トランジスタの電子がはじき出されることよって起こる。中性子が半導体内のシリコンの原子核と衝突し、はじき出された電子は電圧の高いドレインに流れ込むことで、スイッチ(ゲート)がonになっていないにも関わらず、電流が流れて出力電圧が低下する。例: 1V -> 0.3V -> 0Vフリップフロップだと一度ドレインが反転すると、インバータの相互作用で値が残ってしまうため、ロジックの場合と比べてエラー率が劇的に高まる。
出展: 「GPUを支える技術」,p111,Hisa Ando,2017
2章?でもあったように、上記のようなエラーに対応するためにメモリには一般的にECCがついている。
まとめ
3章は大部分がグラフィックスに関する説明やコラムだったため、内容が少なくなってしまった。しかし、GPUのメモリ帯域による演算のボトルネックやビットエラーが起こる理由が分かってなかなか楽しめた。そして、次は本書を買うにあたり1番楽しみにしていた4章なので、非常に楽しみである。本ブログに対するご意見や間違いの指摘などがありましたら、ぜひコメントください。TwitterでもOKです。
皆で議論を深めて行けるような場にしていきましょー。
コメント
コメントを投稿