読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

papixの異常な修論 または私は如何にしてGPGPUを知り修論のテーマとするようになったか

※この記事はGPGPU Advent Calendarの第5日目です.

みなさまこんにちわ, @と申します. 今回は@さんから,


こんな感じにネタを振られたので, 豪快に受け止めた上で斜め上の方向に大暴投してみたいと思います!!

papixの異常な修論 または私は如何にしてGPGPUを知り修論のテーマとするようになったか

というわけで, 今回は現在大学院の修論として取り組んでいる「PerlにおけるGPGPU環境の改善(仮題)」についてお話しさせていただこうと思います.
「取り組んでいる」といっても, ぶっちゃけGPGPUに詳しくないので, それに関する基礎知識を学んだり, 先行研究を調査しているという段階なんですけどね...

自己紹介

その前に自己紹介をさせて頂きます. GPGPUアドベントカレンダー経由でお越しいただいた人の大半は, 私の事なんて知らないでしょうし.

  • 大学院生(M1)です.
  • Perl使いです.
  • 「Perl入学式」という初心者向け勉強会を開催(代表取り締られ役)しています.
  • エンジニアのゆるい飲み会「Namba.pm」の言いだしっぺもやっています.
  • その他, 全国各地のPerlコミュニティに乱入しては意味不明な発表をした上, いろいろ引っ掻き回して帰っているので, いつか指名手配されそうで怖いです.

GPGPUとの出会い

自分の研究室は割といろいろな研究をやっている(やらせてくれる)所で, 過去はPS3のGPUを使ったGPGPUとかもやっていたらしいです. その為, 「GPGPUという技術がある」という事は知っていました.

いろいろ動き出したのは今年の1月, Hachioji.pmのついでに... じゃなかった, 修論テーマ案のアイデアを探しにVLD研という学会に行った時のことです. 「Rubyを用いた分散GPGPUフレームワーク『ParaRuby』の開発と評価」という発表をしている学生さんが居て,

「RubyとGPGPU... そういう研究もあるのか!」

と思った訳です.
よくよく考えれば, PythonとCUDAを組み合わせたPyCUDAとかもあるし, LL言語でGPGPUというのは割と面白いテーマだなぁ... と思ったのですが, その時気が付きました.

「アレ? PerlとGPGPUって... あんまりなくね?」

そして修論へ...

それから半年後. 3月から続いていた仕事(共同研究)が片付いたので, そろそろ修論に取り組もうか... と思った時に真っ先に思い出したのが, 「PerlとGPGPU」でした.
ググったり, 知り合い(Perl使いかつGPGPUで研究をしている@くん)に聞いたりして調べた結果, 少なくともPerlにはPyCUDAのような, CUDAを便利に使える高性能なモジュールは存在しないという事がわかりました(実は, PerlのInline::CのようにPerlのコード中にCUDAを埋め込むことができるCUDA::Minimalというモジュールがあります. これについては後述).

...これは, 修論のネタとして使えるのではないか?

GPGPUの為にはグラフィックカードを積んだPCが必要だし, もしかすると研究費で買ってもらえるかもしれない. そしたら毎日Minecraft三昧だ.
PerlでGPGPU(CUDA)をいい感じに使えるモジュールを書けばPerlという言語に貢献できるし, CPAN Authorとしてまともなモジュールをアップできるし, うまくいけば来年のYAPCのトークのネタになるかもしれない.
加えて修論のネタとして取り組めば, これで卒業できるし... 一石二鳥ってレベルじゃない.

「...よし, やるか!!!」

CUDA::MinimalとIkra

まずはPerlのInline::Cのように, Perlのコード中にCUDAのコードを埋め込んで, いい感じに使うことができるモジュールを書こうと思ったのですが, このモジュールは既に存在しました. 前述のCUDA::Minimalです.
そこで方針を, 「"Perlのコード"をCUDAに変換して, いい感じに使うことができるモジュールの開発」に変更しました. このアイデアは, 東京大学が開発したIkraというRubyのモジュールから得ました. ...というか, これのPerl版です.

自分が一方的にGPGPUの師匠と呼んでいるmoznionくんも言っていた事なのですが, CUDAのコードは割とややこしいです. 「どうしてもCUDAを使わなければならない...!」という場合はともかく, 「軽くGPGPUで遊んでみたいなー」という時に, これは大きな障壁となります.
もしもLL言語をCUDAに変換することができれば, 日頃使い慣れているLL言語でCUDAを操作することができるので, この障壁を崩すことが出来るに違いありません. また, 「これ, CUDAにすれば早くなるかな...?」という時に, 簡単な検証をする... という場面でも有効に使うことができるはずです.

Ikraは, どうやらRubyのコードをCUDAに変換して, これをコンパイルすることでRubyからGPGPUを使用しているようです. いわば, 「Ruby→CUDAのコンパイラ」... という感じでしょうか?
当初はこの方法での実装を考えていたのですが, 先日のKOFでのlikrさんのアドバイスで, またもや方針を変換することになりました.

likrさんの助言

likrさんが教えてくださったのは, 関東GPGPU勉強会で行われた「LLVM meets GPU」という発表でした. まだまだGPGPUに詳しくないので細かいニュアンスが間違っているかもしれませんが, 端折って説明すると「PythonのコードをNVVM(GPU向けのLLVMのサブセット)に変換し, 更にここからPTX(CUDAのアセンブリ言語みたいなやつ)に変換することで, GPUで実行するコードを生成する」という感じです.

コードをCUDAのプログラムに変換するIkraよりはスマートな気がしますし, NVVMからPTXに変換する段階である程度の最適化が可能というのも魅力的です.
当初の予定から考えると, 難易度が大幅に上がってしまう気がしましたが... ある程度の難易度がないと修論の審査で目を付けられそうですし, これくらいがいい塩梅でしょう.

というわけで...

現在, 次のような機能を持つPerlのモジュールを開発しようとしています.

  • Perlコード中にCUDAのコードを埋め込み, GPUで実行する(=CUDA::Minimal).
  • 任意のPerlコードをCUDA化し, GPUで実行する(pynvvmのPerl版).
    • GPUが使用不可の場合, Perlのみで実行できるようにする(GPUがない環境でも, 速度を犠牲にして実行可能にする).

...ぶっちゃけ先行事例の組み合わせなので, その辺を突っ込まれると修論としては苦しいです. まあその時は... 違うテーマを用意して乗りきれるのではないかと, 割と楽観視しています.
とりあえず, もう修論とか卒業とかは置いといて, このモジュールは絶対に完成させようと思っています. こういうモジュールがあれば, Perl使いの人も気軽にGPGPUを試せるようになるでしょうし, そうなればGPGPUというジャンルもより活気づくのではないかと. そうなればいいな, と思いつつ頑張っている日々です.

今後の抱負

GPGPUに関しては本当に素人なので, 一歩ずつ勉強しながら実装していく事になると思います. まだまだわからない事だらけなので, twitterやブログ等でいろいろと御指導頂ければ幸いです.
あと, 類似の研究やプロダクトをご存知でしたら是非教えて頂ければと思います. 修論として発表する場合, その辺りの情報は非常に重要になりますので...

最後に

この取り組みを通して, GPGPUという技術を学びつつ, いろいろと楽しみたいなー, と思っています.
いろいろと勉強会にも参加させて頂くかもしれませんので, その時は宜しくお願い致します!

To Be Continued...

12月6日分は@さんです!