CUDAの関数

CUDALink はWolfram言語の組込みパッケージで,Wolfram言語の合理的なワークフローの中でCUDAを使うための簡単かつ強力なインターフェースを提供する.

CUDALink は線形代数,離散フーリエ(Fourier)変換,画像処理のための注意深くチューニングされたアルゴリズムを提供する.独自の CUDALink モジュールを少ない労力で書くこともできる.Wolfram言語内から CUDALink を使うことで,可視化,インポート・エキスポート,プログラミング機能を含むWolfram言語の機能を利用することができるようになる.

このセクションでは,組込み CUDALink 関数について述べる.また,いくつかの適用例も取り上げる.

リストの処理

CUDALink のリスト処理関数は既存のWolfram言語関数に似せて設計されている.Wolfram言語の実装ほどは一般的でないが,最もよく使われる関数が提供される.CUDALink には以下のリスト処理関数が実装されている.

CUDAMap入力リストの各要素に関数をマップする
CUDAFold与えられた初期値と関数 についてを返す
CUDAFoldList与えられた初期値と関数 についてを返す
CUDASort指定のリストをソートする
CUDATotal指定のリストの合計値を求める

CUDALink のリスト処理関数

上記関数はWolfram言語のあらゆる関数と同様に使用できる.関数を使うには,まず CUDALink アプリケーションをロードする.

ロードされたら,上記関数が使える.次の例はランダムリストに関数Cosをマップする.

計算は繋ぎ合わせることができる.ここでは上記リストの合計をCUDAFold(GPUプログラミング分野ではリダクションと呼ばれる)を使って求める.

適用例

多くの場合,上記リスト演算は多くのアルゴリズムにおいて重要なものである.以下でそれを述べる.

見通し線

高さのマップが与えられたとき,見通し線問題はある一点から見えるすべての点を高さマップから求める.これにはまず高さマップを角度マップに変換し,角度マップに対してMaxでたたむ.maxAngleリストの結果を使うと,点が見えるかどうかが簡単に判断できる.

サンプルの高さマップを生成する.

角度マップを計算する.高さマップの最初の点を参照角度として使う.

CUDAFoldListを使ってmaxAngleリストが計算される.

angularMapi>maxAngleiの場合に角度をvisibleとする.

参照点から見えるすべての点を表示する.

ランダムウォーク

ランダムウォークは物理学におけるブラウン(Brownian)運動等多くの分野で一般的に使われるツールである.次の例ではCUDAFoldListを使って一次元のランダムウォークを示す.

離散乱数を選ぶと,ウォークは格子上で行われる.

ヒストグラム

ヒストグラムは要素をビンに分けるときに多くの分野で一般的に使われる.次の例ではCUDASortを使ってヒストグラム計算を簡単化する.入力画像をソートする.

ソートされたら,与えられた発生回数を数える値について,値が変化するまでソートされたリストを順に見ていく必要がある.最初の要素を求めるには,要素が最初のものと等しくなくなるまで要素数を数えなければならい.

この結果のヒストグラムをListLinePlotを使ってプロットする.

ドット積

2つのベクトルのドット積を求める.

画像処理

CUDALink 画像処理モジュールは3つのカテゴリに分類できる.1つ目はCUDAに最適化されたたたみ込み,2つ目は,収縮,膨張,オープニング,クロージング等を含むモーフォロジー演算,そして3つ目は二項演算子,つまり画像の乗算,除算,減算,加算演算子である.すべての演算は画像とリストの両方に使える.

CUDAImageConvolveカーネルを指定のカーネルとたたみ込む
CUDABoxFilterカーネルをBoxMatrixカーネルとたたみ込む
CUDAErosionモーフォロジー収縮を行う
CUDADilationモーフォロジー膨張を行う
CUDAOpeningモーフォロジーオープニングを行う
CUDAClosingモーフォロジークロージングを行う
CUDAClamp範囲間の値を範囲内に収める
CUDAColorNegate入力の値を反転する
CUDAImageAdd2つの入力を加算する
CUDAImageSubtract2つの入力を減算する
CUDAImageMultiply2つの入力を乗算する
CUDAImageDivide2つの入力を除算する

CUDALink の画像ベース演算

これらの関数を使うには,(また行っていない場合は)CUDALink アプリケーションをロードする.

CUDALink の画像処理関数は,Wolfram言語の画像処理関数と同様に入力として画像を取る.次の例では入力画像の勾配を求める.

CUDA画像処理関数はWolfram言語関数と同様に動作するので,既存のWolfram言語関数と組み合せることができる.次の例では画像の集合の全組合せにCUDAImageMultiplyを適用する.

CUDA画像処理関数はManipulateDynamicAnimate等のWolfram言語の動的評価と一緒に使うことができる.次の例ではAnimateを使い,異なるGaussianMatrix半径サイズと畳み込んだときに画像がどのようになるかを示すアニメーションを作る.

適用例

新しい画像処理演算子を作る

CUDALink の画像処理演算子はより複雑な演算子の構成要素である.次の例では,Wolfram言語のDarker演算子に似たCUDADarker演算子を定義する.

これでこの関数が使える.

入力の平滑化

処理を行う前に入力を平滑化することが多くのアルゴリズムにおいて求められる.次の例はランダムな入力リストを定義する.

結果をプロットすると,入力は非常に雑音が多いことが分かる.

画像処理関数は入力リストを平滑化するのにも使える.

地理データ処理

画像処理関数はすべてリスト処理関数でもあるので,Wolfram言語のリストで表されるデータはどれでも処理することができる.次の例ではCUDAClampを使って標高地マップの値の範囲を制限して地理的標高データを処理する.

Wolframサーバからデータをロードする.

範囲を制限するパラメータを変化させることができるインターフェースを作る.

取得した画像の処理

以下の例ではWebカメラが必要である.CurrentImageはカメラが検出されないとエラーを返す.

Webカメラからリアルタイムで入力画像を処理することができるインターフェースを作成する.

線形代数とフーリエ変換

CUDADotベクトルと行列の積を与える
CUDATranspose入力行列を転置する
CUDAArgMaxList最大絶対要素の指標を与える
CUDAArgMinList最小絶対要素の指標を与える
CUDAFourierフーリエ返還を求める
CUDAInverseFourier逆フーリエ変換を求める

CUDAを使った線形代数とフーリエ変換の操作

CUDALink アプリケーションをまだロードしていない場合はロードする.

2つの整数行列を掛け合せる.

MatrixFormで結果を示す.

適用例

線形代数とフーリエ解析はこのチュートリアルの範囲を超えて多くの分野で使える.ここではこれらの CUDALink 機能で可能となる操作を使った2つの簡単な例を示す.

スペクトル

二次元データ集合をロードする.

対数のパワースペクトルを求める.

画像の変換

入力画像を転置する.

CUDALink にはこれらの便利な関数とともに,CUDALink を使ったプログラミングの機能が分かる多くの例が含まれている.これらの例のソースはWolframシステムに含まれている.

CUDAFluidDynamics流体力学シミュレーションを計算して描画する
CUDAVolumetricRender体積データを描画する

CUDALink の応用例

流体力学

NavierStokes方程式のトーラス上の解を近似する.

体積の描画

This reads in the dataset.

ボクセルをレイトレーシングすることでデータを描画する.