メインコンテンツ

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 の呼び出しの例です。このコードを実行したときの出力は異なる場合があります。

マンデルブロ エントリポイント関数の確認

マンデルブロ集合とは、値 z0 で構成された複素平面の領域であり、この値は

zk+1=zk2+z0,k=0,1,...

で定義された軌跡が k のときに有限の範囲内にとどまるときの値です。次の図はマンデルブロ集合の全体的な幾何形状を示しています。このビューは、集合の境界の外側周辺の詳しい構造を示すほどの解像度ではありません。

The Mandelbrot set.

mandelbrot_count_start.m エントリポイント関数には、Experiments with MATLAB (Cleve Moler 著) のコードに基づく、マンデルブロ集合のベクトル化済みの実装が含まれています。

type mandelbrot_count_start.m
function 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.m
function 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 スクリプトは、範囲 xlimylim の間に実数部と虚数部から成る 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 スクリプトを実行して、xlimylim の境界内にマンデルブロ集合をプロットします。

mandelbrot_test

Figure contains an axes object. The hidden axes object with title Mandelbrot set with MATLAB contains an object of type image.

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 tab of the MATLAB toolstrip

GPU Coder アプリは、次を含む [GPU Coder] パネルも開きます。

  • コード生成プロセスの次のステップをまとめた [次のステップ] セクション。

  • コード生成プロセスへの入力が含まれる [入力] セクション。

  • コード生成プロセスの出力をリストする [出力] セクション。このセクションは、コードを生成するときに表示されます。

[次のステップ] セクションでは、エントリポイント関数を追加する必要があることが示されています。

GPU Coder panel showing the first step is to add an entry-point function

mandelbrot_count エントリポイント関数の追加

エントリポイント関数を追加するには、[GPU Coder] パネルで [エントリ ポイントの追加] をクリックします。または、ツールストリップで [エントリ ポイント] をクリックします。開いた [エントリ ポイント] ペインで、エントリポイント関数を mandelbrot_count として指定します。

入力の型を定義

GPU Coder は、コードを生成する前に、MATLAB コード内の変数のデータ型を判定しなければなりません。したがって、エントリポイント関数の入力変数のデータ型を指定しなければなりません。次のいずれかの方法を使用して入力データ型を指定できます。

  • プロジェクトのエントリポイント関数を呼び出すスクリプトを指定する

  • MATLAB コマンド ウィンドウのコマンドを使用してエントリポイント関数を実行する

  • 手動で入力データ型を入力する

次の例では、スクリプト mandelbrot_test を使用して、mandelbrot_count の入力の型を定義しています。[エントリ ポイント] タブの [自動的に入力の型を定義] ドロップダウン メニューで、[Using Script] を選択します。スクリプト名 mandelbrot_test を入力し、[実行] ボタンをクリックします。アプリによって、次元とデータ型を含む入力の型が [エントリ ポイント] セクションに追加されます。

Entry Points pane showing the data types and dimensions of the inputs to mandelbrot_count

CUDA コードの生成

[GPU Coder] タブでは、GPU Coder で生成コードをビルドする方法を構成できます。[準備] セクションで、[出力タイプ][MEX] に設定します。

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

Output section of the GPU Coder panel

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

参考

アプリ

関数

オブジェクト

トピック