Main Content

parallel.gpu.CUDAKernel

GPU 上で実行可能なカーネル

説明

CUDAKernel オブジェクトは GPU 上で実行可能な CUDA カーネルを表します。CU および PTX ファイルからカーネルを作成します。CUDAKernel オブジェクトの作成および使用方法の例については、GPU での CUDA または PTX コードの実行を参照してください。

メモ

CUDAKernel オブジェクトに対し save または load を実行することはできません。

作成

説明

kern = parallel.gpu.CUDAKernel(ptxFile,cuFile) は、PTX コード ptxFile と CUDA® ソース ファイル cuFile を使用して CUDAKernel オブジェクトを作成します。PTX ファイルは単一のエントリ ポイントのみを含む必要があります。

kern を入力として feval を使用して、GPU で CUDA カーネルを実行します。カーネル オブジェクトの実行についての詳細については、CUDAKernel の実行を参照してください。

kern = parallel.gpu.CUDAKernel(ptxFile,cuFile,func) は、func で定義された関数エントリ ポイントの CUDAKernel を作成します。func は PTX ファイル内で適切なカーネル エントリ ポイントを明確に定義する必要があります。

kern = parallel.gpu.CUDAKernel(ptxFile,cProto) は、PTX ファイル ptxFile と C プロトタイプ cProto を使用して CUDAKernel オブジェクトを作成します。cProto は、kern が表すカーネル呼び出しの C 関数プロトタイプです。PTX ファイルは単一のエントリ ポイントのみを含む必要があります。

kern = parallel.gpu.CUDAKernel(ptxFile,cProto,func) は、func で定義された関数エントリ ポイントの PTX ファイルと C プロトタイプから CUDAKernel オブジェクトを作成します。func は PTX ファイル内で適切なカーネル エントリ ポイントを明確に定義する必要があります。

入力引数

すべて展開する

PTX ファイルまたは PTX コードの名前。

PTX ファイルの名前を指定するか、その内容を string として渡すことができます。

例: "simpleEx.ptx"

データ型: char | string

CUDA ソース ファイルの名前。文字ベクトルとして指定します。

この関数は CUDA ソース ファイルを調べ、PTX コードで定義されている CUDA カーネルの関数プロトタイプを検索します。CUDA ソース ファイルには、'__global__' で始まるカーネル定義が含まれている必要があります。

例: "simpleEx.cu"

データ型: char | string

関数エントリ ポイント。文字ベクトルとして指定します。func は PTX ファイル内で適切なエントリ ポイントを明確に定義する必要があります。

メモ

関数 parallel.gpu.CUDAKernel は PTX ファイル内で指定されたエントリ ポイントを検索し、出現するすべての部分文字列を照合します。したがって、エントリ ポイントの名前は他のエントリ ポイントの名前の部分文字列にしないでください。

例: "add1"

データ型: char | string

カーネル呼び出しの C プロトタイプ。文字ベクトルとして指定します。複数の入力引数は、コンマで区切って指定します。

例: "float *,float,int"

データ型: char | string

プロパティ

すべて展開する

カーネルにあるスレッドのブロック サイズ。長さ 1、2 または 3 の正の整数ベクトルとして指定します (スレッド ブロックは最大 3 次元のため)。ThreadBlockSize の要素の積はこのカーネルの MaxThreadsPerBlock を超えてはならず、また、ThreadBlockSize のいずれの要素も GPUDevice のプロパティ MaxThreadBlockSize の対応する要素を超えることはできません。

例: [8 8 8]

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

この プロパティ は読み取り専用です。

この CUDA カーネルの単一ブロックで許可されるスレッドの最大数。ThreadBlockSize の要素の積はこの値を超えてはなりません。

例: 1024

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

スレッド ブロックのグリッドのサイズ。長さが 3 の整数ベクトルとして指定します。これは実際上は、GPU によって個別に起動されるスレッド ブロックの数です。このベクトルのいずれの要素も、GPUDevice オブジェクトの MaxGridSize プロパティのベクトルの対応する要素を超えることはできません。

例: [977 1 1]

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

各スレッド ブロックが使用できる動的な共有メモリの量 (バイト単位)。各スレッド ブロックには使用可能な共有メモリ領域があります。このメモリはマルチプロセッサ上のレジスタで共有されます。SharedMemorySizeGPUDevice オブジェクトの MaxShmemPerBlock プロパティを超過してはなりません。

すべてのメモリと同じく、これもカーネルの起動前に割り当てる必要があります。この共有メモリ領域のサイズをスレッド ブロックのサイズに関連付けることは、一般に行われます。カーネル上でこの値を設定することで、ブロック内の各スレッドがこの使用可能な共有メモリ領域にアクセスできるようになります。

例: 16000

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

この プロパティ は読み取り専用です。

カーネルで呼び出される PTX コード内のエントリ ポイント名。

例: "_Z13returnPointerPKfPy"

データ型: char | string

この プロパティ は読み取り専用です。

カーネルでサポートされる左辺引数の数の上限。これは右辺引数の数を超えることはできず、また、定数またはスカラーの入力がある場合にはこの数より少なくなります。

例: 1

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical

この プロパティ は読み取り専用です。

このカーネルを呼び出すのに必要な右辺引数の数。すべての入力で、入力のスカラー値、ベクトル入出力の要素または出力引数のサイズのいずれかを定義する必要があります。

例: 5

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64

この プロパティ は読み取り専用です。

長さが NumRHSArguments の文字ベクトルの cell 配列。各文字ベクトルでは、uint8singledouble などの数値型に scalar または vector の語が続き、参照と値のいずれで渡すかを示すことで、この入力に必要な MATLAB® データ型が指定されます。また、引数がカーネルへの入力専用の場合には、その先頭に in が付きます。入出力兼用の場合は、その先頭に inout が付きます。これにより、MATLAB 配列と gpuArray オブジェクトの両方を使用してカーネルを効率的に呼び出す方法を決め、どのカーネル入力を出力として扱うかを確認できます。

例: {'inout double vector'} {'in double vector'} {'in double vector'} {'in uint32 scalar'} {'in uint32 scalar'}

データ型: cell

オブジェクト関数

fevalGPU 上のカーネルを評価する
setConstantMemoryGPU に定数メモリを設定する
existsOnGPUGPU で gpuArray または CUDAKernel が使用可能かどうかを判別する

すべて折りたたむ

この例では、PTX ファイルと CU ファイルの使用または PTX ファイルと関数プロトタイプの使用により、CUDAKernel オブジェクトを作成する方法を説明します。

CUDA ソース ファイル simpleEx.cu には次のコードが含まれています。

/*
* Add a constant to a vector.
*/
__global__ void addToVector(float * pi, float c, int vecLen)  {
   int idx = blockIdx.x * blockDim.x + threadIdx.x;
   if (idx < vecLen) {
       pi[idx] += c;
   }
}

-ptx オプションを指定して mexcuda を使用し、CU ファイルを PTX ファイルにコンパイルします。

mexcuda -ptx simpleEx.cu
Building with 'NVIDIA CUDA Compiler'.
MEX completed successfully.

PTX ファイルと CU ファイルを使用して CUDA カーネルを作成します。

kern = parallel.gpu.CUDAKernel("simpleEx.ptx","simpleEx.cu");

PTX ファイルと関数 addToVector の関数プロトタイプを使用して、CUDA カーネルを作成します。

kern = parallel.gpu.CUDAKernel("simpleEx.ptx","float *,float,int");

上記のどちらのステートメントも、addToVector CUDA カーネルを呼び出すために使用できるカーネル オブジェクトを返します。

この例では、複数のエントリ ポイントが含まれた PTX ファイルから CUDAKernel オブジェクトを作成する方法を説明します。

CU ファイル myfun.cu に、2 つの double を一緒に追加するための関数 add1 および 2 つのベクトルを一緒に追加するための関数 add2 が含まれているものとします。

__global__ void add1( double * a, double b ) 
{
    *a += b;
}

__global__ void add2( double * v1, const double * v2 ) 
{
    int idx = threadIdx.x;
    v1[idx] += v2[idx];
}

-ptx オプションを指定して mexcuda を使用し、CU ファイルを PTX ファイルにコンパイルします。

mexcuda -ptx myfun.cu
Building with 'NVIDIA CUDA Compiler'.
MEX completed successfully.

PTX ファイルには、関数 add1 および add2 に対応する 2 つのエントリ ポイントが含まれています。PTX コードに複数のエントリ ポイントが含まれている場合、カーネルの作成時に 1 つのエントリを指定する必要があります。

2 つの double を一緒に追加するためのカーネルを作成し、エントリ ポイント add1 を指定します。

k = parallel.gpu.CUDAKernel("myfun.ptx","myfun.cu","add1");

バージョン履歴

R2010b で導入