Snow Leopardが発売されてから2週間も経ちませんが、早くも「Mac OS X 10.6.1 Update」が公開されました。不具合の修正がメインですので、取り急ぎアップデートしたほうがよさそうです。
さて、今回は「OpenCL」について。従来は描画オンリーだったGPUのパワーをCPUとともに一般の演算にも活用するという、異種プロセッサを利用したヘテロジニアスな並列処理機構だが、Snow Leopardのシステム上を探せども探せどもその効果は見つからず……というわけで、Appleのサイト上で (非ADC会員にも) 一般公開されているサンプルコードをもとに、その効果のほどを検証してみたい。
Snow LeopardにおけるOpenCLの位置付け
OpenCLの仕様が確定し、「OpenCL 1.0」として公開されたのは2008年12月のこと。Snow LeopardはOpenCLを実装した世界最初のOSであり、その意味で"目に見える成果"を期待していたユーザは少なくないはずだ。
しかし、OpenCLの実装とはAPIおよびランタイム環境の提供であり、それを利用したアプリケーションの充実を意味しない。OpenCLの恩恵にあずかるには、プログラムにOpenCLのコード (実行されるマシンのGPUに応じてコンパイルされる) が含まれなければならず、しかも実行環境にはOpenCLに対応するGPUを必要とする。OpenCLのランタイム環境は、Snow Leopardにフレームワーク (/System/Library/Frameworks/OpenCL.framework
) の形で収録されているため、otoolコマンドでアプリケーションの実行ファイルのリンク状況を調べれば見当はつくのだが、/Applications
以下を一通り調べても、OpenCL.frameworkへリンクしているものは見当たらない。
つまり、Snow LeopardにアップデートすればOpenCLでビュンビュン……などと期待してはいけない。あくまで環境が整備されたという話で、Appleなどアプリケーション開発者がOpenCL対応を進めないかぎりは、特にメリットは得られない。
一方では、OpenCLはアプリケーションを選ぶ、という事情もある。GPUの特性を考えると、同じ種類の計算を大量に並行処理する必要があるアプリケーションでもないかぎり、OpenCLによる飛躍的なパフォーマンス向上は期待できない。身近な例では、テキストエディットやシステム環境設定をOpenCL対応にしたところで、特に効果はないだろう。オーディオ / ビデオのエンコーダや、Quartz Composerで作成するグラフィックモジュールのようなプログラムが、適していると考えられる。
とはいえど、OpenCLの効果を実感できるアプリケーションが欲しいもの。幸い、Appleがサンプルコードを「Mac OS X Reference Library」で公開しているので、これを自力でビルドするという方法がある。それでは早速、そのうちのいくつかを試してみよう。
開発環境の準備とサンプルコードの入手
Snow Leopardのインストールディスクには、「Xcode Developer Tools」が収録されている。統合開発環境のXcode 3.2をはじめ、コンパイラやデバッガなど開発支援ツール、ヘッダファイルに各種ドキュメントと、アプリケーション開発に必要な一式が揃っているため、事前にインストールを済ませておこう。
本稿執筆時点で公開されているOpenCL関連のサンプルコードは、以下に示すとおり。URLは変更される可能性があるため、リンク切れの際は「Mac OS X Reference Library」内を検索してほしい。使い方はかんたん、ダウンロードしたソースコードを適当なフォルダへ展開し、プロジェクトファイル (.xcodeproj) を開いて「ビルドと実行」ボタンをクリックするだけだ。
OpenCLを体感する
最初に試したのは「OpenCL RayTraced Quaternion Julia-Set Example」。4元数のジュリア集合を回転させつつレイトレーシングの技法で表示するというもので、OpenGLとの連携を伴う典型的なOpenCLの利用法となっている。
ビジュアル的には、「OpenCL Procedural Geometric Displacement Example」のほうがインパクト大かもしれない。「[」と「]」でオブジェクトの大きさを変えたり、ウインドウ上をマウスでドラッグしたりすれば、OpenCLの効果を実感できることだろう。
OpenCLのパワーを実感したければ、「OpenCL Procedural Grass and Terrain Example」が適当だろう。「.」と「/」キーでノイズバイアス値を上下したり、「-」と「=」キーで草の数を増減したりできる。「;」と「'」は風の強さだ。他にもパラメータ変更用のキーアサインがいくつか用意されているので、詳しくはソース (main.cpp) で確認してほしい。