Main Content

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

GPU Coder を使用した Simulink モデルからのコード生成

GPU Coder™ は、MATLAB Function ブロックを含む Simulink® モデルから、最適化された CUDA® コードを生成します。生成されたコードと実行可能ファイルを使用して、NVIDIA® GPU でのラピッド プロトタイピングを行うことができます。コード生成レポートとトレーサビリティによって、生成されたコードを表示して解析できます。

CUDA コードを生成するには、次のようにします。

  • モデルを作成するか開きます。アプリケーションの計算量の多い部分を MATLAB Function ブロックに移行します。

  • [ソルバー][言語]、およびその他の GPU 固有のコンフィギュレーション パラメーターを選択します。

  • モデルをビルドします。

ソーベル エッジ検出用の CUDA コードの生成

この例では、ソーベル エッジ検出モデル用の CUDA® コードを生成する方法を示します。エッジ検出モデルは、MATLAB Function ブロックを使用して検出アルゴリズムを実装します。

ソーベル エッジ検出

ソーベル エッジ検出アルゴリズムは、グレースケール イメージに対して 2 次元空間勾配演算を実行します。このアルゴリズムは、入力イメージのエッジに相当する空間周波数が高い領域を強調します。

ソーベル エッジ検出アルゴリズムは、2 つの直交フィルター カーネル kk' を使用して、入力イメージの水平方向勾配 H と垂直方向勾配 V を計算します。このアルゴリズムは、フィルター処理演算を実行した後、勾配の大きさを計算してしきい値を適用し、エッジと考えられるイメージの領域を見つけます。

img = imread('peppers.png');
threshold = 100;
k = single([1 2 1; 0 0 0; -1 -2 -1]);
H = conv2(img(:,:,2),k, 'same');
V = conv2(img(:,:,2),k','same');
E = sqrt(H.*H + V.*V);
edgeImage = uint8((E > threshold) * 255);

h = figure;
h.Position(3) = 2*h.Position(3);
ax1 = subplot(1,2,1);
ax2 = subplot(1,2,2);

image(ax1,img);
xticks(ax1,[]);
yticks(ax1,[])
title(ax1,'Test Image')

image(ax2,repmat(edgeImage,[1 1 3]));
xticks(ax2,[]);
yticks(ax2,[])
title(ax2,'Edge Detected Image')

エッジ検出モデルの作成

1.Simulink モデルを作成し、User-Defined Functions ライブラリから 2 つの MATLAB Function ブロックを挿入します。

2.Constant ブロックを追加し、その値を 0.4 に設定します。

3.Computer Vision Toolbox™ ライブラリから From Multimedia File ブロックを追加します。

4.From Multimedia File ブロックを開き、[ファイル名] パラメーターを rhinos.avi に設定します。[イメージ信号] パラメーターを [One multidimensional signal] に設定します。

5.Computer Vision Toolbox ライブラリから 2 つの Video Viewer ブロックをモデルに追加します。

これらのブロックが含まれたモデルを開くには、次のように入力します。

open_system("edgeDetectionInitial")

6.MATLAB Function ブロックの 1 つをダブルクリックします。既定の関数シグネチャが MATLAB Function ブロック エディターに表示されます。

7.ソーベル エッジ検出アルゴリズムを実装する関数 sobel を定義します。関数ヘッダーは、関数 sobel への入力引数として grayImagethreshold を宣言し、戻り値として edgeImage を宣言します。

エディター ドキュメントを保存します。

function edgeImage  = sobel(grayImage,threshold)   %#codegen
% Define Kernel for Sobel edge detection
k = single([1 2 1; 0 0 0; -1 -2 -1]);
% Detect Edge
H = conv2(single(grayImage),k, 'same');
V = conv2(single(grayImage),k','same');
E = sqrt(H.*H + V.*V);
edgeImage = uint8((E > threshold) * 255);
end

8.MATLAB Function ブロックのブロック パラメーターを開きます。[コード生成] タブで、[関数のパッケージ化] パラメーターを [Reusable function] に設定します。[関数のパッケージ化] パラメーターが他の値に設定されている場合、CUDA カーネルが生成されない可能性があります。

9.他の MATLAB Function ブロックを変更して、RGB からグレースケールへの変換を実装します。MATLAB Function ブロックの [関数のパッケージ化] パラメーターを [Reusable function] に設定します。

function gray = RGB2gray(RGB)   %#codegen
% Convert color image to grey image
gray = (0.2989 * double(RGB(:,:,1)) + ...
        0.5870 * double(RGB(:,:,2)) + ...
        0.1140 * double(RGB(:,:,3)));
end

10.これらのブロックを、次の図に示すように接続します。モデルを edgeDetection.slx として保存します。事前構成済みのモデルを開くには、次のように入力します。

open_system("edgeDetection");

11.モデルのエラーをテストするには、モデルをシミュレートします。ツールストリップで、[実行] をクリックします。

シミュレーション中にすべてのビデオ フレームを表示するには、Video Viewer ブロックを開き、[シミュレーション]、[フレームを落として性能を改善] を無効にします。

set_param('edgeDetection', 'SimulationMode', 'Normal');
sim('edgeDetection');

コード生成用のモデルの構成

モデル コンフィギュレーション パラメーターにより、コードの生成とビルドのプロセスのオプションを指定できます。

1.[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを開きます。高速化のためにモデルをコンパイルし、CUDA コードを生成するには、固定ステップ ソルバーを使用するようにモデルを構成します。次の表に、この例のソルバー構成を示します。

2.左側のペインで [コード生成] をクリックし、[システム ターゲット ファイル][grt.tlc] に設定します。

Embedded Coder® のターゲット ファイル [ert.tlc] またはカスタムのシステム ターゲット ファイルも使用できます。

GPU コード生成の場合、カスタム ターゲット ファイルは [grt.tlc] または [ert.tlc] に基づいていなければなりません。カスタム ターゲット ファイルの開発については、システム ターゲット ファイルのカスタマイズ (Simulink Coder)を参照してください。

3.[言語]C++ に設定します。

4.[GPU コードの生成] を選択します。

5.[コード生成のみ] を選択します。

6.[ツールチェーン] を選択します。Linux® プラットフォームの場合は、NVIDIA CUDA | gmake (64-bit Linux) を選択します。Windows® システムの場合は、NVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows) を選択します。

カスタムのシステム ターゲット ファイルを使用する場合は、ツールチェーン アプローチ用のビルド コントロールを設定しなければなりません。カスタム ターゲット用のツールチェーン アプローチの詳細については、カスタム ターゲットを使用したツールチェーン アプローチのサポート (Simulink Coder)を参照してください。

7.[コード生成]、[インターフェイス] をクリックし、[MAT ファイルのログ] を無効にします。

8.[コード生成]、[レポート] をクリックし、[コード生成レポートを作成][レポートを自動的に開く] を選択します。

9.必要に応じて、[コード生成]、[GPU コード] を開いて、GPU 固有のオプションを表示および編集します。この例では、これらのパラメーターの既定値を使用できます。

10.[OK] をクリックして、[コンフィギュレーション パラメーター] ダイアログ ボックスを保存して閉じます。

あるいは、関数 set_param を使用して、モデル パラメーターの構成をプログラムで行います。たとえば、[GPU コードの生成] パラメーターを設定するには、次のように入力します。

set_param('edgeDetection','GenerateGPUCode','CUDA');

モデルの CUDA コードの生成

1.Simulink Coder アプリを開き、[コード生成] をクリックします。

診断ビューアーにメッセージが表示されます。コード ジェネレーターにより、CUDA ソース ファイルおよびヘッダー ファイルと HTML コード生成レポートが作成されます。コード ジェネレーターは実行可能ファイルをビルド フォルダー (現在の作業フォルダーの中の edgeDetection_grt_rtw という名前のサブフォルダー) に配置します。

関数 model_name_eML_blk_kernel および model_name_eML_blk_kernel_c で CUDA カーネルを見つけることができます。3 つの連続する山形かっこで囲まれている情報が、カーネルの実行コンフィギュレーションです。

制限

  • Stateflow® チャートでの MATLAB Function 用の GPU コード生成はサポートされていません。

  • MATLAB Function ブロックでは、MATLAB® 言語のすべてのデータ型がサポートされているわけではありません。サポートされているデータ型については、MATLAB Function (Simulink) を参照してください。

  • GPU コード生成の場合、カスタム ターゲット ファイルは [grt.tlc] または [ert.tlc] に基づいていなければなりません。

参考

関数

関連するトピック