スキップしてメイン コンテンツに移動

GPUを支える技術読み始めた 第3章

今回で第3回目の投稿だが、前回から1週間ほど間が空いてしまった。
一応、可能な限り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より高そうに見える。
上記はあくまで推定なので、時間があれば後に詳しく調べてみようと思う。また、詳しい方がいたらぜひ教えていただきたい。
enter image description here
出展: 「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
フリップフロップだと一度ドレインが反転すると、インバータの相互作用で値が残ってしまうため、ロジックの場合と比べてエラー率が劇的に高まる。
enter image description here
出展: 「GPUを支える技術」,p111,Hisa Ando,2017
2章?でもあったように、上記のようなエラーに対応するためにメモリには一般的にECCがついている。

まとめ

3章は大部分がグラフィックスに関する説明やコラムだったため、内容が少なくなってしまった。しかし、GPUのメモリ帯域による演算のボトルネックやビットエラーが起こる理由が分かってなかなか楽しめた。そして、次は本書を買うにあたり1番楽しみにしていた4章なので、非常に楽しみである。
本ブログに対するご意見や間違いの指摘などがありましたら、ぜひコメントください。TwitterでもOKです。
皆で議論を深めて行けるような場にしていきましょー。

コメント

このブログの人気の投稿

GPUを支える技術読み始めた 第5章[前半]

GPUを支える技術読み始めた 第5章[前半] 新年の休みもとうに終わり、皆さんどうお過ごしだろうか。 ちなみに主は年末読む予定であった本や論文を全く消化できずに今に至ってしまった。 年末年始は時間があったので、ひたすら読んでいたはずなのになぜだ。。_| ̄|○ 読むのが遅いのがいけないのか?翻訳するのが遅いのか??それともそれをまとめるのに時間がかかっているのか。 おそらく全て当てはまるが、時間がかかるものは仕方がないので、少しずつ慣れていくしかないなー。。(-_-;) 余談だが、年末にブログ執筆環境を再構築した。 今まではwebエディタの Classeur を利用していたが、やはり純粋なWebアプリケーションなのでレンダリングやアップデートに問題があった。そこで、今までも利用していたAtomを少しカスタマイズして試してみたが、どうにも動作が重くかつ、vim-modeがいい感じにならずに残念に思っていたところ、vscodeのことを思い出した。どちらもエレクトロンベースだが、vscodeはAtomより全然軽く、markdownプラグインも豊富にあるので、すぐにmarkdown+mathjax環境を構築することができた。いやはや、世の中は便利になったものだ(^ω^) せっかくなので、下に執筆環境のスクリーンショットを自慢げに貼ってみようと思う。(markdownは頻繁に見る必要はないので、普段はプレビューは別のタブで開いている) もしかして、こういうことしてるから時間がかかるのかな??/(^o^)\ それでは、本題に戻ろう。 今回はGPU支える技術の第5章だ。4章と同じく楽しみにしていた章なのでじっくり読んでいきたい。 なお今回も長い章なので、前半と後半に分けてまとめと感想を書いていく。 第5章 GPUプログラミングの基本[前半] GPUの超並列プロセッサでプログラムを実行するには、超並列で実行でき...

GPUを支える技術読み始めた 第4章 [前半]

今年もあと少しになってきたが、なんとか目標だったもう一本を投稿することができて良かった。 私情だが、先日の社内年末パーティでは年間MVPに選出していただいた。\(^o^)/ 非常に嬉しく思うと同時に、いろんな面でサポートをしてくれたHWチームメンバやバックオフィスに感謝したい。 また、来年は社内だけでなくて社外にも影響を与えられるよう頑張っていきたい。 少し気が早いが、来年度の本ブログの方針として「基礎と応用」というコンセプトで書いていきたと考えている。古典的名著と最新の論文の要約などができたら上出来だろうか。(^ω^) 直近だと、DeepLearning × HWに関するの新しめの論文や並列処理技法系の本のまとめを計画している。もしかすると、年内にまだいけるかもしれない。 良い報告もできたところで、早速続きを初めていこうと思う。 4章は個人的には一番楽しみな章でじっくり読んでいる。内容が多いので前半と後半に分割して投稿していく。 4章 GPUの超並列処理 [前半] GPUの並列処理方式 先の章で並列処理方式について以下のように説明した。 SIMD: 1つの計算を幾つかのデータに対して並列に実行する SIMT: 1つの計算を別々の演算機で並列に実行する 4章では上記2つについてもう少し詳しく解説している。 SIMD方式 以下2つのベクトルXと行列Aがあるとする。 \[ \begin{align} \bf{X} &= (a, b, c) \\ \bf{A} &= \left( \begin{array}{ccc} a00 & a01 \\ a10 & a12 \\ a21 & a21 \end{array} \right) \\ \bf{Y} &= \bf{X} \cdot \bf{A} \end{align} \ \] Yを計算する時、SIMDでは先にXの列要素(a)を各演算機にブロードキャストし、Aの行要素(a00, a10, a20)と計算する。この動作をXの列要素分繰り返すことで計算を完了する。 仮に、Xの要素がシェアードメモリ(後述)など、レイテンシのあるメモリに格納されている場合、各ブロードキャストでサイク...

GPUを支える技術読み始めた 第2章

2日連続で第2回目の投稿である。 そもそも書き溜めをしてあったり、本ブログを初めたのが土日で比較的時間をとれたのは大きい。 前回でBloggerのエディタではMarkdownやLatexが使えず不便だったので、どうにかならないかと探していたところ、 このブログ を見つけ Classeur というWebエディタを使い始めた。 普段はメモ用として使っているQuiverやAtomと言ったオープンソースの高性能エディタを使うこともできたが、やはり変更のたびに投稿を行わなければいけないのはめんどくさい。ClasseurはMarkdownが使え、かつBloggerと連携して1クリックで更新ができる。いつもながら有益な情報を残してくれた先人に感謝である。 物事を継続するのコツとして、いかにメイン作業以外の手間を減らすが重要だと感じているので、ここでもそれに従うことにする。 もちろん環境の導入やそもそもの事前調査に時間は使ったが、長く続ければ十分にもとがとれるので、初めのうちにやっておいた( ・´ー・`) 上記以外にもLatexを使えるようにするためにMathjaxをBloggerのテンプレートに導入した。 準備は万端、早速書き始めよう。 2章 計算処理の変革 ゲームと画面描画の内容が多く、少し前回と同様に流し読みぎみ。 初期グラフィックボードである1983 年に Intel が発表した iSBX 275というボードは、256 x 256ピクセル解像度で8種類の色を利用可能だった。 続く1996年にha3dfx Interactive社がVoodooシリーズを、1999年にはNVIDIAはGeForde 256を発表した。 GeForce 256を含む初期GPUの主な目的は、3Dグラフィックスに必要なT & L(Transpose & Lighting)処理を高速に行うためであったが、当初の性能はハイエンドCPUに負ける程度であった。その後、ムーアの法則に従って搭載できるトランジスタの量が増えるにつれて、CPUの10倍以上の性能を出せるようになっていく。 当初はTransposeとLightingの処理は別々のパイプラインとなっていたが、 リソースを柔軟に使いまわしすことで、効率を上げるUnified shaderが用いられるよう...