GPU Coder アプリを使用したコード生成
この例では、GPU Coder™ アプリを使用して MATLAB® 関数から CUDA® コードを生成する方法を示します。エントリポイント関数は、マンデルブロ集合アルゴリズムの MATLAB 実装です。この例では、GPU Coder アプリを使用して、NVIDIA® GPU で実行できる CUDA コードを生成します。プログラムでコードを生成する方法を示す例については、コマンド ライン インターフェイスを使用したコードの生成を参照してください。
GPU 環境の検証
この例では以下が必要です。
CUDA 対応 NVIDIA GPU および互換性のあるドライバー
ホスト マシンと互換性のあるコンパイラ
GPU Coder に必要なハードウェアとソフトウェアの詳細については、前提条件となる製品のインストールを参照してください。コンパイラを設定するには、前提条件となる製品の設定を参照してください。
この例を実行するために必要なコンパイラおよびライブラリが正しく設定されていることを検証するために、coder.checkGpuInstall関数を使用します。
envCfg = coder.gpuEnvConfig("host");
coder.checkGpuInstall(envCfg);Compatible GPU : PASSED CUDA Environment : PASSED Runtime : PASSED cuFFT : PASSED cuSOLVER : PASSED cuBLAS : PASSED Host Compiler : PASSED
上記の出力は、coder.checkGpuInstall の呼び出しの例です。このコードを実行したときの出力は異なる場合があります。
マンデルブロ エントリポイント関数の確認
マンデルブロ集合とは、値 で構成された複素平面の領域であり、この値は
で定義された軌跡が のときに有限の範囲内にとどまるときの値です。次の図はマンデルブロ集合の全体的な幾何形状を示しています。このビューは、集合の境界の外側周辺の詳しい構造を示すほどの解像度ではありません。

mandelbrot_count_start.m エントリポイント関数には、Experiments with MATLAB (Cleve Moler 著) のコードに基づく、マンデルブロ集合のベクトル化済みの実装が含まれています。
type mandelbrot_count_start.mfunction count = mandelbrot_count_start(maxIterations,xGrid,yGrid)
% Copyright 2024 The MathWorks, Inc.
z0 = complex(xGrid, yGrid);
count = ones(size(z0));
z = z0;
for n = 0:maxIterations
z = z.*z + z0;
inside = abs(z)<=2;
count = count + inside;
end
count = log(count);
コード生成のためのエントリポイント関数の準備
コード生成に関連する問題をチェックするには、mandelbrot_count_start 関数の最初に %#codegen 命令を追加します。この命令により、MATLAB エディターのコード アナライザーは、コード生成に関連する警告とエラーにフラグを立てます。
function mandelbrot_count_start(maxIterations,xGrid,yGrid) %#codegen
コード アナライザーは、MATLAB エディターの右上隅に、警告が見つからないことを示すアイコン
を表示します。これは、アナライザーがコード内のエラー、警告、および改善機会を検出しなかったことを示します。
エントリポイント関数を CUDA カーネルにマッピングするには、関数にcoder.gpu.kernelfunプラグマを追加します。コード生成時に、GPU Coder は coder.gpu.kernelfun プラグマを使用して関数を分析し、計算を GPU にマッピングすることを試みます。
%#codegen 命令と coder.gpu.kernelfun プラグマを挿入した後、関数を mandelbrot_count.m として保存します。
type mandelbrot_count.mfunction count = mandelbrot_count(maxIterations,xGrid,yGrid) %#codegen
% Copyright 2016-2024 The MathWorks, Inc.
z0 = complex(xGrid, yGrid);
count = ones(size(z0));
% Map computation to GPU.
coder.gpu.kernelfun;
z = z0;
for n = 0:maxIterations
z = z.*z + z0;
inside = abs(z)<=2;
count = count + inside;
end
count = log(count);
エントリポイント関数の機能のテスト
mandelbrot_test.m スクリプトは、範囲 xlim と ylim の間に実数部と虚数部から成る 1000×1000 のグリッドを生成します。このグリッドを使用して mandelbrot_count を呼び出し、結果のマンデルブロ集合をプロットします。
type mandelbrot_test.m% Copyright 2024 The MathWorks, Inc.
maxIterations = 500;
gridSize = 1000;
xlim = [-0.748766713922161,-0.748766707771757];
ylim = [0.123640844894862,0.123640851045266];
x = linspace(xlim(1),xlim(2),gridSize);
y = linspace(ylim(1),ylim(2),gridSize);
[xGrid,yGrid] = meshgrid(x,y);
%% Mandelbrot computation in MATLAB
count = mandelbrot_count(maxIterations,xGrid,yGrid);
%% Show
figure(1)
imagesc(x,y,count);
colormap([jet();flipud(jet());0 0 0]);
axis off
title('Mandelbrot set with MATLAB');
mandelbrot_test スクリプトを実行して、xlim と ylim の境界内にマンデルブロ集合をプロットします。
mandelbrot_test

GPU Coder アプリでのコードの生成
MATLAB ツールストリップの [アプリ] タブの [コード生成] セクションで、[GPU Coder] をクリックしてアプリを開きます。または、MATLAB コマンド ラインで次のように gpucoder と入力し、アプリを開きます。
gpucoder
アプリの [GPU Coder プロジェクトの作成] ダイアログ ボックスが開きます。新しい GPU Coder プロジェクトを作成するか、既存のプロジェクトを開くことができます。GPU Coder アプリは、.coderprj 拡張子でプロジェクトを保存します。名前を mandelbrot_count.coderprj として指定し、[OK] をクリックします。GPU Coder アプリの [GPU Coder] タブが開きます。このタブには、コード生成の準備、コードの生成、生成されたコードの実行、コード生成レポートを開くためのオプションが含まれています。

GPU Coder アプリは、次を含む [GPU Coder] パネルも開きます。
コード生成プロセスの次のステップをまとめた [次のステップ] セクション。
コード生成プロセスへの入力が含まれる [入力] セクション。
コード生成プロセスの出力をリストする [出力] セクション。このセクションは、コードを生成するときに表示されます。
[次のステップ] セクションでは、エントリポイント関数を追加する必要があることが示されています。

mandelbrot_count エントリポイント関数の追加
エントリポイント関数を追加するには、[GPU Coder] パネルで [エントリ ポイントの追加] をクリックします。または、ツールストリップで [エントリ ポイント] をクリックします。開いた [エントリ ポイント] ペインで、エントリポイント関数を mandelbrot_count として指定します。
入力の型を定義
GPU Coder は、コードを生成する前に、MATLAB コード内の変数のデータ型を判定しなければなりません。したがって、エントリポイント関数の入力変数のデータ型を指定しなければなりません。次のいずれかの方法を使用して入力データ型を指定できます。
プロジェクトのエントリポイント関数を呼び出すスクリプトを指定する
MATLAB コマンド ウィンドウのコマンドを使用してエントリポイント関数を実行する
手動で入力データ型を入力する
次の例では、スクリプト mandelbrot_test を使用して、mandelbrot_count の入力の型を定義しています。[エントリ ポイント] タブの [自動的に入力の型を定義] ドロップダウン メニューで、[Using Script] を選択します。スクリプト名 mandelbrot_test を入力し、[実行] ボタンをクリックします。アプリによって、次元とデータ型を含む入力の型が [エントリ ポイント] セクションに追加されます。

CUDA コードの生成
[GPU Coder] タブでは、GPU Coder で生成コードをビルドする方法を構成できます。[準備] セクションで、[出力タイプ] を [MEX] に設定します。
MEX ファイルを生成するには、[コードを生成してビルド] をクリックします。[GPU Coder] パネルの [出力] セクションには、コード生成が成功したこと、および生成されたコード フォルダーへのリンクとレポートへのリンクが表示されます。

生成されたコードと元の MATLAB 関数を比較するには、生成コードの正確性の検証を参照してください。