はじめに
CUDALink を使うと,GPU(グラフィカルプロセッシングユニット)上のCUDA並列計算アーキテクチャが Mathematica から利用できるようになる.CUDALink にはCUDA対応のGPUを使って線形代数,金融シミュレーション,画像処理など多くの分野におけるパフォーマンスを向上させる関数を含んでいる.CUDALink はCUDAと既存の Mathematica 開発ツールを統合し,高度な自動化と制御を可能にする.
Getting Started
CUDALink 関数を使うには,アプリケーションをロードしておかなければならない.
CUDAQはCUDAが利用できるデバイスが使用できるかどうかを示す.
| Out[2]= |  |
CUDAQがFalseを返す場合は,CUDALink は使えない.詳細は「CUDALink の設定」を参照のこと.
CUDAInformationはグラフィックスプロセッシングユニットについてのより詳しい情報を表示する.ここではGPUは96コアのQuadro FXユニットで,グラフィックスメモリは1GBである.
| Out[3]= |  |
Mathematica では,RandomRealコマンドを使って実数の乱数行列を作ることができる.
以下のように,行列をそれ自体と掛け合せる.
| Out[5]= |  |
グラフィックスプロセッサを使い,CUDADotで掛け算を行う.
| Out[6]= |  |
CUDAMemoryLoadでGPU上にデータをロードするとさらに速い.結果はCUDAMemory式となる.これはその後の計算で,データへのハンドルとして使うことができる.
| Out[7]= |  |
CUDAMemoryをCUDADotに渡す.これは結果をGUP上に保管し,新しいCUDAMemory式を返す.
| Out[8]= |  |
グラフィックスプロセッサ常のデータはCUDAMemoryGetで取り出すことができる.以下では,結果の次元が想定どおりに示される.
| Out[9]= |  |
CUDAと CUDALink
CUDAはNVIDIA GPU(グラフィックスプロセッシングユニット)のための計算エンジンとして使われる.CUDAは CUDALink を使った場合の Mathematica 等のソフトウェアアプリケーションによって呼び出すことができるプログラミングインターフェースを提供する.これによりCUDA GPUが並列計算に使用でき,多くの並行スレッドが実行できるようになる.以下のグラフは,CPUとGPUのパフォーマンスを示している.これは1秒あたりの10億回の浮動小数点演算の実行回数(GFLOP/s)で示されている.
CUDALink を使うと Mathematica ユーザはCUDAプログラミングレイヤーを直接呼び出すことができるようになる.また,CUDALink は高性能コア線形代数やフーリエ変換等の分野での解法のための,多くのCUDAライブラリの高レベル関数を提供する.
CUDALink の適用分野
CUDALink は多くの分野のための関数を提供する.これらには注意深くチューニングされた線形代数,離散フーリエ変換,画像処理アルゴリズム等が含まれる.このセクションでは,この中からいくつかの適用分野を紹介する.
画像処理
CUDALink はGPU上で動作するように慎重にチューニングされた多くの画像処理アルゴリズムを提供する.この中には,画像の二項演算(CUDAImageAdd,CUDAImageSubtract,CUDAImageMultiply,CUDAImageDivide),モルフォロジー演算(CUDAErosion,CUDADilation,CUDAOpening,CUDAClosing),画像のたたみ込み(CUDAImageConvolve)等が含まれる.
CUDALink の機能を使用するには,まず以下のように CUDALink アプリケーションをロードしなければならない.
これでCUDAベースの画像処理機能が画像に直接適用できるようになった.次の例ではCUDAImageMultiplyを使って2つの入力画像のチャンネル上での積算を実行する.
| Out[2]= |  |
CUDA関数は Mathematica 関数であるので,他の関数(Manipulate等)と併用することができる.次の例では線形補間を実行するが,補間パラメータを変化させるのにManipulateを使う.
| Out[3]= |  |
CUDA関数は Mathematica の精選されたデータ,ImportとExport,可視化関数と組み合せて使うこともできる.次の例ではコアとなる計算はCUDAで行われるが,他の関数については Mathematica を使う.
| Out[5]= |  |
フーリエ解析
関数CUDAFourierおよびCUDAInverseFourierはCUDAを使ってフーリエ変換と逆フーリエ変換を実行する.
CUDALink の機能を使用するには,まず以下のように CUDALink アプリケーションをロードしなければならない.
| Out[3]= |  |
CUDA関数への入力がCUDAMemoryハンドルなら,結果もCUDAMemoryハンドルとなる.
| Out[5]= |  |
その後,CUDAMemoryGetを使ってGPUからデータを取り出すことができる.
| Out[6]= |  |
この一般的な原理はすべての CUDALink 関数に当てはまる.これにより,GPU上にデータを保管しておくと,検証,開発,そしてその後の作業が行いやすくなり,効率が向上する.
CUDALink プログラミング
CUDALink の鍵となる機能は,新しいGPUプログラムの開発と,そのプログラムの Mathematica の作業への統合を行いやすくする方法である.これにはCコンパイラがインストールされていることが必要である.
CUDALink の機能を使用するには,まず以下のように CUDALink アプリケーションをロードしなければならない.
簡単なCUDA関数をロードする.これは入力ベクトルを取り,各要素を2倍する.
| Out[15]= |  |
CUDAFunctionLoadにはCコンパイラがインストールされていることが必要である.これが利用できない場合は,「Cコンパイラ」を参照されたい.
関数の呼出しに使われる入力ベクトルである.
CUDAFunctionを呼び出す.
| Out[17]= |  |
GPUにデータをロードし,データ上に関数を呼び出す.結果はCUDAMemory式である.
| Out[6]= |  |
GPUから結果を取り出す.
| Out[7]= |  |
以下に示すように,CUDAFunctionInformationで関数の情報を得ることができる.
| Out[18]= |  |