2009年8月31日月曜日

もはや真っ黒なCUDA講座~そのいち~




どっかーん
なぜなに真っ黒、はじまるよー!


憂煉「というわけで、もはや真っ黒なCUDA講座が始まります。今回はCUDAの概要にとどめ、次回あたりでプログラミングに入ろうと思います」

yreeen「……英単語を覚えまくる計画はどうなったんだ?」

憂煉「同時並行で進んでるよ。単語力お勧めです」

yreeen「そうか」

M3a「激しくバージョンアップがされまくっているNVIDIA社のCUDA。ここだけの話、日本語のドキュメントが充実するのは英語のドキュメントが出てから2~3ヶ月遅れます。その間にもCUDAがバージョンアップしちゃったりと、日本語ドキュメントだと最新情報を追いかけられません。加えて、NVIDIAの方には悪いのですが…個人的に言うと、あのドキュメントは解りにくいです」

yreeen「だろうなぁ。技術文書の翻訳って色々大変だから」

M3a「で、東工大の先生が『CUDAプログラミングガイド』という書籍を9月の末から10月頃に出版するそうです。もっともCUDAがわかりやすく、また丁寧に日本語で解説している初めての書籍になるらしいです」

yreeen「なんでそんな事知ってるんだ?」

M3a「そりゃあNVIDIA社の人に聞いたからですよ」

yreeen「そうか」

憂煉「まぁ、学園長の思いつきなノリでCUDA講座をやってみようかと思います。CUDAって何?、CUDA面白そう、CUDA面白い!の間にある垣根を取り払うことができれば幸いです」

yreeen「勉強やDXPのバグ取りが先なんじゃないか?」

憂煉&M3a「…」

~いんとろだくしょん終わり~


憂煉「C言語を ルトラかつ イナミックにする ーキテクチャ」

M3a「略してCUDAだね☆」

yreeen「実際の雰囲気は合ってるけどぜんぜん違うぞ!Compute Unified Device Architectureの略!漢字にすると『統合装置演算機構』!」

M3a「漢字にすると余計にわけわかんないね」

憂煉「まぁ要するに、GeForce8000番台以降のNVIDIA社製グラフィックスボードに使われている『統合型シェーダー』をC言語+αで使っちゃおうというわけですよ。物凄い並列計算ができるってわけ」

yreeen「似たような技術に今は亡きATI社のロゴがついた『ATI Stream』というのもある。が、日本語ドキュメントが少なすぎてやる気がおきないRadeon系列のグラボは持ってないので扱えないんだ」

M3a「一応、鯖に使ってるんだけどね…まぁ内輪ネタは置いておきましょう」

憂煉「ちなみに、統合型シェーダー一つのことを『Streaming Processer』と言い、それが8個合わさると『Streaming Multprocesser』と呼ばれます」

yreeen「SPとSMだな…えすえむ…はぁはぁ」

M3a「突っ込まないよ? なぜ8個一組かというと、ハードウェア上の実装が8個一組になっているからです」

憂煉「GTX295ならSM数が480個。つまりSP数なら3840個!お陰で1.8テラFLOPSという一昔前のスーパーコンピューター並みの演算能力を秘めています」

yreeen「すげえな。まさにパーソナル・スーパーコンピュータだ」

M3a「NVIDIA様々です。さて、CUDAの歴史だとかGPUの構造だとかすっ飛ばして『SMにはSPが8個入ってるんだよ』等とどうでもよさそうな事を言ったのには、ちゃ~んと理由があります」

憂煉「SP上のレジスタとグラボに搭載されているデバイスメモリーの他に、SMの内部のSP8基が共有する『シェアドメモリー』というのがあるからです」

yreeen「デバイスメモリーだと遅すぎて、アクセスする度に数百クロックが無駄になる。しかしレジスタでは容量が足りない…そんな時に使える奴だ」

憂煉「複数のSPで共有するからデバイスメモリーにアクセスする回数が減らせるし、レジスタ並みに高速なので安心して使えます。SM1基あたり16KByte実装されてます」

M3a「ただし、変数宣言時に明示的に指定しないと使われません。今回は概要にとどめたいので詳しくは後日」

yreeen「…CUDA使う上で最低限必要なハードウェアの知識はこれくらいか?そろそろソフトウェアの方に入りたいんだが」

憂煉「そうだね。1=3人で書くと長いけど、実質SPとSMとシェアドメモリーくらいかな」

M3a「じゃぁ、次はソフトウェア面です。主な用語を先に言っちゃうと、『カーネル』、『グリッド』、『スレッド』ですね」

憂煉「スレッドの集まりがグリッド、その集まりがカーネルってとこです。基本要素となるスレッドは、まぁ普通のプログラムと同じものだと考えてください」

M3a「大量のプログラムがグループを作り、そのグループがさらに集まって大量のデータを処理するわけです」

yreeen「CUDAを使う際には幾つのスレッドをグリッドにするのか、幾つのグリッドをカーネルにするのかの二つを指定する必要があるんだな。これはC言語の文法に無いものだから、シェアドメモリと同様にCUDAで拡張された文法が使われるが…まぁ次回をお楽しみに」

M3a「ハードウェアとの対応関係としては以下のようになります」

  • 一つのカーネルは一つのGPUに割り当てられる。

  • 一つのグリッドは一つのSMに割り当てられる。

  • 一つのスレッドは一つのSPに割り当てられる。


M3a「つまり、シェアドメモリはグリッド単位で共有されることになります」

憂煉「たいていの場合、スレッド数>SP数(=8)となってしまいます。これはメモリアクセスの遅さを誤魔化すのに利用されます」

yreeen「具体的には、スレッドがデバイスメモリへのアクセスを始めた途端に、SPはそのスレッドの処理を停止して別のスレッドを実行するんだ」

M3a「あれ?スレッドを切り替えるためにはレジスタの内容をどこかに退避しなきゃいけないから、余計遅くなるんじゃないの? とか考えた貴方。鋭い!でも心配ご無用であります」

憂煉「レジスタは8196本もあるので、退避せずにガンガン使えるんです。スレッドの切り替えにかかる時間はたったの1クロック!」

yreeen「こうしてメモリアクセスの終了を待っている間に他のスレッドを処理してしまえば、メモリアクセスの遅さを隠蔽できるというわけなんだなコレが」

M3a「まぁ遅いといっても、デバイスメモリの速度は普通のPCのメインメモリの速度と比較して数倍~数十倍は速いんだけどね。SPから見たら遅すぎて時間が止まっているように見えるだけです」

憂煉「まぁ、概要はこんなもんです。次回の真っ黒講座ではCUDAのSDKのインストールとかを扱う予定です。最終回では簡単なプログラムと最適化の効果について小一時間…等とたくらんでます」

M3a「では、今日はここらへんで幕引きとさせて頂きます」

~反省会~


憂煉「とりあえず概要はこんなもんかな?ハードウェアの概念とソフトウェアの用語、それらの相互関係と無駄知識をしゃべれたつもりなんだけど」

yreeen「文字ばっかりだな。今度は図も載せたい」

M3a「えし だれか たのむ

yreeen「また懐かしいネタだな…」

憂煉「兎に角、コメント待ちですね。わかりにくい場所を指摘してもらえれば嬉しいな」

yreeen「…ところで、冒頭のナデシコネタだが」

M3a「にょ?」

yreeen「古くね?」

憂煉「馬鹿野郎!作品やキャラクターへの愛はalways&foreverなんだよ!」

M3a「そーだそーだ!」

yreeen「A&Fって英語圏での結婚に関する決まり文句じゃないか…お前何人のキャラクターと結婚するつもりだよ」

憂煉「お前ら全員嫁に来い!」

M3a「こい~!」

yreeen「もうだめだ…」

0 件のコメント:

コメントを投稿