2011の28日目の記事です。(予定)こんにちは、r7kamuraです。耳を澄ませば2011年の崩れていく音がしますね。今回は年末用にとっておいた残り少ない意識を使って、RubyでGPUを使う方法を紹介しようと思います。GPU?皆さんGPUはご存知でしょうか。3Dのゲームとかで綺麗なグラフィックを表示してくれるアレです。FF14とかと抱き合わせでハイエンドPC()に付いてたりするアレです。近頃だとノートPCにも搭載されるようになっていて、MacbookPro等にも搭載されています。*2GPUを販売している会社はNVIDIAとAMDの二社が有名です。NVIDIA社の販売しているGPUには主にGeForceという名前が付いていて、AMD社の販売しているGPUには主にRadeonという名前が付いています。MacはこれまでNVIDIA社製のものが搭載されていることが多かったものの、最近になってAMD社製のものが搭載されるようになっています。GPUはその並列処理能力の高さから、最近では数値計算などの目的でも応用されるようになってきました。このように汎用計算目的でGPGPUを利用することを、その筋の人はGPGPU*3と呼んでいます。詳しくはWikipediaでググッてください。PCにGPUが繋がっているというだけではそのまま演算資源として利用することはできません。GPUを用いて汎用計算を行うための方法(=環境/フレームワーク)は主に2つあります。1つはOpenCLというフレームワークを利用すること。OpenCLはApple社が仕様を提案したフレームワークで、これを利用すればNVIDIA社やAMD社のGPU上で動作するプログラムを書く/動かすことができます。去年発売されたAdobeCS5はOpenCLベースで開発されていて、いろんなところでGPGPUの恩恵を受けることができます。1つはCUDAというフレームワークを利用すること。CUDAではOpenCLとは異なりNVIDIA社製のGPUしか扱えないのですが、その分提供されているAPIが豊富な印象があります*4。Premiereの動画エンコードとかで活躍してます。実行環境や提供されるAPIの違いなど、どちらにも良し悪しがありますが、C言語(を少しだけ拡張した言語)を利用してコードを記述するという点で共通しています。話が長くなりましたが、次節ではこれらのフレームワークのRubyバインディング(Rubyラッパー)を利用してGPUでプログラムを動かす方法を紹介します。RubyRubyでGPUを使う方法、つまりRubyでGPGPUなプログラムを書いて動かす方法を紹介します。OpenCLとCUDA、どちらにもRubyバインディングが存在しますが、今回はOpenCLのRubyバインディングであるBarracudaを利用する方法を紹介します。10.6以降)ではOpenCLの環境が元からインストールされているので、Barracudaを入れるだけOKです。本家のRakefileではsudo権限で入れるようになっています。https://gist.github.com/1524778ではBarracudaを利用した簡単なコードを動かしてみます。要素数の大きな適当な配列を用意して掛けて足すだけの単純な内容です。n)Barracudaでは、上記のように文字列としてOpenCL用のコードを渡します。OpenCLとして妥当なコードならここでコンパイルが成功し、コードの中で定義した関数が実行できるようになります。簡単ですね!普通にRubyでやろうとすると逐次実行するのでイテレータで時間を取りますが、GPUを利用すれば単純に並列実行が可能なため実行時間短縮が期待できます。まとめ今回はRubyでGPUを扱う方法の1つとして、OpenCLを利用するBarracudaを紹介しました。発展途中な感じではありますが、意外と簡単に利用することができるため、処理の重い部分だけを局所的にGPUに任せるなどの使い方が期待できますね。明日の記事はDaic_hさんの予定です。