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

OpenCLFunctionLoad


ソースコード prog から fun をロードし,OpenCLFunctionを返して Mathematica で使えるようにする.

ソースファイル progfile から fun をロードし,OpenCLFunctionを返して Mathematica で使えるようにする.
  • OpenCLLink アプリケーションは,Needsを使ってロードしなければならない.
  • progfile がダイナミックライブラリである場合には,ダイナミックライブラリ関数 fun がロードされる.
  • 使用できる引数と戻り値の型,および対応するOpenCLの型:
_IntegermintMathematica 整数
"Integer32"int32ビット整数
"Integer64"long/long long64ビット整数
_RealReal_tGPUの実数型
"Double"double機械倍数
"Float"float機械浮動小数
{base, rank, io}CUDAMemory特定の基底型,階数,入出力オプションのメモリ
"Local" | "Shared"mintローカルメモリあるいは共有メモリのパラメータ
{"Local" | "Shared", type}mintローカルメモリあるいは共有メモリのパラメータ
  • 有効な io は,である.
  • が渡されると,がデフォルトで使用される.が渡されると,が使用される.
  • 階数は,あるいはを使って省略することができる.
  • 使用可能な基底型:
_Integer_Real_Complex
"Byte""Bit16""Integer32"
"Byte[2]""Bit16[2]""Integer32[2]"
"Byte[4]""Bit16[4]""Integer32[4]"
"Byte[8]""Bit16[8]""Integer32[8]"
"Byte[16]""Bit16[16]""Integer32[16]"
"UnsignedByte""UnsignedBit16""UnsignedInteger"
"UnsignedByte[2]""UnsignedBit16[2]""UnsignedInteger[2]"
"UnsignedByte[4]""UnsignedBit16[4]""UnsignedInteger[4]"
"UnsignedByte[8]""UnsignedBit16[8]""UnsignedInteger[8]"
"UnsignedByte[16]""UnsignedBit16[16]""UnsignedInteger[16]"
"Double""Float""Integer64"
"Double[2]""Float[2]""Integer64[2]"
"Double[4]""Float[4]""Integer64[4]"
"Double[8]""Float[8]""Integer64[8]"
"Double[16]""Float[16]""Integer64[16]"
  • は,異なる引数を使って2度以上呼び出すことができる.
  • でロードされた関数は,Mathematica カーネルと同じプロセスで実行される.
  • OpenCLFunctionLoadでロードされた関数は,Mathematica カーネルが終了する際にアンロードされる.
  • ブロック次元はリストあるいは整数でよく,起動するのに各ブロックに対していくつのスレッドが必要であるかを表す.
  • ブロック次元の最大サイズは,OpenCLInformation 特性によって返される.
  • 起動時に,スレッドの数が(OpenCLFunctionの追加の引数として)指定されていない場合には,最大の階数と次元を持つ要素の次元が選ばれる.画像については,階数は2に設定される.
  • 起動時に,スレッドの数がブロック次元の倍数ではない場合には,スレッド数はブロック次元の倍数になるようにインクリメントされる.
  • 使用できるオプション:
"CompileOptions"{}直接OpenCLコンパイラに渡されるコンパイルオプション
"Defines"AutomaticOpenCLプリプロセッサに渡される定義
"Device"$OpenCLDevice計算に使用されるOpenCLデバイス
"IncludeDirectories"{}コンパイルに含むディレクトリ
"Platform"$OpenCLPlatformコンパイルに使用するOpenCLプラットフォーム
"ShellCommandFunction"Noneコンパイルに使用するシェルコマンドで呼び出す関数
"ShellOutputFunction"Noneコンパイルコマンドを実行したシェル出力で呼び出す関数
"TargetPrecision"Automatic計算に使用する精度
"WorkingDirectory"Automatic一時的なファイルが生成されるディレクトリ
まず OpenCLLink アプリケーションをロードする:
ロードするOpenCLソースコードを定義する:
OpenCL関数をロードする:
入力パラメータを定義する:
引数を持つ関数を呼び出す:
ArrayPlotを使って結果をプロットする:
ディレクトリからOpenCLソースファイルを得る:
ファイルからOpenCL関数をロードする:
関数を呼び出す:
DLLを OpenCLLink にロードしてOpenCLFunctionとして使うことができる:
予めコンパイルされたライブラリの拡張子はオペレーティングシステムに依存するので,ファイルが存在することを確かめる:
を使ってライブラリをロードする:
関数は2つを入力リストに加える:
この例のソースコードは OpenCLLink に付いてくる:
OpenCLFunctionを呼び出す際に追加の引数を与えることができる.引数は,起動するスレッドの数(あるいは大域的な作業グループサイズ)を示す.上の例を使う:
ファイルからOpenCL関数をロードする:
32のスレッドで関数を呼び出す.これにより,vectorAddの最初の32個の値のみが計算される:
コードに構文エラーがあると,"compilation failed(コンパイルの失敗)"というエラーが返される:
オプションを使ってビルドログを表示することができる:
上のエラーは,コード中にタイポ(コード中のの後に)があることを示す:
まず OpenCLLink アプリケーションをロードする:
In[1]:=
Click for copyable input
ロードするOpenCLソースコードを定義する:
In[2]:=
Click for copyable input
OpenCL関数をロードする:
In[3]:=
Click for copyable input
Out[3]=
入力パラメータを定義する:
In[4]:=
Click for copyable input
引数を持つ関数を呼び出す:
In[5]:=
Click for copyable input
ArrayPlotを使って結果をプロットする:
In[6]:=
Click for copyable input
Out[6]=
 
ディレクトリからOpenCLソースファイルを得る:
In[1]:=
Click for copyable input
Out[1]=
ファイルからOpenCL関数をロードする:
In[2]:=
Click for copyable input
Out[2]=
関数を呼び出す:
In[3]:=
Click for copyable input
Out[3]=
 
DLLを OpenCLLink にロードしてOpenCLFunctionとして使うことができる:
In[1]:=
Click for copyable input
Out[1]=
予めコンパイルされたライブラリの拡張子はオペレーティングシステムに依存するので,ファイルが存在することを確かめる:
In[2]:=
Click for copyable input
Out[2]=
を使ってライブラリをロードする:
In[3]:=
Click for copyable input
関数は2つを入力リストに加える:
In[4]:=
Click for copyable input
Out[4]=
この例のソースコードは OpenCLLink に付いてくる:
In[5]:=
Click for copyable input
Out[5]=
 
OpenCLFunctionを呼び出す際に追加の引数を与えることができる.引数は,起動するスレッドの数(あるいは大域的な作業グループサイズ)を示す.上の例を使う:
In[1]:=
Click for copyable input
Out[1]=
ファイルからOpenCL関数をロードする:
In[2]:=
Click for copyable input
Out[2]=
32のスレッドで関数を呼び出す.これにより,vectorAddの最初の32個の値のみが計算される:
In[3]:=
Click for copyable input
Out[3]=
 
コードに構文エラーがあると,"compilation failed(コンパイルの失敗)"というエラーが返される:
オプションを使ってビルドログを表示することができる:
上のエラーは,コード中にタイポ(コード中のの後に)があることを示す:
In[3]:=
Click for copyable input
Out[3]=
テンプレートされた関数は,マクロを使ってシミュレーションを行うことができる.以下のソースコードは未定義のマクロとしてを持つ:
マクロに設定する:
マクロを未定義のに設定する:
を使って起動にメモリとメモリのどちらかを指定することができる.以下のコードは,共有メモリを使って勾配計算の大域メモリを保存する:
入力引数を指定し,最後の引数を共有メモリについてとする.ブロックの大きさを256と設定する:
This computes the flattened length of a grayscale image:
関数を呼び出す.共有メモリの大きさをと設定し,起動スレッド数を画像の平坦化された長さに設定する:
共有メモリの大きさを指定するよりよい方法は,型を使う方法である:
共有メモリの型を使うと,型のサイズを渡す必要がない:
簡約,つまりFoldListは, で開始値が x である場合に,の数列の最後の値を計算する:
簡約コードを Mathematica にロードする.性能を高めるため,ブロック次元が指定されている.入力は2のベキなので,の定義をTrueに設定する:
入力を指定し,出力にメモリを割り当てる:
OpenCLFunctionを呼び出す:
outを使ってさらに簡約するために,もう一度を呼び出すことができるが,出力の長さは128であるので, MathematicaTotal関数を呼び出すだけの場合と比べて,性能的にこれを行う利点はない:
65536個の1の定数ベクトルを加えた場合の結果は,MathematicaTotal関数の結果と一致する:
ソースコードは変更して,総和以外の操作を実装することもできる.以下では,リスト中に数字5が現れる回数を数える:
OpenCLFunctionは上と同じようにロードされるが,ブロックの大きさは512である:
ランダムな整数を入力として使う:
OpenCLFunctionを呼び出す:
関数を呼び出す.ここでも Mathematica を使って残りの1024個の数を合計する:
結果はCountを使った場合と同じである:
起動にかかる時間を計る:
性能は7倍である:
入力がすでにCPUにある場合には,性能は52倍向上する:
入力は画像でもよい.画像間の線形補間を行うコードを書く(これはImageComposeを使って行うこともできる):
上のソースコードからOpenCLFunctionをロードする:
の値を設定する.またメモリをに割り当てる:
のスレッドで関数を呼び出す:
メモリを得て,画像としてこれを表示する:
上を使って,関数を作成することができる:
関数はImageComposeと似た構文を持つ:
Manipulateを使って補間係数を操作することができる:
効果が作成できる.以下では滑らかなアニメーションを見ることができる:
一様な乱数生成器は,多くのアプリケーションにおいてよく見られるシード問題である.OpenCLに一様な乱数生成器を実装する:
ソースをOpenCLFunctionとしてロードする.このアルゴリズムは画像を使って乱数の上限を提供する:
OpenCLFunctionを呼び出す.画像は,指定された適切な型を使って解釈することができる限り,OpenCLFunctionに直接渡すことができる:
以下は通常のLenaの画像とは異なっている.これはアルファチャンネルが1に(SetAlphaChannelを使って)設定された4チャンネル画像である:
ランダムな出力を使って画像の重要なエッジを検出する:
メルセンヌ(Mersenne)ツイスタは,もう一つの一様な乱数生成器アルゴリズムである(上のアルゴリズムよりもこちらの方が高度である).実装は以下の場所にある:
OpenCLFunctionをロード,つまり型を指定する.これは,の型はCPUの機能(これが倍数精度をサポートするかどうか)に依存することを意味する:
メルセンヌツイスタの入出力パラメータを設定する(詳細についてはアルゴリズムのページを参照のこと):
OpenCLFunctionを呼び出す:
出力の結果をプロットする:
出力にかかる時間を計る:
ほぼ11倍の速さになったことが分かる:
スキャン,つまり接頭辞の総和のアルゴリズムは,FoldListに似ており,さまざまな場合に使えて大変便利なプリミティブアルゴリズムである.OpenCLの実装は以下の場所にある:
計算に使われる3つのカーネルをロードする:
ランダムな入力データを生成する:
出力バッファを割り当てる:
ブロックとグリッドの次元を計算する:
計算に一時的なバッファが必要である:
スキャン操作を行う:
出力バッファを取り出す:
OpenCLMemory要素を解放する:
ソーベル(Sobel)フィルタ(ここでは水平フィルタだけを考慮する)はカーネルでたたみ込まれる.これを カーネルと呼ぶ.この場合にローカルメモリを使うと,性能が向上する.(より速い実装については,キャニーエッジ検出の例を参照のこと.)OpenCLの普通の実装は以下の場所にある:
OpenCLFunctionをロードする:
入力画像はExampleDataから取り込む:
画像のの値を指定する:
OpenCLFunctionを呼び出す:
ソーベルフィルタの特性の1つに,分離可能であることがある.つまり,上の カーネルは,まずで,次にでたたみ込むことによって表すことができる.これらはそれぞれ と呼ばれる.同じファイルから関数をロードする:
たたみ込みカーネルが分離可能である場合には,分離可能なフィルタを作成する方が,必要なメモリのコピー量を減らすことができるため,完全なたたみ込みを行うよりも効率的である.
行列転置は,多くのアプリケーションにおける基本的なアルゴリズムである.入力を指定する:
OpenCLFunctionをロードする:
OpenCLFunctionを呼び出す:
結果のMatrixFormを示す:
結果は Mathematica の結果と同じである:
行列操作を以下で行う:
ブロックの大きさを定義する:
OpenCLFunctionをロードする.入力が階数2でなければならないことが指定されている:
ランダムな入力を作成し,出力を割り当てる:
OpenCLFunctionを呼び出す:
OpenCLMemoryGetを使って出力メモリを得る:
上の出力は Mathematica の出力と同じである:
一次元の離散高速フーリエ(Fourier)変換は,OpenCLLink を使って実装することができる.この実装は,入力が2のベキであると仮定する:
を使ってOpenCLFunctionをロードする:
入出力リストを作成する:
出力メモリを呼び出して複雑なリストを作成し,最初の50個の要素だけを表示する:
上の結果は,Fourierを使った場合と同じである:
ブラック・ショールズ(Black-Scholes)は,金融派生商品の投資をモデル化するもので,これはOpenCLに実装されている:
OpenCLFunctionをロードする:
入力パラメータを割り当てる:
OpenCLFunctionを呼び出す:
呼出しの値を得る:
結果はFinancialDerivativeの出力に一致する:
所要時間を見るために,評価されるオプションの数を増やす:
C2050では,2048個のオプションを評価するのに1/100秒かかる:
Core i7 950では,, FinancialDerivative は1.13秒かかる.上は280倍の速さである.オプションの数を増やすと,速さの違いがより大きくなる:
再帰的なガウス行列がガウシアンフィルタを近似するのに使われる.アルゴリズムは,ガウス行列が分離可能であるという事実に依存している:
一次ガウス行列の外積として書くことができる:
再帰的なガウス行列は以下の場所に実装されている:
OpenCLFunctionLoadを使ってOpenCLFunctionをロードする:
の値を指定する.ガウス行列は である:
を5.0に設定して正規分布を計算する:
Mathematica で分布をプロットすることができる:
再帰的なガウス行列のパラメータを計算する:
一時的な入力メモリ,および出力メモリがOpenCLMemoryとしてロードされる:
関数を呼び出す.まず水平にガウス行列を行ってから転置し,次にガウス行列を垂直に行ってから転置し,完全なガウス行列を得る:
出力画像を得る:
もう一度所要時間を比べる:
10倍の速さで行われたことが分かる:
バイトニックソートは,整数の任意集合をソートする.これは原則としてマージソートに似ている.OpenCLの実装は,2のベキの長さのリストのみに使えるもので,以下の場所にある:
入力の長さを設定し,これをロードする.方向は,最高から最低へ,あるいは最低から最高へソートするかを示す.この場合は最低から最高へソートする:
入力リストを得る:
マージソートに似たバイトニックソートを呼び出す.完全ソートを行うためには,複数回呼出しを行う必要がある:
出力リストはソートされた形で取り込まれる:
最大作業項目の大きさ(ブロック次元)はOpenCLInformationで返される:
システムによっては,これは1に限られる.
OpenCLコードで倍精度操作を使用するには,コードヘッダに以下のを置く必要がある:
関数の呼出しにおけるエラーは,OpenCLLink を使用不可な状態に置くことがある.これはユーザが任意のカーネルを書くことができるようにしたことによる副次的な結果である.カーネルコード内の無限ループ,バッファオーバーフロー等は,OpenCLLink およびビデオドライバを使用不可なものにすることがある.極端な場合には,表示ドライバがクラッシュする場合もあるが,通常はOpenCLコードをさらに評価した場合に無効な結果を返すだけである.
OpenCL実装のバグの中には,の1つにスペースが含まれていると,カーネルをクラッシュさせるものもある.
等のメモリ修飾子の使用は,OpenCLLink ではサポートされていない.OpenCLFunctionに渡されるメモリはでなければならない.
マンデルブロ集合は,再帰方程式 は複素数)を満足するすべての点をプロットする.以下ではOpenCLにおいて集合を実装する(滑らかに色の移行が行われるように,少し複雑な色付け方法が使われている):
マンデルブロ集合は,ジュリア集合が制約された形である.以下はジュリア集合のコードである:
入力のメモリとパラメータを定義する:
OpenCLFunctionをロードする:
ジュリア集合を計算し,これをReliefPlotを使ってプロットする:
ジュリア集合を計算し,これをグレイスケール画像として表示する:
ImageAdjustは,画像をスケールし直して高い値と低い値を入力する.ガンマ補正も考慮する.以下では,簡単な形のImageAdjustをOpenCLで定義する:
OpenCLFunctionをロードする:
簡単な Mathematica ラッパー関数を定義して,OpenCL関数がImageAdjustと似た構文を持つようにする:
0.3から0.8の間の値を0.0から1.0の間の値にスケールし直すことで,画像を調節する:
Manipulateを使って値をスケールし直すことによって画像を調整する:
0.3から0.8の間の値を0.0から1.0の間の値にスケールし直すことで,画像を調節する:
以下の例では,さまざまな初期力で箱の中の各素粒子の位置を計算する.素粒子物理学の部分はOpenCLで行い,残りの作業はすべて Mathematica で行う:
OpenCLコードを定義して,関数を Mathematica 内にロードする:
n体シミュレーションは,古典的なニュートン問題である.これをOpenCLで実装する:
OpenCLFunctionをロードする:
素粒子数,時間ステップ,イプシロン距離を選択する:
入出力のメモリを設定する:
関数を呼び出す:
体の点をプロットする:
結果をDynamicで示す:
OpenCLLink ではのコード生成機能を使用することができる.を使うには,ユーザはこれをロードしなければならない:
OpenCLLink ではのコード生成機能を使用することができる.ここでは,Mathematica 文を取って,これを 式に変換するメソッドであるを定義する(Mathematica のコマンドすべてを変換することはできないが,これらのコマンドをユーザが加えることはできる):
Mathematica 式は変換することができる:
Cに変換するには,ToCCodeStringを使う:
これを OpenCLLink の記号的コード生成機能に結び付けて関数を作成することができる:
Mathematica の純関数を使うことができる:
コードを使って予め定義された Mathematica 関数で作業することもできる:
上のコードをを使ってロードする:
関数は評価することができる:
これを一般的なものにするためには,関数を実装することができる:
関数は評価できる.以下では関数を実装する:
BitNotの演算子を使う:
Ask a question about this page  |  Suggest an improvement  |  Leave a message for the team
フォーマット:   HTML  |  CDF