-
関数
- BoxMatrix
- CUDAArgMaxList
- CUDAArgMinList
- CUDABoxFilter
- CUDAClamp
- CUDAClosing
- CUDAColorNegate
- CUDADilation
- CUDADot
- CUDAErosion
- CUDAFluidDynamics
- CUDAFold
- CUDAFoldList
- CUDAFourier
- CUDAImageAdd
- CUDAImageConvolve
- CUDAImageDivide
- CUDAImageMultiply
- CUDAImageSubtract
- CUDAInverseFourier
- CUDAMap
- CUDAOpening
- CUDASort
- CUDATotal
- CUDATranspose
- CUDAVolumetricRender
- 関連するガイド
- テクニカルノート
-
-
関数
- BoxMatrix
- CUDAArgMaxList
- CUDAArgMinList
- CUDABoxFilter
- CUDAClamp
- CUDAClosing
- CUDAColorNegate
- CUDADilation
- CUDADot
- CUDAErosion
- CUDAFluidDynamics
- CUDAFold
- CUDAFoldList
- CUDAFourier
- CUDAImageAdd
- CUDAImageConvolve
- CUDAImageDivide
- CUDAImageMultiply
- CUDAImageSubtract
- CUDAInverseFourier
- CUDAMap
- CUDAOpening
- CUDASort
- CUDATotal
- CUDATranspose
- CUDAVolumetricRender
- 関連するガイド
- テクニカルノート
-
関数
CUDAの関数
CUDALink はWolfram言語の組込みパッケージで,Wolfram言語の合理的なワークフローの中でCUDAを使うための簡単かつ強力なインターフェースを提供する.
CUDALink は線形代数,離散フーリエ(Fourier)変換,画像処理のための注意深くチューニングされたアルゴリズムを提供する.独自の CUDALink モジュールを少ない労力で書くこともできる.Wolfram言語内から CUDALink を使うことで,可視化,インポート・エキスポート,プログラミング機能を含むWolfram言語の機能を利用することができるようになる.
このセクションでは,組込み CUDALink 関数について述べる.また,いくつかの適用例も取り上げる.
リストの処理
CUDALink のリスト処理関数は既存のWolfram言語関数に似せて設計されている.Wolfram言語の実装ほどは一般的でないが,最もよく使われる関数が提供される.CUDALink には以下のリスト処理関数が実装されている.
| CUDAMap | 入力リストの各要素に関数をマップする |
| CUDAFold | 与えられた初期値 |
| CUDAFoldList | 与えられた初期値 |
| CUDASort | 指定のリストをソートする |
| CUDATotal | 指定のリストの合計値を求める |
上記関数はWolfram言語のあらゆる関数と同様に使用できる.関数を使うには,まず CUDALink アプリケーションをロードする.
Needs["CUDALink`"]ロードされたら,上記関数が使える.次の例はランダムリストに関数Cosをマップする.
CUDAMap[Cos, RandomReal[1, 10]]計算は繋ぎ合わせることができる.ここでは上記リストの合計をCUDAFold(GPUプログラミング分野ではリダクションと呼ばれる)を使って求める.
CUDAFold[Plus, 0.0, %]適用例
多くの場合,上記リスト演算は多くのアルゴリズムにおいて重要なものである.以下でそれを述べる.
見通し線
高さのマップが与えられたとき,見通し線問題はある一点から見えるすべての点を高さマップから求める.これにはまず高さマップを角度マップに変換し,角度マップに対してMaxでたたむ.maxAngleリストの結果を使うと,点が見えるかどうかが簡単に判断できる.
heightMap = GaussianFilter[RandomReal[10, 20], 3]角度マップを計算する.高さマップの最初の点を参照角度として使う.
arcTanMap = MapIndexed[ArcTan[(# - First@heightMap) / First[#2]]&, heightMap]CUDAFoldListを使ってmaxAngleリストが計算される.
maxAngle = CUDAFoldList[Max, First@arcTanMap, arcTanMap]angularMapi>maxAngleiの場合に角度をvisibleとする.
visable = MapThread[If[#1 ≥ #2, #3, 0]&, {arcTanMap, maxAngle, heightMap}]ListPlot[{heightMap, visable}]ランダムウォーク
ランダムウォークは物理学におけるブラウン(Brownian)運動等多くの分野で一般的に使われるツールである.次の例ではCUDAFoldListを使って一次元のランダムウォークを示す.
ListLinePlot[Thread[List[CUDAFoldList[Plus, 0, RandomReal[{-1, 1}, 500]], CUDAFoldList[Plus, 0, RandomReal[{-1, 1}, 500]]]]]ListLinePlot[Thread[List[CUDAFoldList[Plus, 0, RandomChoice[{1, -1, 0, 0}, 250]], CUDAFoldList[Plus, 0, RandomChoice[{0, 0, 1, -1}, 250]]]]]ヒストグラム
ヒストグラムは要素をビンに分けるときに多くの分野で一般的に使われる.次の例ではCUDASortを使ってヒストグラム計算を簡単化する.入力画像をソートする.
sortedData = CUDASort[Flatten[ImageData[[image], "Byte"]]];ソートされたら,与えられた発生回数を数える値について,値が変化するまでソートされたリストを順に見ていく必要がある.最初の要素を求めるには,要素が最初のものと等しくなくなるまで要素数を数えなければならい.
count = Compile[{{sorted, _Integer, 1}}, Module[{res = ConstantArray[0, 256], count = 0, p = 255}, Do[If[v == p, count++, res[[p + 1]] = count;count = 1;p = v], {v, sorted}];
res[[p + 1]] = count;
res]];
hist = count[sortedData]この結果のヒストグラムをListLinePlotを使ってプロットする.
ListLinePlot[hist, InterpolationOrder -> 0, PlotRange -> All]ドット積
CUDAFold[Plus, 0, Flatten@CUDAImageMultiply[{RandomReal[1, 100]}, {RandomReal[1, 100]}]]画像処理
CUDALink 画像処理モジュールは3つのカテゴリに分類できる.1つ目はCUDAに最適化されたたたみ込み,2つ目は,収縮,膨張,オープニング,クロージング等を含むモーフォロジー演算,そして3つ目は二項演算子,つまり画像の乗算,除算,減算,加算演算子である.すべての演算は画像とリストの両方に使える.
| CUDAImageConvolve | カーネルを指定のカーネルとたたみ込む |
| CUDABoxFilter | カーネルをBoxMatrixカーネルとたたみ込む |
| CUDAErosion | モーフォロジー収縮を行う |
| CUDADilation | モーフォロジー膨張を行う |
| CUDAOpening | モーフォロジーオープニングを行う |
| CUDAClosing | モーフォロジークロージングを行う |
| CUDAClamp | 範囲間の値を範囲内に収める |
| CUDAColorNegate | 入力の値を反転する |
| CUDAImageAdd | 2つの入力を加算する |
| CUDAImageSubtract | 2つの入力を減算する |
| CUDAImageMultiply | 2つの入力を乗算する |
| CUDAImageDivide | 2つの入力を除算する |
これらの関数を使うには,(また行っていない場合は)CUDALink アプリケーションをロードする.
Needs["CUDALink`"]CUDALink の画像処理関数は,Wolfram言語の画像処理関数と同様に入力として画像を取る.次の例では入力画像の勾配を求める.
CUDAImageConvolve[[image], {{1, 1, 1}, {0, 0, 0}, {-1, -1, -1}}]CUDA画像処理関数はWolfram言語関数と同様に動作するので,既存のWolfram言語関数と組み合せることができる.次の例では画像の集合の全組合せにCUDAImageMultiplyを適用する.
GraphicsGrid@Partition[Apply[CUDAImageMultiply, #]& /@ Tuples[{[image], [image], [image]}, 2], 3]CUDA画像処理関数はManipulate,Dynamic,Animate等のWolfram言語の動的評価と一緒に使うことができる.次の例ではAnimateを使い,異なるGaussianMatrix半径サイズと畳み込んだときに画像がどのようになるかを示すアニメーションを作る.
Animate[CUDAImageConvolve[[image], GaussianMatrix[r]], {r, 0, 20, 1}, AnimationRate -> 0 AnimationRunning -> True]適用例
新しい画像処理演算子を作る
CUDALink の画像処理演算子はより複雑な演算子の構成要素である.次の例では,Wolfram言語のDarker演算子に似たCUDADarker演算子を定義する.
CUDADarker[img_, frac_ /; frac < 1.0] := With[{num = Numerator[Rationalize[Round[frac, 0.1]]], denom = Denominator[Rationalize[Round[frac, 0.1]]]},
CUDAImageMultiply[CUDAImageDivide[img, denom], num]]CUDADarker[[image], 0.2]入力の平滑化
処理を行う前に入力を平滑化することが多くのアルゴリズムにおいて求められる.次の例はランダムな入力リストを定義する.
res = RandomReal[1, 5000];ListLinePlot[res]ListLinePlot[First@CUDAImageConvolve[{res}, {GaussianMatrix[{{10}, 10}]}], PlotRange -> All]地理データ処理
画像処理関数はすべてリスト処理関数でもあるので,Wolfram言語のリストで表されるデータはどれでも処理することができる.次の例ではCUDAClampを使って標高地マップの値の範囲を制限して地理的標高データを処理する.
gisData = Import[ "http://exampledata.wolfram.com/sdtsdem.tar.gz", "Data" ];範囲を制限するパラメータを変化させることができるインターフェースを作る.
Manipulate[ReliefPlot[CUDAClamp[gisData, low, high], ColorFunction -> "GreenBrownTerrain"], {low, Min[gisData], Max[gisData] / 2}, {high, Max[gisData] / 2, Max[gisData]}]取得した画像の処理
以下の例ではWebカメラが必要である.CurrentImageはカメラが検出されないとエラーを返す.
CurrentImage[]Webカメラからリアルタイムで入力画像を処理することができるインターフェースを作成する.
Manipulate[fun[CurrentImage[], r], {fun, {CUDAErosion, CUDADilation, CUDAOpening, CUDAClosing}}, {r, 1, 10, 1}]線形代数とフーリエ変換
| CUDADot | ベクトルと行列の積を与える |
| CUDATranspose | 入力行列を転置する |
| CUDAArgMaxList | 最大絶対要素の指標を与える |
| CUDAArgMinList | 最小絶対要素の指標を与える |
| CUDAFourier | フーリエ返還を求める |
| CUDAInverseFourier | 逆フーリエ変換を求める |
CUDALink アプリケーションをまだロードしていない場合はロードする.
Needs["CUDALink`"]CUDADot[RandomInteger[1, {5, 5}], RandomInteger[1, {5, 5}]]MatrixFormで結果を示す.
MatrixForm[%]適用例
線形代数とフーリエ解析はこのチュートリアルの範囲を超えて多くの分野で使える.ここではこれらの CUDALink 機能で可能となる操作を使った2つの簡単な例を示す.
スペクトル
data = Table[Mod[Binomial[i, j], 2], {i, 0, 63}, {j, 0, 63}];ArrayPlot[Log[Abs[CUDAFourier[data]]]]画像の変換
ColorCombine[CUDATranspose /@ ColorSeparate[[image]]]例
CUDALink にはこれらの便利な関数とともに,CUDALink を使ったプログラミングの機能が分かる多くの例が含まれている.これらの例のソースはWolframシステムに含まれている.
| CUDAFluidDynamics | 流体力学シミュレーションを計算して描画する |
| CUDAVolumetricRender | 体積データを描画する |
流体力学
Navier–Stokes方程式のトーラス上の解を近似する.
CUDAFluidDynamics[]体積の描画
data = CUDAVolumetricDataRead[FileNameJoin[{$CUDALinkExampleDataPath, "Bucky.raw"}], 32, 32];CUDAVolumetricRender[data, "Width" -> 400, "Height" -> 400]関連するガイド
関連するテクニカルノート
-
▪
- CUDALink ユーザガイド ▪
- はじめに ▪
- CUDALink の設定 ▪
- CUDAプログラミング ▪
- メモリ ▪
- 適用例 ▪
- 複数のデバイスにおける CUDALink ▪
- リファレンス