CUDALink`
CUDALink`

CUDAFunctionLoad

CUDAFunctionLoad["src",fun,argtypes,blockdim]

文字列 src をコンパイルし,funCUDAFunctionとしてWolfram言語で使えるようにする.

CUDAFunctionLoad[File[srcfile],fun,argtypes,blockdim]

ソースコードファイル srcfile をコンパイルし,funCUDAFunctionとしてロードする.

CUDAFunctionLoad[File[libfile],fun,argtypes,blockdim]

以前コンパイルしたライブラリ libfile から,funCUDAFunctionとしてロードする.

詳細とオプション

  • CUDALink パッケージがNeeds["CUDALink`"]でロードされていなければならない.
  • 使用可能な引数と戻り型,対応するCUDA言語の型:
  • _IntegermintWolfram言語整数
    "Integer32"int32ビット整数
    "Integer64"long/long long64ビット整数
    _RealReal_tGPU実数型
    "Double"double機械倍精度数
    "Float"float機械浮動小数点数
    {base, rank, io}CUDAMemory指定の基底型,階数,入出力オプションのメモリ
    "Local" | "Shared"mint局所または共有のメモリパラメータ
    {"Local" | "Shared", type}mint局所または共有のメモリパラメータ
  • 指定{base, rank, io}において,有効なio"Input""Output""InputOutput"である.
  • 引数指定{base}{base,_,"InputOutput"}に等しく,{base,rank}{base,rank,"InputOutput"}に等しい.
  • 階数は{base,_,io}または{base,io}を使うことで省略できる.
  • 使用できる基底型:
  • _Integer_Real_Complex
    "Byte""Bit16""Integer32"
    "Byte[2]""Bit16[2]""Integer32[2]"
    "Byte[3]""Bit16[3]""Integer32[3]"
    "Byte[4]""Bit16[4]""Integer32[4]"
    "UnsignedByte""UnsignedBit16""UnsignedInteger"
    "UnsignedByte[2]""UnsignedBit16[2]""UnsignedInteger[2]"
    "UnsignedByte[3]""UnsignedBit16[3]""UnsignedInteger[3]"
    "UnsignedByte[4]""UnsignedBit16[4]""UnsignedInteger[4]"
    "Double""Float""Integer64"
    "Double[2]""Float[2]""Integer64[2]"
    "Double[3]""Float[3]""Integer64[3]"
    "Double[4]""Float[4]""Integer64[4]"
  • CUDAFunctionLoadは別の引数で複数回呼び出すこともできる.
  • CUDAFunctionLoadでロードされた関数はWolfram言語カーネルと同じプロセスで実行される.
  • CUDAFunctionLoadでロードされた関数はWolfram言語カーネルが終了するときにアンロードされる.
  • ブロック次元には,1ブロックにつきいくつのスレッドを開始するかを表すリストまたは整数が使える.
  • libfileがダイナミックライブラリなら,ダイナミックライブラリ関数 fun がロードされる.
  • libfileにはCUDA PTX,CUDA CUBIN,ライブラリファイルが使える.
  • ブロック次元の最大サイズはCUDAInformation"Maximum Block Dimensions"特性で返される.
  • 開始するときに,(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が探すディレクトリ

例題

すべて開くすべて閉じる

  (5)

まず CUDALink アプリケーションをロードする:

与えられた2つのベクトルを足す:

上で定義したCUDAコードをコンパイルして実行する:

出力リストの長さを定義する:

入出力ベクトルを定義する.これらはWolfram言語の通常のリストで,CUDAカーネルコードのシグネチャで定義した型と同じである:

指定の入力で関数を実行する:

結果の最初の20個の値を表示する:

CUDAファイルがを渡すことができる.CUDA関数ファイルへのパスを表示する:

ファイル名はリストに収められる:

入力パラメータを定義する:

関数を呼び出す:

CUDAFunctionを呼び出すときは追加の引数を与えることができる.引数は開始するスレッド数(またはグリッド次元とブロック次元の積)を表す.CUDA実装を含むソースファイルを取得する:

ファイルからCUDA関数をロードする:

32スレッドの関数を呼び出す.ベクトルの最初の32個の値の加算が計算される:

浮動小数点精度のサポートのために,ハードウェアと"TargetPrecision"に基づいてReal_tが定義されている:

オプションを与えないと,"TargetPrecision"はデバイスで使用できる最高の浮動小数点精度を使用する.この場合は倍精度である:

マクロReal_t=doubleCUDALINK_USING_DOUBLE_PRECISIONQ=1がどのように定義されるかに注目されたい.検出を避けるために"Double"または"Single"オプションが渡せる.これは上のものと同じである:

単精度の利用を強制するためには"TargetPrecision""Single"値を渡す:

目的精度に基づいて型_Realが検出される.指定の型の使用を強制するために,型として"Float"または"Double"を渡す:

"ShellOutputFunction"を使ってコンパイルの失敗についての情報を得ることができる.ソースコードにシンタックスエラーがある:

関数をロードする:

"ShellOutputFunction"->Printと設定すると,ビルドログが与えられる:

この場合,変数indexのスペルが間違っていた.

スコープ  (5)

CとCUDAファイルのロード  (1)

CUDAFunctionLoadはコードのCの部分を無視する.これによりバイナリとしてそれ自体でコンパイルできるが,CUDAFunctionとしてもロードできるコードを書くことが可能となる.CUDAソースファイル(Cが混在したもの)をWolfram言語にロードする:

関数を呼び出す:

共有または局所のメモリの指定  (2)

CUDAFunctionLoadはランタイムにおける関数の共有(局所)メモリサイズを指定することができる.次のコードは共有メモリを使って勾配の計算のための大域メモリを保管する:

最後の引数が共有メモリのための"Shared"である入力引数を指定する.ブロックサイズは256に設定される:

グレースケールの画像の平坦化された長さを計算する:

関数を呼び出す.共有メモリサイズは(blockSize+2)*sizeof(mint)に設定され,開始するスレッド数は画像の平坦化された長さに設定される:

共有メモリサイズを指定するよりよい方法は,型を使う方法である:

共有メモリ型を使うと,型のサイズを渡す必要がない:

テンプレート化された関数 (1)

テンプレート化された関数を呼び出すことができる.制約は,デバイス関数としてテンプレート化された関数のインスタンスを作成し,"UnmangleCode"Falseに設定しなければならないということだけである.どのデバイス関数を呼び出すかを決めるディスパッチ関数を使って,テンプレート化された関数をコンパイルしてPTXバイトコードにする:

整数に対して関数をロードする:

関数を実行する.3は入力型が整数であることを指定するものである:

マクロを使用した汎用型  (1)

テンプレート化された関数はマクロを使って同じものが作れる.次のソースコードは未定義マクロとしてGeneric_tを持つ:

マクロGeneric_tmintに設定する:

マクロGeneric_tunsigned charに設定する:

上記の方法を使うと,名前修飾なしにテンプレート型と同じものを作ることができる.

三次元ブロックサイズ  (1)

三次元ブロックサイズもサポートされている.体積データを反転る:

関数をロードし,三次元ブロックのサイズを渡す:

ファイルからデータをロードする:

計算を行う:

結果を描画する:

アプリケーション  (8)

パーリン(Perlin)ノイズ  (1)

パーリンノイズは擬似テクスチャを生成するのに使われる一般的なアルゴリズムである.次はノイズ関数の教科書どおりの実装である:

"classicPerlin"関数をロードする:

ノイズアルゴリズムで使われる置換表を生成する:

幅と高さを設定する.出力メモリも割り当てる:

パーリンノイズのパラメータを設定する:

パーリンノイズ関数を呼び出す.出力はCUDAMemoryハンドルである:

メモリがGPUから取り出され,画像として表示される:

結果にManipulateを使うと,パラメータを変化させて出力を見ることができる:

パーリンノイズで手続き型の地形を作成することができる.幅高さを定義し,地形のためのメモリを割り当てる:

地形を定義するのに使われるパラメータ:

データを取り出し,標高マップを平坦にするのに画像処理関数を適用する:

結果は山脈のようである:

メモリの割当てを解放する:

ノイズのパラメータを変化させると,異なるパターンになる.木のテクスチャを作る:

以下は木についての既知のパラメータである:

グレースケールに再び色を付けるヘルパー関数を定義する:

木のテクスチャを生成する:

前と同様に,結果の面をプロットする:

もとのソースコードはより多くのノイズ関数を定義している.関数をロードする:

Manipulateを使って別のノイズ関数を示す:

割り当てたメモリを解放する:

ヒストグラムアルゴリズム  (1)

ヒストグラムアルゴリズムは値によって要素を別々のビンのリストに分ける.次の例は0から255までの値を別々のビンに分けるヒストグラムを実装する:

2つのCUDAカーネル関数をロードする:

サンプルデータを取得する.この場合は画像が選ばれ,ImageDataを平坦化する:

アルゴリズムには中間ヒストグラムに使われる一時データが必要である:

部分ヒストグラムを計算し,それを前に生成した中間リストに置く:

一時ヒストグラムを結合する:

出力ヒストグラムを得る:

一時メモリをアンロードする.これを行わないと,メモリリークが起こる:

出力ヒストグラムをプロットする:

プレフィックス和アルゴリズム  (1)

走査,つまりプレフィックス和はFoldListに似ており,さまざまな状況で使える非常に便利なプリミティブである.CUDAの実装は以下にある:

計算に使用する3つのカーネルをロードする:

ランダム入力データを生成する:

出力バッファを割り当てる:

ブロックとグリッドの次元を計算する:

一時バッファが計算に必要である:

走査を行う:

出力バッファを取り出す:

結果はFoldListのものと一致する:

CUDAMemory要素の割当てを解放する:

リダクション  (1)

リダクションカーネルは指定のバイナリ操作によるリストのリダクションという意味で,Wolfram言語のFoldに似ている.操作が計算で前の要素を維持するのに対し,リダクションはそれを削除する.

リダクションCUDAFunctionをロードする:

入出力バッファを設定する:

計算を行う:

各ブロックはリストの512要素のリダクションを行う.つまり,512要素より大きいリストのリダクションには複数回の呼出しが必要となる.次のリストは小さく,ループが必要ない.前のステップから出力メモリを取得し,outのメモリをinに割当て,outを解放する:

新しい出力バッファを割り当てる:

2回目のリダクションを行う:

出力を取り出し,出力バッファをアンロードする:

結果はWolfram言語のものと一致する:

RGBからHSBへの変換  (1)

次の例はRGB色空間からHSBへの色の変換を実装する.CUDAによる実装は以下のファイルにある:

ソースファイルから"rgb2hsb"をロードする:

入力画像と入力パラメータを設定する:

出力のためのメモリを割り当てる:

画像をHSB色空間に変換する:

デフォルトでは,ImageはRGB色空間のデータを見る.結果は間違った出力となる:

適切な出力を得るためにColorSpace -> "HSB"を使う:

シーザー(Caesar)暗号  (1)

次のコードはシーザー暗号を実装する.シーザー暗号はテキストの各文字に3を足す簡単な暗号法である.以下がCUDAの実装である:

例に使うテキストをロードする.この場合はアメリカ独立宣言書がロードされる:

コード文字列から関数をロードする:

CUDA関数を呼出し,出力の最初の100を表示する:

移動平均  (1)

移動平均を実装する:

マクロ"BLOCK_DIM"256として定義するCUDAFunctionをロードする:

入力パラメータを定義し,出力用のメモリを割り当てる:

CUDAFunctionを呼び出す:

出力メモリを取得する:

メモリをアンロードする:

ブラックショールズ(BlackScholes)方程式  (1)

ブラックショールズ方程式はよく金融の計算で使われる.CUDALink にはCUDAFinancialDerivativeがあり,これは金融オプションの計算ができる.これがどのように書かれているかを例示するために,簡単なバージョンを実装する:

CUDAFunctionをロードする._Real"Float"として解釈されるように"TargetPrecision""Single"に設定する:

入力パラメータを割り当てる:

関数を呼び出す:

出力メモリを取得する:

割り当てられたメモリをアンロードする:

考えられる問題  (4)

最大ブロック次元がCUDAInformationによって返される:

関数呼び出しにおけるエラーは CUDALink を不安定な状態にすることがある.これはユーザが任意のカーネルを書くことができるようにすることの副作用である.カーネルコード中の無限ループやバッファのオーバーフロー等は CUDALink とビデオドライバの両方を不安定な状態にすることがある.

これは極端な場合,ディスプレイドライバをクラッシュさせることがあるが,通常はCUDAコードのその後の評価で無効な結果が返されるだけである.

コンパイル済みカーネルの型は一致しなければならない.浮動小数点数として定義されたReal_tのカーネルは,"TargetPrecision""Double" に設定されているときに使うと不正な結果を返す.

"UnmangleCode"Trueに設定されているときは,C++構文のエキスポートはサポートされていない.

インタラクティブな例題  (4)

コンウェイ(Conway)のライフゲーム  (1)

コンウェイのライフゲームは周りの状態に基づいて進化するセルオートマトンである.CUDALink 関数をロードする:

初期化のためにランダムに初期化する必要があるが,極端に少ない初期状態にするとすべてのセルが死んでしまうので避けなければならない:

DynamicArrayPlotを使って関数を表示する:

DynamicImageを使って関数を表示する.少し速いことに注目されたい:

CUDAMemoryを使うと,描画速度を上げることができる:

ボールの跳ね  (1)

次の関数はCUDAFunctionをロードし,BallBounceEffect関数を呼び出す:次の物理的シミュレーションでは,CUDAFunctionを使って計算を行い,残りをWolfram言語に任せる方法を示す.

粒子を描き,効果を作成するために更新する:

関数を呼び出す:

ジュリア(Julia)集合  (1)

ジュリア集合はマンデルブロ(Mandelbrot)集合を一般化したものである.CUDAカーネルを実装する:

幅と高さを設定する.集合は計算されるので,メモリを設定する必要はない.メモリ割当てのみが必要である:

CUDAFunctionをロードする.コンパイラがコードを最適化するのにループを解くようなことを行うマクロが使用される:

集合を計算し,ReliefImageを使ってそれを見る:

ManipulateReliefPlotを使って,ユーザがcの値を調整することができるインターフェースを作る:

ReliefPlotImageに変えて可視化をより速くすることもできる:

マンデルブロ集合  (1)

マンデルブロ集合はで定義される.次のコードは はユーザ定義のパラメータ)という形式の集合を使って,カーネルファイルに独自のタイプをどのように定義するかを示す.カーネルは以下に定義されている:

変数widthheightを設定する:

出力集合のメモリはCUDAMemoryAllocateを使って割り当てる:

上記ファイルから関数をロードする:

指数 2のときの集合を計算して表示する:

指数 が変化するときの集合を計算して表示する:

200フレームの集合を生成する:

各フレームをT多角形上のテクスチャとして描画する:

おもしろい例題  (4)

SymbolicCコードの生成  (1)

CUDALink の記号機能を使うと,Wolfram言語式を使ってCUDAコードを書き,それをCUDAコードに変換することができる.次の例では,記号コードを使って簡単な1D離散Haarウェーブレット変換を実装する:

記号コードはSymbolicCToCCodeStringを使ってCUDAコードに変換できる:

コードはCUDAFunctionLoadを使ってロードできる:

同じ入力データを作る:

maxStage=1としてCUDAFunctionを呼び出す:

結果のCUDAMemoryを取得する:

記号コード生成の面白いのは,シンタックスツリーを操作することができるという点である.この例では,関数引数をCPointerType["int"]からCPointerType["float"]に変更する:

再び結果からCUDAコードを生成する:

コード生成のもう一つの面白い点は,CUDA記号関数はOpenCl記号関数のミラーとなっている点である.したがって上記記号コードのCUDA記号関数を変更するだけでOpdnCLコードを生成することができる:

まず OpenCLLink をロードする:

OpenCLの1D離散Harrウェーブレット変換を実装する:

この変換ではSymbolicCUDAFunctionSymbolicOpenCLFunctionSymbolicCUDADeclareIndexBlockSymbolicOpenCLDeclareIndexBlockという2語だけの変更が行われた.

マンデルブロ集合  (1)

次のコードはマンデルブロ集合を計算する:

ルール30のセルオートマトン  (1)

ルール30のセルオートマトンでは,隣の行は前のものに依存するため,列数が非常に大きくなるまではCUDAを使う利点はあまりない.それでも簡単なルール30のセルオートマトンをCUDA関数として書くことができる:

メモリバッファを作成する:

rule30を128回適用する:

ArrayPlotを使って結果をプロットする:

マンデルバルブ集合  (1)

次の実装は3Dにおけるマンデルブロ集合に類似した三次元マンデルブロ(マンデルバルブ)を実装する.三次元数は複素指数の極をというように三次元空間座標に拡張する.加算は単純にベクトルの加算である.マンデルバルブパラメータ(幅,高さ,カメラ位置,光源位置)を指定する:

出力メモリを割り当てる:

実装をソースからロードする:

CUDAFunctionを実装する:

CUDAFunctionを実行する:

CUDAMemoryをWolfram言語に取り込む:

結果を画像として表示する:

結果をManipulateに置くことができる:

ユーザがカメラ位置を調整できるインターフェースを作成する:

Wolfram Research (2010), CUDAFunctionLoad, Wolfram言語関数, https://reference.wolfram.com/language/CUDALink/ref/CUDAFunctionLoad.html.

テキスト

Wolfram Research (2010), CUDAFunctionLoad, Wolfram言語関数, https://reference.wolfram.com/language/CUDALink/ref/CUDAFunctionLoad.html.

CMS

Wolfram Language. 2010. "CUDAFunctionLoad." Wolfram Language & System Documentation Center. Wolfram Research. https://reference.wolfram.com/language/CUDALink/ref/CUDAFunctionLoad.html.

APA

Wolfram Language. (2010). CUDAFunctionLoad. Wolfram Language & System Documentation Center. Retrieved from https://reference.wolfram.com/language/CUDALink/ref/CUDAFunctionLoad.html

BibTeX

@misc{reference.wolfram_2024_cudafunctionload, author="Wolfram Research", title="{CUDAFunctionLoad}", year="2010", howpublished="\url{https://reference.wolfram.com/language/CUDALink/ref/CUDAFunctionLoad.html}", note=[Accessed: 22-November-2024 ]}

BibLaTeX

@online{reference.wolfram_2024_cudafunctionload, organization={Wolfram Research}, title={CUDAFunctionLoad}, year={2010}, url={https://reference.wolfram.com/language/CUDALink/ref/CUDAFunctionLoad.html}, note=[Accessed: 22-November-2024 ]}