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

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

待望のブログ第一弾!(誰の?)
ということで、「GPUを支える技術」の簡単な要約と感想を書いていこうと思う。
余談だが、Bloggerは本家ではMarkdownをサポートしていないようだ?
Web上ではStackEditなるエディタを使ってMarkdownを書いている人がちらほら見られる、、Blog初心者なんでこの辺はよくわかりませんが、もしかしたら導入していくかも?


ここから本題。
GPUを支える技術、今回は諸事情によりPDF版で購入した。




毎度本を買うときは悩むんですよねー、
PDFは便利なんだけど仕事の終わりとか目が疲れてる時には本のほうが集中できたりするんで。

全体の構成はこんな感じ

第1章 [入門]プロセッサとGPU
第2章 GPUと計算処理の変遷
第3章 [基礎知識]GPUと計算処理
第4章 [詳説]GPUの超並列処理
第5章 GPUプログラミングの基本
第6章 GPUの周辺技術
第7章 GPU活用の最前線
第8章 プロセッサとGPUの技術動向
(引用: http://gihyo.jp/book/2017/978-4-7741-9056-3)

おお、すごく面白そう(^o^)
仕事柄GPUはよく利用するし、詳しい内部アーキテクチャにも興味があるのでちょうどいいかも。早速、 第1章を読んだので以下に以下にメモ。


1章

概論的な感じ。その他にはディスプレイやゲームグラフィックス中でのオブジェクトの表示方法について述べている。CPUはスポーツカー, GPUはバスと例えているのも面白い。

GPUの歴史

NvidiaがGPUを1999年に発売, GPUという命名もNvidia。初めの10年はinteger演算のみ、その後floatへ。

GPUの性能

CPUとの性能比較が乗っていた。
浮動小数点演算において、Nvidia GTX1080 は intel corei7 6700k の16倍早い。
8,228GFlops / 512GFlops ~= 16.07  (Latex使いたいな。。)
オフチップのメモリバンド幅も約9.4倍多い。
320(GB/s) / 34.1(GB/s) ~= 9.38`
オンチップメモリは4倍少ない。(LLC比)
8GB / 2GB = 4
消費電力は約2倍
180W / 91W ~= 1.98
すこし気になったのは、倍精度演算器の数はあまり差がないこと。
80 vs 32 




GPUの種類

GPUは大きく3種類に分類される
  • OnChip Mobile GPU

CPUとGPUがワンチップにまとまったSoCが代表的。消費電力が小さく、ビジー状態でも数W
  • OnChip GPU

CPU上にGPUが内蔵されているケース。intel coreシリーズやAMDのAPUなどが該当。mobileに比べて数W ~ 100W程度の消費電力がある
  • Discrete GPU

Nvidia GTX1080など。PCI Expressで接続されるような、CPUと独立したモデルのこと。
個人的には1番一般的なGPUな気がする。

メモリ空間問題

複数CPUの場合、メモリを共有するSMP(symmetric multi processor)構成が一般的。GPUの場合、バンド幅がCPUと違う(10倍ほど大きい)ため、上記のように共通のメモリーを使うことは難しい。しかし、PCI-E経由のdmaはオーバヘッドが大きく、大量のデータを転送にはあまり適していない。GPUとCPU間で共有のメモリ空間を利用できるようにすることがGPUベンダの目標らしい。
OnChip GPUでは上記が容易で、同一メモリを利用しているケースが多い。intel skylakeでは L4キャッシュを用いて、GPUの必要とする高バンド幅を実現しようとしている。
3Dレンダリングの場合は1pixelが16byte以上のGPUメモリが必要であり、mobile GPUだと入りきらない。従って、タイリングを行い 32 x 32 pixelなどに分割してデータの更新を行っている。一方で、GPUメモリが豊富なディスクリートGPUではフルバッファ形式が一般的。

SIMT

CPUで一般的なSIMDに対して、GPUではSIMT(single instruction multiple threading)方式が用いられる。各演算をデータレベルで分割する代わりに、専用のプロセッサを割り当てるイメージ。スレッドレベル並列性というやつだろうか。(こちらはMIMD??)各プロセッサは計算にトータルで16サイクル必要だが、同時に4つ動いているので結果16サイクルですべての処理が終了する。

まとめ

GPUについて基本的なことが書かれていて、思い出す意味で良い内容だった。
実は「コンピュータの構成や設計」の付録でもGPUについては触れられていて、学生の時に読んでいたので1章は必要ないかなと思っていたが、
いやはや、人はつくづく忘れる生き物だと思った。。

上記以外に3Dモデルがどのようにディスプレイ上に描画するかなど、画像処理系の内容も書かれたいたが、個人的な興味から性能や実行方式ばかり注目してしまった。。
この本は対象として、GPUをゲームのグラフィック処理と科学技術計算に利用する場合を分けて解説しているらしいので、今後は後者メインになりそう。(ゲーム好きな方、ごめんなさい。)

兎にも角にも、次は2章にすすむ。
実は既にもっと先まで読んでいるんですが、急ぎすぎてもすぐネタ切れになっちゃうので気長に行きます(^q^)



コメント

このブログの人気の投稿

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が用いられるよう...