Mathematica 9 is now available
THIS IS DOCUMENTATION FOR AN OBSOLETE PRODUCT.
SEE THE DOCUMENTATION CENTER FOR THE LATEST INFORMATION.
CUDALink >

CUDAFunctionLoad


scr からCUDAFunctionをロードし,funMathematica で使えるようにする.

srcfile からCUDAFunctionをロードし,funMathematica で使えるようにする.

libfile からCUDAFunctionをロードし,funMathematica で使えるようにする.
  • CUDALink パッケージがNeedsでロードされていなければならない.
  • 使用可能な引数と戻り型,対応するCUDA言語の型:
_IntegermintMathematica 整数
"Integer32"int32ビット整数
_RealReal_tGPU実数型
"Double"double機械倍精度数
"Float"float機械浮動小数点数
{base, rank, io}CUDAMemory指定の基底型,階数,入出力オプションのメモリ
"Local" | "Shared"mint局所または共有のメモリパラメータ
{"Local" | "Shared", type}mint局所または共有のメモリパラメータ
  • 有効なioである.
  • が渡されると,デフォルトでが使われる.が渡されるとが使われる.
  • 階数はまたはを使うことで省略できる.
  • 私用できる基底型:
_Integer_Real_Complex
"Byte""Bit16""Integer"
"Byte[2]""Bit16[2]""Integer32[2]"
"Byte[3]""Bit16[3]""Integer32[3]"
"Byte[4]""Bit16[4]""Integer32[4]"
"UnsignedByte""UnsignedBit16""Float"
"UnsignedByte[2]""UnsignedBit16[2]""Float[2]"
"UnsignedByte[3]""UnsignedBit16[3]""Float[3]"
"UnsignedByte[4]""UnsignedBit16[4]""Float[4]"
"Double""Double[2]""Double[3]"
"Double[4]"
  • は別の引数で複数回呼び出すこともできる.
  • でロードされた関数は Mathematica カーネルと同じプロセスで実行される.
  • でロードされた関数 Mathematica カーネルが終了するときにアンロードされる.
  • ブロック次元には,1ブロックにつきいくつのスレッドを開始するかを表すリストまたは整数が使える.
  • libfileがダイナミックライブラリなら,ダイナミックライブラリ関数 fun がロードされる.
  • libfileにはCUDA PTX,CUDA CUBIN,ライブラリファイルが使える.
  • ブロック次元の最大サイズはCUDAInformation特性で返される.
  • 開始するときに,(CUDAFunctionへの追加の引数として)スレッド数が指定されてなければ,階数と次元が最も大きい要素の次元が選ばれる.画像については階数は2に設定される.
  • 開始するときに,スレッド数がブロック時限の倍数でなければ,ブロック次元の倍数に切り上げられる.
  • 以下のオプションが与えられる:
"CleanIntermediate"Automatic一時ファイルを削除するかどうか
"CompileOptions"{}NVCCコンパイラに直接渡すオプション
"CompilerInstallation"AutomaticCUDAツールキットがインストールされている場所
"CreateCUBIN"TrueコードをCUDAバイナリにコンパイルするかどうか
"CreatePTX"FalseコードをCUDAバイトコードにコンパイルするかどうか
"CUDAArchitecture"AutomaticCUDAコードをコンパイルする目的アーキテクチャ
"Defines"{}NVCCプリプロセッサに渡された定義
"Device"$CUDADevice計算で使用するCUDAデバイス
"IncludeDirectories"{}コンパイルに含むディレクトリ
"ShellCommandFunction"Noneコンパイルで使用するシェルコマンドで呼び出す関数
"ShellOutputFunction"Noneコンパイルコマンドの実行によるシェル出力で呼び出す関数
"SystemDefines"AutomaticNVCCプリプロセッサに渡されたシステム定義
"TargetDirectory"AutomaticCUDAファイルが生成されるディレクトリ
"TargetPrecision"Automatic計算に使用する精度
"WorkingDirectory"Automatic一時ファイルが生成されるディレクトリ
"XCompilerInstallation"AutomaticCコンパイラがインストールされていることをNVCCが探すディレクトリ
まず CUDALink アプリケーションをロードする:
与えられた2つのベクトルを足す:
上で定義したCUDAコードをコンパイルして実行する:
出力リストの長さを定義する:
入出力ベクトルを定義する.これらは Mathematica の通常のリストで,CUDAカーネルコードのシグネチャで定義した型と同じである:
指定の入力で関数を実行する:
結果の最初の20個の値を表示する:
CUDAファイルがを渡すことができる.CUDA関数ファイルへのパスを表示する:
ファイル名はリストに収められる:
入力パラメータを定義する:
関数を呼び出す:
CUDAFunctionを呼び出すときは追加の引数を与えることができる.引数は開始するスレッド数(またはグリッド次元とブロック次元の積)を表す.CUDA実装を含むソースファイルを取得する:
ファイルからCUDA関数をロードする:
32スレッドの関数を呼び出す.ベクトルの最初の32個の値の加算が計算される:
CUDAバイナリを渡すことができる.NVCCCompilerを使ってCUDA関数をコンパイルしてバイナリにする.名前修飾を避けたい場合はTrueに設定しなければならない:
浮動小数点精度のサポートのために,ハードウェアとに基づいてが定義されている:
オプションを与えないと,はデバイスで使用できる最高の浮動小数点精度を使用する.この場合は倍精度である:
マクロがどのように定義されるかに注目されたい.検出を避けるためにまたはオプションが渡せる.これは上のものと同じである:
単精度の利用を強制するためには値を渡す:
目的精度に基づいて型が検出される.指定の型の使用を強制するために,型としてまたはを渡す:
CUDALink ライブラリがロードできる.CUDAライブラリの例へのパスを取得する:
コンパイル済みライブラリの開く調子はオペレーティングシステムに依存するので,ファイルが存在することを確認する:
を使ってライブラリをロードする:
入力リストに2を加える:
この例の2つ目のコードのソースは CUDALink に含まれている:
を使ってコンパイルの失敗についての情報を得ることができる.ソースコードにシンタックスエラーがある:
関数をロードする:
Printと設定すると,ビルドログが与えられる:
この場合,変数のスペルが間違っていた.
まず CUDALink アプリケーションをロードする:
In[1]:=
Click for copyable input
与えられた2つのベクトルを足す:
In[2]:=
Click for copyable input
上で定義したCUDAコードをコンパイルして実行する:
In[3]:=
Click for copyable input
Out[3]=
出力リストの長さを定義する:
In[4]:=
Click for copyable input
入出力ベクトルを定義する.これらは Mathematica の通常のリストで,CUDAカーネルコードのシグネチャで定義した型と同じである:
In[5]:=
Click for copyable input
指定の入力で関数を実行する:
In[6]:=
Click for copyable input
結果の最初の20個の値を表示する:
In[7]:=
Click for copyable input
Out[7]=
 
CUDAファイルがを渡すことができる.CUDA関数ファイルへのパスを表示する:
In[1]:=
Click for copyable input
Out[1]=
ファイル名はリストに収められる:
In[2]:=
Click for copyable input
Out[2]=
入力パラメータを定義する:
In[3]:=
Click for copyable input
Out[3]=
関数を呼び出す:
In[4]:=
Click for copyable input
Out[4]=
 
CUDAFunctionを呼び出すときは追加の引数を与えることができる.引数は開始するスレッド数(またはグリッド次元とブロック次元の積)を表す.CUDA実装を含むソースファイルを取得する:
In[1]:=
Click for copyable input
Out[1]=
ファイルからCUDA関数をロードする:
In[2]:=
Click for copyable input
Out[2]=
32スレッドの関数を呼び出す.ベクトルの最初の32個の値の加算が計算される:
In[3]:=
Click for copyable input
Out[3]=
 
CUDAバイナリを渡すことができる.NVCCCompilerを使ってCUDA関数をコンパイルしてバイナリにする.名前修飾を避けたい場合はTrueに設定しなければならない:
In[1]:=
Click for copyable input
Out[1]=
In[2]:=
Click for copyable input
Out[2]=
 
浮動小数点精度のサポートのために,ハードウェアとに基づいてが定義されている:
In[1]:=
Click for copyable input
オプションを与えないと,はデバイスで使用できる最高の浮動小数点精度を使用する.この場合は倍精度である:
In[2]:=
Click for copyable input
Out[2]=
マクロがどのように定義されるかに注目されたい.検出を避けるためにまたはオプションが渡せる.これは上のものと同じである:
In[3]:=
Click for copyable input
Out[3]=
単精度の利用を強制するためには値を渡す:
In[4]:=
Click for copyable input
Out[4]=
目的精度に基づいて型が検出される.指定の型の使用を強制するために,型としてまたはを渡す:
In[5]:=
Click for copyable input
Out[5]=
 
CUDALink ライブラリがロードできる.CUDAライブラリの例へのパスを取得する:
In[1]:=
Click for copyable input
Out[1]=
コンパイル済みライブラリの開く調子はオペレーティングシステムに依存するので,ファイルが存在することを確認する:
In[2]:=
Click for copyable input
Out[2]=
を使ってライブラリをロードする:
In[3]:=
Click for copyable input
Out[3]=
入力リストに2を加える:
In[4]:=
Click for copyable input
Out[4]=
この例の2つ目のコードのソースは CUDALink に含まれている:
In[5]:=
Click for copyable input
Out[5]=
 
を使ってコンパイルの失敗についての情報を得ることができる.ソースコードにシンタックスエラーがある:
In[1]:=
Click for copyable input
関数をロードする:
Printと設定すると,ビルドログが与えられる:
この場合,変数のスペルが間違っていた.
はコードのCの部分を無視する.これによりバイナリとしてそれ自体でコンパイルできるが,CUDAFunctionとしてもロードできるコードを書くことが可能となる.CUDAソースファイル(Cが混在したもの)を Mathematica にロードする:
関数を呼び出す:
はランタイムにおける関数の共有(局所)メモリサイズを指定することができる.次のコードは共有メモリを使って勾配の計算のための大域メモリを保管する:
最後の引数が共有メモリのためのである入力引数を指定する.ブロックサイズは256に設定される:
グレースケールの画像の平坦化された長さを計算する:
関数を呼び出す.共有メモリサイズはに設定され,開始するスレッド数は画像の平坦化された長さに設定される:
共有メモリサイズを指定するよりよい方法は,型を使う方法である:
共有メモリ型を使うと,型のサイズを渡す必要がない:
テンプレート化された関数を呼び出すことができる.制約は,デバイス関数としてテンプレート化された関数のインスタンスを作成し,Falseに設定しなければならないということだけである.どのデバイス関数を呼び出すかを決めるディスパッチ関数を使って,テンプレート化された関数をコンパイルしてPTXバイトコードにする:
整数に対して関数をロードする:
関数を実行する.は入力型が整数であることを指定するものである:
テンプレート化された関数はマクロを使って同じものが作れる.次のソースコードは未定義マクロとしてを持つ:
マクロに設定する:
マクロに設定する:
上記の方法を使うと,名前修飾なしにテンプレート型と同じものを作ることができる.
三次元ブロックサイズもサポートされている.体積データを反転る:
関数をロードし,三次元ブロックのサイズを渡す:
ファイルからデータをロードする:
計算を行う:
結果を描画する:
パーリンノイズは擬似テクスチャを生成するのに使われる一般的なアルゴリズムである.次はノイズ関数の教科書どおりの実装である:
関数をロードする:
ノイズアルゴリズムで使われる置換表を生成する:
幅と高さを設定する.出力メモリも割り当てる:
パーリンノイズのパラメータを設定する:
パーリンノイズ関数を呼び出す.出力はCUDAMemoryハンドルである:
メモリがGPUから取り出され,画像として表示される:
結果にManipulateを使うと,パラメータを変化させて出力を見ることができる:
パーリンノイズで手続き型の地形を作成することができる.幅高さを定義し,地形のためのメモリを割り当てる:
地形を定義するのに使われるパラメータ:
データを取り出し,標高マップを平坦にするのに画像処理関数を適用する:
結果は山脈のようである:
メモリの割当てを解放する:
ノイズのパラメータを変化させると,異なるパターンになる.木のテクスチャを作る:
以下は木についての既知のパラメータである:
グレースケールに再び色を付けるヘルパー関数を定義する:
木のテクスチャを生成する:
前と同様に,結果の面をプロットする:
もとのソースコードはより多くのノイズ関数を定義している.関数をロードする:
Manipulateを使って別のノイズ関数を示す:
割り当てたメモリを解放する:
ヒストグラムアルゴリズムは値によって要素を別々のビンのリストに分ける.次の例は0から255までの値を別々のビンに分けるヒストグラムを実装する:
2つのCUDAカーネル関数をロードする:
サンプルデータを取得する.この場合は画像が選ばれ,ImageDataを平坦化する:
アルゴリズムには中間ヒストグラムに使われる一時データが必要である:
部分ヒストグラムを計算し,それを前に生成した中間リストに置く:
一時ヒストグラムを結合する:
出力ヒストグラムを得る:
一時メモリをアンロードする.これを行わないと,メモリリークが起こる:
出力ヒストグラムをプロットする:
走査,つまりプレフィックス和はFoldListに似ており,さまざまな状況で使える非常に便利なプリミティブである.CUDAの実装は以下にある:
計算に使用する3つのカーネルをロードする:
ランダム入力データを生成する:
出力バッファを割り当てる:
ブロックとグリッドの次元を計算する:
一時バッファが計算に必要である:
走査を行う:
出力バッファを取り出す:
結果はFoldListのものと一致する:
CUDAMemory要素の割当てを解放する:
リダクションカーネルは指定のバイナリ操作によるリストのリダクションという意味で,MathematicaFoldに似ている.操作が計算で前の要素を維持するのに対し,リダクションはそれを削除する.
リダクションCUDAFunctionをロードする:
入出力バッファを設定する:
計算を行う:
各ブロックはリストの512要素のリダクションを行う.つまり,512要素より大きいリストのリダクションには複数回の呼出しが必要となる.次のリストは小さく,ループが必要ない.前のステップから出力メモリを取得し,のメモリをに割当て,を解放する:
新しい出力バッファを割り当てる:
2回目のリダクションを行う:
出力を取り出し,出力バッファをアンロードする:
結果は Mathematica のものと一致する:
次の例はRGB色空間からHSBへの色の変換を実装する.CUDAによる実装は以下のファイルにある:
ソースファイルからをロードする:
入力画像と入力パラメータを設定する:
出力のためのメモリを割り当てる:
画像をHSB色空間に変換する:
デフォルトでは,ImageはRGB色空間のデータを見る.結果は間違った出力となる:
適切な出力を得るためにColorSpaceを使う:
次のコードはシーザー暗号を実装する.シーザー暗号はテキストの各文字に3を足す簡単な暗号法である.以下がCUDAの実装である:
例に使うテキストをロードする.この場合はアメリカ独立宣言書がロードされる:
コード文字列から関数をロードする:
CUDA関数を呼出し,出力の最初の100を表示する:
移動平均を実装する:
マクロとして定義するCUDAFunctionをロードする:
入力パラメータを定義し,出力用のメモリを割り当てる:
CUDAFunctionを呼び出す:
出力メモリを取得する:
メモリをアンロードする:
ブラック-ショールズ方程式はよく金融の計算で使われる.CUDALink にはCUDAFinancialDerivativeがあり,これは金融オプションの計算ができる.これがどのように書かれているかを例示するために,簡単なバージョンを実装する:
CUDAFunctionをロードする.として解釈されるようにに設定する:
入力パラメータを割り当てる:
関数を呼び出す:
出力メモリを取得する:
割り当てられたメモリをアンロードする:
最大ブロック次元がCUDAInformationによって返される:
関数呼び出しにおけるエラーは CUDALink を不安定な状態にすることがある.これはユーザが任意のカーネルを書くことができるようにすることの副作用である.カーネルコード中の無限ループやバッファのオーバーフロー等は CUDALink とビデオドライバの両方を不安定な状態にすることがある.
これは極端な場合,ディスプレイドライバをクラッシュさせることがあるが,通常はCUDAコードのその後の評価で無効な結果が返されるだけである.
コンパイル済みカーネルの型は一致しなければならない.浮動小数点数として定義されたのカーネルは,に設定されているときに使うと不正な結果を返す.
Trueに設定されているときは,C++構文のエキスポートはサポートされていない.
コンウェイのライフゲームは周りの状態に基づいて進化するセルオートマトンである.CUDALink 関数をロードする:
初期化のためにランダムに初期化する必要があるが,極端に少ない初期状態にするとすべてのセルが死んでしまうので避けなければならない:
DynamicArrayPlotを使って関数を表示する:
DynamicImageを使って関数を表示する.少し速いことに注目されたい:
CUDAMemoryを使うと,描画速度を上げることができる:
次の関数はCUDAFunctionをロードし,BallBounceEffect関数を呼び出す:次の物理的シミュレーションでは,CUDAFunctionを使って計算を行い,残りを Mathematica に任せる方法を示す.
粒子を描き,効果を作成するために更新する:
関数を呼び出す:
ジュリア集合はマンデルブロ(Mandelbrot)集合を一般化したものである.CUDAカーネルを実装する:
幅と高さを設定する.集合は計算されるので,メモリを設定する必要はない.メモリ割当てのみが必要である:
CUDAFunctionをロードする.コンパイラがコードを最適化するのにループを解くようなことを行うマクロが使用される:
集合を計算し,ReliefImageを使ってそれを見る:
ManipulateReliefPlotを使って,ユーザがの値を調整することができるインターフェースを作る:
ReliefPlotImageに変えて可視化をより速くすることもできる:
マンデルブロ集合はで定義される.次のコードは はユーザ定義のパラメータ)という形式の集合を使って,カーネルファイルに独自のタイプをどのように定義するかを示す.カーネルは以下に定義されている:
変数を設定する:
出力集合のメモリはCUDAMemoryAllocateを使って割り当てる:
上記ファイルから関数をロードする:
指数 のときの集合を計算して表示する:
指数 が変化するときの集合を計算して表示する:
200フレームの集合を生成する:
各フレームをT多角形上のテクスチャとして描画する:
CUDALink の記号機能を使うと,Mathematica 式を使ってCUDAコードを書き,それをCUDAコードに変換することができる.次の例では,記号コードを使って簡単な1D離散Haarウェーブレット変換を実装する:
記号コードはSymbolicCToCCodeStringを使ってCUDAコードに変換できる:
コードはを使ってロードできる:
同じ入力データを作る:
としてCUDAFunctionを呼び出す:
結果のCUDAMemoryを取得する:
記号コード生成の面白いのは,シンタックスツリーを操作することができるという点である.この例では,関数引数をCPointerTypeからCPointerTypeに変更する:
再び結果からCUDAコードを生成する:
コード生成のもう一つの面白い点は,CUDA記号関数はOpenCl記号関数のミラーとなっている点である.したがって上記記号コードのCUDA記号関数を変更するだけでOpdnCLコードを生成することができる:
まず OpenCLLink をロードする:
OpenCLの1D離散Harrウェーブレット変換を実装する:
この変換ではSymbolicCUDAFunctionSymbolicOpenCLFunctionSymbolicCUDADeclareIndexBlockSymbolicOpenCLDeclareIndexBlockという2語だけの変更が行われた.
次のコードはマンデルブロ集合を計算する:
ルール30のセルオートマトンでは,隣の行は前のものに依存するため,列数が非常に大きくなるまではCUDAを使う利点はあまりない.それでも簡単なルール30のセルオートマトンをCUDA関数として書くことができる:
メモリバッファを作成する:
を128回適用する:
ArrayPlotを使って結果をプロットする:
CUDAFunctionが繰返し呼ばれる場合は,CファイルでCUDAFunctionを書き,それをライブラリとしてロードした方が効率的である可能性がある.セルオートマトンのライブラリファイルは以下にある:
CUDAのバージョンと,ハードウェアで倍精度がサポートされているかどうかに応じてファイルを変更する必要がある場合がある.ファイルが存在するかどうかを確認する:
でライブラリ関数をロードする:
ライブラリ関数は出力を保管するためのリスト,ステップ数,セルオートマトンのルールを取る.CUDAMemoryAllocateを使って幅,高さの出力メモリを割り当てる:
ライブラリ関数を呼出し,結果をと同じである)に保管する:
ArrayPlotを使ってデータをプロットする:
CUDAFunctionMathematica 関数のように振舞うので,これはManipulate等の他の関数と一緒に使える:
次の実装は3Dにおけるマンデルブロ集合に類似した三次元マンデルブロ(マンデルバルブ)を実装する.三次元数は複素指数の極をというように三次元空間座標に拡張する.加算は単純にベクトルの加算である.マンデルバルブパラメータ(幅,高さ,カメラ位置,光源位置)を指定する:
出力メモリを割り当てる:
実装をソースからロードする:
CUDAFunctionを実装する:
CUDAFunctionを実行する:
CUDAMemoryMathematica に取り込む:
結果を画像として表示する:
結果をManipulateに置くことができる:
ユーザがカメラ位置を調整できるインターフェースを作成する:
Ask a question about this page  |  Suggest an improvement  |  Leave a message for the team
フォーマット:   HTML  |  CDF