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にバラけている場合、性能が最低になる。
図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です。
皆で議論を深めて行けるような場にしていきましょー。
コメント
コメントを投稿