HOME > 製品情報 > GPUコンピューティング > ホワイトペーパー > MEXによるCUDAのコンパイル
2011.12.9 掲載MEXによるCUDAのコンパイル
MEXによるCUDAのコンパイル
MATLABは米国のMathWorks社が開発している数値解析ソフトウェアです。行列やベクトルの演算に特化して設計されていること、グラフ化や3次元表示などが容易におこなえること、分野に特化した関数を集めたToolboxと呼ばれる拡張パッケージが数多くリリースされていることなどの特長を有しており幅広い分野で応用されています。また、関数が豊富にあり、インタプリタ型の言語であることから比較的短時間で簡単にプログラムの実装ができます。
MATLABはパラレルコンピューティングにも対応しています。デフォルトでは一部の関数がマルチコアCPUによる演算に対応しています(バージョンに依存します)。拡張パッケージであるParallel Computing Toolboxを追加することで、マルチコアCPUだけでなく、GPU(GPGPU)やコンピュータークラスターを利用したパラレルコンピューティングができるようになります。デフォルトと大きく異なる点はMATLABの高水準な関数を使って自前の並列計算用プログラムを書くことが可能になることです。
MATLABの豊富な関数とCUDAコンピューティングによる高速化を融合させることでアプリケーション開発の幅はさらにひろがることになるでしょう。本稿では既存のCUDAプログラムをMATLABで使用するための一つの手法としてMATLABのMEXを用いた方法をご紹介します。
MATLABにはC/C++言語やFORTRANで書かれたプログラム資産を有効活用するためのMEXと呼ばれるシステムがあります。MEXを使うことで既存のC/C++言語やFORTRANで書かれたプログラムをMATLAB関数と同じようにコマンドラインから呼び出すことができるようになります。この機能はMATLABに用意されたC/C++、FortranのAPIおよびシステムにインストールされているコンパイラによって実現されています。MATLABプロンプトからのmexによるコンパイルは次のように行います。以下の作業はすべてMATLAB上で行います。
>> mex hoge.c
コンパイルするとhoge.mexw64(環境によって拡張子は異なります)という実行バイナリ(mexファイルとよぶ)が出来上がります。mexファイルは通常のMATLAB関数と同様に戻り値や引数を指定できます。
>> y=hoge(x);
CUDAはC言語の拡張ですので、既存のcuファイルにMATLABのAPIを追記すればMEXファイルとして扱うことができそうです。既存のcuファイルに追記する内容は、MATLABとのデータの受け渡し部分です。具体的なコーディングは通常のC/C++と同様ですので割愛させて頂きます。詳細はMATLABのヘルプのユーザーガイド/External Interfaceの項を参照してください。次にコンパイルですが、通常のmexコンパイルではCUDA特有の演算子を解釈できません。そこで次のように2段階のコンパイルをすることで対応します。
1. nvccによりCUDAコードをC言語プログラムに変換
nvccのコンパイルオプションにはコンパイルの段階に応じてファイル出力形式を指定できるものがあります。今回はこのなかで"-cuda"オプションを使います。-cudaオプションは.cuファイルを.cu.cという拡張子を持つc言語のソースコードに変更します。
>> !nvcc -I/Applications/MATLAB_R2011b.app/extern/include -cuda hoge.cu
このとき、mex.hを含んだディレクトリを忘れずに指定しましょう。
2. 変換したC言語プログラムをmexでコンパイル
変換したファイルは単純なCファイルですので、そのままmexコマンドでコンパイルすることができます。ただし、CUDAのダイナミックリンクライブラリへのパスを明示的に指定する必要があります。これらはmexコンパイラに依存してパラメータが変わります。UNIX系OSでmexコンパイラにgccを使っている場合は次のようになります。
>> mex 'LDFLAGS="\$LDFLAGS -Xlinker -rpath /usr/local/cuda/lib" ' hoge.cu.c
また、mexのコンパイルオプションはデフォルトではmexopt.shというファイルに書かれています。このファイルをコピーして上記内容を追記し、mexコンパイルのオプションに指定することもできます。
>> mex -f cudamexopt.sh hoge.cu.c
著者の所属では陽電子放射断層撮影法(PET)による分子イメージングを中心として磁気共鳴映像法(MRI)、光脳機能イメージング(fNIRS)、二光子励起レーザー走査型顕微鏡、レーザースペックル血流計測法などヒトから小動物まで様々なイメージング技術を駆使した研究を行なっています。
図1は頭部組織内を光がどのように伝播するかシミュレートしたものです。このシミュレーションでは有限要素法を用いており、大規模疎行列の数値演算が必要となります。この部分をCUDAで実装することで高速化を図り、可視化はMATLABで行なっています。シミュレーションで求めた光伝播の空間的な分布を応用することでfNIRSの画像再構築の精度を改善することができます。GPUによるパラレルコンピューティング技術を駆使すればリアルタイムで高精細な脳機能画像を捉えられるようになるのではと期待しています。
また、図2は二光子励起レーザー走査型顕微鏡で撮像したマウスの脳組織中の血管像にNLMフィルタを適用したものです。この画像は1024 x 1024 x 220の3次元画像の中から256x256x1 の部分のみ切り取っています。このような膨大な量の脳血管ネットワークの血管系や長さなどの特徴量を自動的に解析するにはデノイジングフィルタが必須です。Non-local means(NLM)フィルタは強力なデノイジングができますが、パラメータが複数あり最適化が必要なこと、計算コストが非常に高いことという問題点があります。NLMフィルタをCUDAで実装し、結果の可視化や最適化パラメータの比較をMATLABで行うことで画像に適したフィルタの評価を簡単に行えるようになりました。
このようにCUDAによるハイパフォーマンスなパラレルコンピューティングとMATLABによる容易なプログラミングの融合し、画像解析やシミュレーションに応用したことで研究が大いに前進しています。
謝辞
本研究の一部はコニカミノルタ科学技術振興財団の助成のもとに行われました。また、共同研究者の慶應義塾大学理工学部岡田英史教授、放射線医学総合研究所分子イメージング研究センター先端生体計測研究プログラムの伊藤浩プログラムリーダー、田桑弘之研究員に深く感謝申し上げます。
著者:
川口 拓之
独立行政法人
放射線医学総合研究所
分子イメージング研究センター
先端生体情報研究プログラム
生体情報計測研究チーム
※ MATLABは米国The MathWorks, Inc.の登録商標です。
※ その他の各製品名は、各製品開発元の商標または登録商標です。
