CUDAの関数
CUDALink は Mathematica の組込みパッケージで,Mathematica の合理的なワークフローの中でCUDAを使うための簡単かつ強力なインターフェースを提供する.
CUDALink は線形代数,離散フーリエ(Fourier)変換,画像処理のための注意深くチューニングされたアルゴリズムを提供する.独自の CUDALink モジュールを少ない労力で書くこともできる.Mathematica 内から CUDALink を使うことで,可視化,インポート・エキスポート,プログラミング機能を含む Mathematica の機能を利用することができるようになる.
このセクションでは,組込み CUDALink 関数について述べる.また,いくつかの適用例も取り上げる.
リストの処理
CUDALink のリスト処理関数は既存の Mathematica 関数に似せて設計されている.Mathematica の実装ほどは一般的でないが,最もよく使われる関数が提供される.CUDALink には以下のリスト処理関数が実装されている.
CUDALink のリスト処理関数
上記関数は Mathematica のあらゆる関数と同様に使用できる.関数を使うには,まず CUDALink アプリケーションをロードする.
ロードされたら,上記関数が使える.次の例はランダムリストに関数Cosをマップする.
| Out[2]= |  |
計算は繋ぎ合わせることができる.ここでは上記リストの合計をCUDAFold(GPUプログラミング分野ではリダクションと呼ばれる)を使って求める.
| Out[3]= |  |
適用例
多くの場合,上記リスト演算は多くのアルゴリズムにおいて重要なものである.以下でそれを述べる.
見通し線
高さのマップが与えられたとき,見通し線問題はある一点から見えるすべての点を高さマップから求める.これにはまず高さマップを角度マップに変換し,角度マップに対してMaxでたたむ.
リストの結果を使うと,点が見えるかどうかが簡単に判断できる.
サンプルの高さマップを生成する.
| Out[4]= |  |
角度マップを計算する.高さマップの最初の点を参照角度として使う.
| Out[5]= |  |
CUDAFoldListを使って
リストが計算される.
| Out[6]= |  |
の場合に角度をvisibleとする.
| Out[7]= |  |
参照点から見えるすべての点を表示する.
| Out[8]= |  |
ランダムウォーク
ランダムウォークは物理学におけるブラウン(Brownian)運動等多くの分野で一般的に使われるツールである.次の例ではCUDAFoldListを使って一次元のランダムウォークを示す.
| Out[9]= |  |
離散乱数を選ぶと,ウォークは格子上で行われる.
| Out[10]= |  |
ヒストグラム
ヒストグラムは要素をビンに分けるときに多くの分野で一般的に使われる.次の例ではCUDASortを使ってヒストグラム計算を簡単化する.入力画像をソートする.
ソートされたら,与えられた発生回数を数える値について,値が変化するまでソートされたリストを順に見ていく必要がある.最初の要素を求めるには,要素が最初のものと等しくなくなるまで要素数を数えなければならい.
| Out[13]= |  |
この結果のヒストグラムをListLinePlotを使ってプロットする.
| Out[14]= |  |
ドット積
2つのベクトルのドット積を求める.
| Out[15]= |  |
画像処理
CUDALink 画像処理モジュールは3つのカテゴリに分類できる.1つ目はCUDAに最適化されたたたみ込み,2つ目は,収縮,膨張,オープニング,クロージング等を含むモーフォロジー演算,そして3つ目は二項演算子,つまり画像の乗算,除算,減算,加算演算子である.すべての演算は画像とリストの両方に使える.
CUDALink の画像ベース演算
これらの関数を使うには,(また行っていない場合は)CUDALink アプリケーションをロードする.
CUDALink の画像処理関数は,Mathematica の画像処理関数と同様に入力として画像を取る.次の例では入力画像の勾配を求める.
| Out[2]= |  |
CUDA画像処理関数は Mathematica 関数と同様に動作するので,既存の Mathematica 関数と組み合せることができる.次の例では画像の集合の全組合せにCUDAImageMultiplyを適用する.
| Out[3]= |  |
CUDA画像処理関数はManipulate,Dynamic,Animate等の Mathematica の動的評価と一緒に使うことができる.次の例ではAnimateを使い,異なるGaussianMatrix半径サイズと畳み込んだときに画像がどのようになるかを示すアニメーションを作る.
| Out[4]= |  |
適用例
新しい画像処理演算子を作る
CUDALink の画像処理演算子はより複雑な演算子の構成要素である.次の例では,Mathematica のDarker演算子に似た
演算子を定義する.
これでこの関数が使える.
| Out[6]= |  |
入力の平滑化
処理を行う前に入力を平滑化することが多くのアルゴリズムにおいて求められる.次の例はランダムな入力リストを定義する.
結果をプロットすると,入力は非常に雑音が多いことが分かる.
| Out[8]= |  |
画像処理関数は入力リストを平滑化するのにも使える.
| Out[9]= |  |
地理データ処理
画像処理関数はすべてリスト処理関数でもあるので,Mathematica のリストで表されるデータはどれでも処理することができる.次の例ではCUDAClampを使って標高地マップの値の範囲を制限して地理的標高データを処理する.
Wolframサーバからデータをロードする.
範囲を制限するパラメータを変化させることができるインターフェースを作る.
| Out[11]= |  |
取得した画像の処理
以下の例ではWebカメラが必要である.CurrentImageはカメラが検出されないとエラーを返す.
| Out[12]= |  |
Webカメラからリアルタイムで入力画像を処理することができるインターフェースを作成する.
| Out[13]= |  |
線形代数とフーリエ変換
CUDAを使った線形代数とフーリエ変換の操作
CUDALink アプリケーションをまだロードしていない場合はロードする.
2つの整数行列を掛け合せる.
| Out[2]= |  |
MatrixFormで結果を示す.
Out[3]//MatrixForm= |
| |  |
適用例
線形代数とフーリエ解析はこのチュートリアルの範囲を超えて多くの分野で使える.ここではこれらの CUDALink 機能で可能となる操作を使った2つの簡単な例を示す.
スペクトル
二次元データ集合をロードする.
対数のパワースペクトルを求める.
| Out[5]= |  |
画像の変換
入力画像を転置する.
| Out[6]= |  |
例
CUDALink にはこれらの便利な関数とともに,CUDALink を使ったプログラミングの機能が分かる多くの例が含まれている.これらの例のソースは Mathematica に含まれている.
CUDALink の応用例
流体力学
Navier-Stokes方程式のトーラス上の解を近似する.
| Out[7]= |  |
体積の描画
データ集合を読み取る.
ボクセルをレイトレーシングすることでデータを描画する.
| Out[9]= |  |