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

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が用いられるようになった。
ここで知ったのだが、shaderとは「影」のshadeから来ているらしい。

GPUの科学技術計算への応用

GPUが3Dグラフィックアクセラレータとして成功を収めていくと同時に科学技術計算でもそれを利用したいという人がでてきた。しかし、初期のGPUプログラムはグラフィック処理用OpenGLを用いて記述されており、汎用計算には適していなかった。
そこで、NVIDIAは2006年にSIMT方式を採用したG80アーキテクチャのGPUとCUDAをリリースした。今ではこれらはよく知られているが、当初はとても斬新なアイディアだったらしい。

GeForce 8800 GTXはSMを8機搭載しており、その内部にに単精度のFMAとFMを行うことができる演算ユニットを16個備えていた。

用語
SM: Streaming Multiprocessor
FMA: Floating point Multiply Add
FM: Floating point Multiply

その時点で既にGeForce8800 GTX GPUは518GFlopsの演算性能があったらしい。
スゴイ〔゚Д゚〕

2010年に登場したFermiGPUでは、SM内に現在ではおなじみのCUDAコアが32基搭載され、各サイクルで32個の単精度浮動小数点の積和演算が可能であった。
また、同時に1bitのECCも搭載していた。(64 : 8 なので SEC/DEDだろうか?)

並列処理のパラダイム

並列計算の方式として、MIMD, SIMD, SIMTを解説している。

MIMD: multiple instruction multiple data

一般的なのmulti core processorのように、各コアが別々の命令をデータを処理している方式。

SIMD: single instruction multiple data

SSE, AVX, NEONのように1命令で複数のデータを処理する方式。
同時に計算できるデータ数が固定なため、対象データが可変長の場合に効率が落ちる。
分岐命令の際には条件を満たさないデータはマスクされて一切計算されない。
また、SMID演算機にロードされるデータはメモリ上に連続した領域に保存されている必要があるため、別々になっているデータは一旦CPU側で並び替えを行う必要がある。この問題に対して、intel Xeon PhiプロセッサではScatter/Gatherを搭載し、飛び飛びのメモリアドレスにもアクセスすることができる。
後述するSIMTに対する利点は、回路が簡単なため、同一の面積でより多い演算器を搭載できることである。

SIMT: single instruction multiple threading

主にGPUで採用されている方式で、カーネル(GPU上で動くプログラム)を複数の演算機上で同時に動かす。
演算器の他にpredicate機構を備えており、前の比較命令の条件コードを記録し、
現命令のpredicate-bitと一致を取ることで、その命令を実行するかどうかを判定する。(実行しなくても実行時間は変わらない)
これにより、カーネル中の1つだけの命令を実行しないといったことができるが、あくまで命令を実行するかしないかを操作できるだけで、MIMDほど柔軟ではない。

SIMTのロード、ストア命令

128byteのバッファに4byte間隔で32入力セレクタが接続されており、
各スレッドは、その範囲であればどこへでもアクセスできる。
128byteに入り切らないアクセスがある場合、一旦バッファをクリアして該当する128byteを再度読み込み、全スレッドが処理を終えるまで、繰り返す。
各アクセスが128byteにバラけている場合、性能が最低になる。

enter image description here
図2.14 SIMT方式のメモリ読み出し部の構造 ,「GPUを支える技術」p62

各スレッドが要求している4byteデータが、128byteに含まれている確率を最大化するようなアルゴリズムがありそうだ?? (q)

SIMTはNVIDIAが開発。そのAMD, Intel 内蔵GPUなどが採用。ARMのMaliは現在SIMDだが、次世代からSIMTを採用予定。

まとめ

前半はグラフィックアクセラレータ技術やその歴史的経緯をメインに紹介していたので、少々読み流し気味になってしまった。後半ではGPUの科学技術計算への適用からアーキテクチャの大まかな思想を知ることができた。全体を通してだが、NVIDIAは現在主流となっている技術の多くを早期に導入しており(というかNVIDIAが広めた?)すごいな感じた。

余談だが、自分は本は初めからまんべんなく読む必要はまったくないと考えており、上記の読み飛ばしもで余り気にしていない。ただ、画像処理の計算手法はいずれ知識として学んでみたいと思っている。

次は3章に進みますが、平日に入るのでペースは落ちると思います。
最低でも1週間に1回は書きたいなー(_;)

本ブログに対するご意見や間違いの指摘などがありましたら、ぜひコメントください。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の要素がシェアードメモリ(後述)など、レイテンシのあるメモリに格納されている場合、各ブロードキャストでサイク