Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

CUDA コードを含む MEX 関数の実行

CUDA コードを含む MEX ファイルの記述

すべての MEX ファイル (CUDA® コードを含むものも該当) には、mexFunction と呼ばれる単一のエントリ ポイントがあります。MEX 関数には、MATLAB® から gpuArray オブジェクトを操作し、CUDA コードを起動するホスト側のコードがあります。MEX ファイルの CUDA コードは CUDA runtime API に準拠していなければなりません。

MEX ファイルの起動に際しては、関数 mxInitGPU を呼び出して、確実に GPU デバイスを適切に初期化し、MATLAB に認識させる必要があります。

gpuArray オブジェクト用の MEX ファイルの作成に使用するインターフェイスは、標準 MATLAB 配列用の MEX インターフェイスとは異なります。

CUDA コードを含む MEX ファイルの例については、以下を参照してください。

このファイルは、以下の CUDA デバイス関数を含みます。

void __global__ TimesTwo(double const * const A,
                         double * const B,
                         int const N)
{
    int i = blockDim.x * blockIdx.x + threadIdx.x;
    if (i < N)
        B[i] = 2.0 * A[i];
}

このファイルは、配列のサイズを特定して適切なサイズのグリッドを起動する以下の行も含みます。

N = (int)(mxGPUGetNumberOfElements(A));
blocksPerGrid = (N + threadsPerBlock - 1) / threadsPerBlock;
TimesTwo<<<blocksPerGrid, threadsPerBlock>>>(d_A, d_B, N);

結果として得た MEX 関数の実行

次の例の MEX 関数は、入力配列の各要素に 2 を乗算し、その値を出力配列に収めます。この関数をテストするため、すべての要素が 1 の gpuArray 行列から始めます。

x = ones(4,4,"gpuArray");
y = mexGPUExample(x)
y = 

    2    2    2    2
    2    2    2    2
    2    2    2    2
    2    2    2    2

入力配列と出力配列は gpuArray オブジェクトです。

CUDA カーネルとの比較

Parallel Computing Toolbox™ ソフトウェアでは CUDAKernel オブジェクトもサポートされており、CUDA コードの MATLAB との統合に使用できます。CUDAKernel オブジェクトは、CU ファイルと PTX ファイルを使用して作成できます。一般的には、CUDAKernel オブジェクトを使用するよりも、MEX ファイルを使用するほうが柔軟性が高くなります。その理由は次のとおりです。

  • MEX ファイルには、NVIDIA® Performance Primitives (NPP) ライブラリや cuFFT ライブラリなどの NVIDIA ライブラリを含む、ホスト側ライブラリの呼び出しを含めることができます。MEX ファイルには、ホストから CUDA ランタイム ライブラリ内の関数の呼び出しを含めることもできます。

  • MEX ファイルでは、C または C++ コードから、入力サイズを解析して異なるサイズのメモリを割り当て、異なるサイズのグリッドを起動することができます。これに対し、CUDAKernel オブジェクトを呼び出す MATLAB コードでは、出力メモリを事前に割り当ててグリッド サイズを決定しなければなりません。

複素数データへのアクセス

GPU デバイスでの複素数データは、実数部と虚数部がインターリーブされた形式で格納されます。つまり、複素数 gpuArray A の場合、各要素の実数部と虚数部が連続したアドレスに格納されることになります。MATLAB は CUDA の組み込みのベクトル型を使用して、複素数データをデバイスに格納します。詳細については、NVIDIA CUDA C++ Programming Guide を参照してください。

カーネルでの必要性に応じて、複素数データへのポインターは実数型または組み込みのベクトル型としてキャストできます。たとえば、MATLAB で次の行列を作成するとします。

a = complex(ones(4,"gpuArray"),ones(4,"gpuArray"));

gpuArray を MEX 関数に 1 番目の引数 (prhs[0]) として渡す場合、複素数データへのポインターを取得するには、以下の呼び出しを使用します。

mxGPUArray const * A = mxGPUCreateFromMxArray(prhs[0]);
mwSize numel_complex = mxGPUGetNumberOfElements(A);
double2 * d_A = (double2 const *)(mxGPUGetDataReadOnly(A));

この配列を 2 倍の長さをもつ倍精度の実数配列として扱うには、以下の呼び出しを使用します。

mxGPUArray const * A = mxGPUCreateFromMxArray(prhs[0]);
mwSize numel_real = 2*mxGPUGetNumberOfElements(A);
double * d_A = (double const *)(mxGPUGetDataReadOnly(A));

以下の Parallel Computing Toolbox の関数を使用して、GPU 上でデータを複素数形式と実数形式の間で変換できます。それらの操作では、データをインターリーブするためにコピーを作成する必要があります。

  • 関数 mxGPUCreateComplexGPUArray は 2 つの実数 mxGPUArray オブジェクトの要素をインターリーブして、同じ長さをもつ単一の複素数 mxGPUArray を出力します。

  • 関数 mxGPUCopyReal および関数 mxGPUCopyImag はそれぞれ、mxGPUArray の実数部の要素と虚数部の要素を単一の実数 mxGPUArray にコピーします。

mxGPUArray オブジェクトについて、関数 mxGetImagData に相当するものはありません。

GPU MEX ファイルのコンパイル

CUDA コードを含む MEX ファイルをコンパイルするには、MATLAB で関数 mexcuda を使用します。既定では、関数 mexcuda は MATLAB と共にインストールされる NVIDIA CUDA コンパイラ (nvcc) を使用して、CUDA コードをコンパイルします。ソフトウェアは、さらに先のコンパイル ステップを、システムにインストールされた C++ ホスト コンパイラに転送します。mexcuda が使用しているコンパイラを確認するには、関数 mexcuda で詳細出力を得るための -v フラグを使用します。

mexcuda mexGPUExample.cu

mexcudanvcc が見つからない場合、既定以外の場所にインストールされている可能性があります。システム上の nvcc の場所を環境変数 MW_NVCC_PATH に保存して指定することができます。この変数を設定するには、setenv コマンドを使用します。以下に例を示します。

setenv("MW_NVCC_PATH","/usr/local/CUDA/bin")

サポートされるホスト コンパイラ

関数 mexcuda を使用して MEX ファイルをコンパイルするには、サポートされる C++ ホスト コンパイラをインストールしておく必要があります。mexcuda は、Visual Studio® コンパイラのサブセットのみをサポートしています。ご使用のコンパイラがサポートされているかどうかを調べるには、次の手順に従います。

  1. CUDA ツールキットのインストール (オプション)の表を参照して、ご使用のバージョンの MATLAB がどのバージョンの CUDA を使用しているかを特定します。

  2. 手順 1 で特定した CUDA のバージョンに対応する NVIDIA CUDA ツールキットのドキュメンテーションを参照します。このドキュメンテーションの「installation guide」セクションに、サポートされるコンパイラの一覧があります。

CUDA ツールキットのインストール (オプション)

MATLAB と共にインストールされる CUDA ツールキットには、CUDA ツールキットで使用可能なすべてのライブラリが含まれているわけではありません。MATLAB と共にインストールされていない特定のライブラリを使用するには、CUDA ツールキットをインストールします。

メモ

GPU 上で MATLAB 関数を実行する場合や、CUDA 対応の MEX 関数を生成する場合は、CUDA ツールキットは必要ありません。

CUDA ツールキットには、CUDA のライブラリおよびコンパイル用ツールが含まれています。

使用している MATLAB のバージョンに適切な CUDA ツールキットのバージョンをダウンロードします。以下の表で、使用している MATLAB のバージョンと互換性のあるツールキットのバージョンを確認してください。推奨されるベスト プラクティスは、サポートされている CUDA ツールキットの最新バージョン (NVIDIA からのすべての更新やパッチを含む) を使用することです。

MATLAB リリースCUDA ツールキットのバージョン
R2023b11.8
R2023a11.8
R2022b11.2
R2022a11.2
R2021b11.0
R2021a11.0
R2020b10.2
R2020a10.1
R2019b10.1
R2019a10.0
R2018b9.1
R2018a9.0
R2017b8.0
R2017a8.0
R2016b7.5
R2016a7.5
R2015b7.0
R2015a6.5
R2014b6.0
R2014a5.5
R2013b5.0
R2013a5.0
R2012b4.2
R2012a4.0
R2011b4.0

CUDA ツールキットの詳細、およびサポートされているバージョンのダウンロードについては、CUDA Toolkit Archive (NVIDIA) を参照してください。

参考

| |

関連するトピック