GPU Coder を使用した Simulink モデルからのコード生成
GPU Coder™ は、MATLAB Function ブロックを含む Simulink® モデルから、最適化された CUDA® コードを生成します。生成されたコードと実行可能ファイルを使用して、NVIDIA® GPU でのラピッド プロトタイピングを行うことができます。コード生成レポートとトレーサビリティによって、生成されたコードを表示して解析できます。GPU Coder を使用した CUDA コード生成の基本的な手順は次のとおりです。
モデルを作成するか開きます。
[ソルバー]、[言語]、[ツールチェーン] およびその他の GPU 固有のコンフィギュレーション パラメーターを選択して、コード生成用のモデルを構成します。
モデルをビルドします。
例:ソーベル エッジ検出
ソーベル エッジ検出アルゴリズムは、グレースケール イメージで 2 次元の空間勾配演算を行う、シンプルなエッジ検出アルゴリズムです。このアルゴリズムは、入力イメージのエッジに相当する空間周波数が高い領域を強調します。
ソーベル エッジ検出アルゴリズムは、2 つの直交フィルター カーネル (k
と k'
) を使用して、入力イメージの水平方向勾配 (H
) と垂直方向勾配 (V
) を計算します。このアルゴリズムは、フィルター処理演算を実行した後、勾配の大きさを計算してしきい値を適用し、エッジと考えられるイメージの領域を見つけます。
k = single([1 2 1; 0 0 0; -1 -2 -1]); H = conv2(single(grayImage),k, 'same'); V = conv2(single(grayImage),k','same'); E = sqrt(H.*H + V.*V); edgeImage = uint8((E > threshold) * 255);
エッジ検出モデルの作成
Simulink モデルを作成し、[User-Defined Functions] ライブラリから 2 つの MATLAB Function ブロックを挿入します。
Constant ブロックを追加して、その値を
0.4
に設定します。[Computer Vision Toolbox™] ライブラリから From Multimedia File ブロックを追加します。
From Multimedia File ブロックの [ブロック パラメーター] ダイアログ ボックスを開き、[ファイル名] パラメーターを
rhinos.avi
に設定します。[イメージ信号] パラメーターを
[1 つの多次元信号]
に設定します。[Computer Vision Toolbox] ライブラリから 2 つの Video Viewer ブロックをモデルに追加します。
MATLAB Function ブロックのうちの 1 つをダブルクリックします。既定の関数シグネチャが MATLAB Function ブロック エディターに表示されます。
ソーベル エッジ検出アルゴリズムを実装する、関数
sobel
を定義します。関数ヘッダーは、grayImage
およびthreshold
を関数sobel
の引数として宣言し、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
MATLAB Function ブロックのブロック パラメーターを開きます。[コード生成] タブで、[関数のパッケージ化] パラメーターについて
[再利用可能な関数]
を選択します。[関数のパッケージ化] パラメーターが他の値に設定されている場合、CUDA カーネルが生成されません。
他の MATLAB Function ブロックを変更して、ソーベル エッジ検出の演算の前に RGB からグレースケールへの変換を実装します。MATLAB 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
これらのブロックを、次の図に示すように接続します。モデルを
edgeDetection.slx
として保存します。モデルのエラーをテストするには、Simulink エディターでモデルをシミュレートします。ツールストリップで、[実行] をクリックします。
シミュレーション中にすべてのビデオ フレームを表示するには、Video Viewer ブロックの [シミュレーション]、[フレームを落として性能を改善] オプションを無効にします。
コード生成用のモデルの構成
モデル コンフィギュレーション パラメーターにより、コードの生成とビルドのプロセスのさまざまなオプションを指定できます。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを開きます。高速化のためにモデルをコンパイルし、CUDA コードを生成するには、固定ステップ ソルバーを使用するようにモデルを構成します。次の表に、この例のソルバー構成を示します。
パラメーター 設定 生成されたコードに対する影響 タイプ 固定ステップ
コード生成に必要である、一定の (固定) ステップ サイズを維持します。 ソルバー 離散 (連続状態なし)
モデルの状態微分の計算に固定ステップ積分手法を適用します。 固定ステップ サイズ auto
Simulink によりステップ サイズが選択されます。 [コード生成] ペインで、[システム ターゲット ファイル] を
[grt.tlc]
に設定します。Embedded Coder® のターゲット ファイル
[ert.tlc]
またはカスタムのシステム ターゲット ファイルも使用できます。GPU コード生成の場合、カスタム ターゲット ファイルは
[grt.tlc]
または[ert.tlc]
に基づいていなければなりません。カスタム ターゲット ファイルの開発については、システム ターゲット ファイルのカスタマイズ (Simulink Coder)を参照してください。[言語] を
[C++]
に設定します。[GPU コードの生成] を選択します。
[コード生成] ペインで、[コード生成のみ] を選択します。
[ツールチェーン] を選択します。Linux® プラットフォームの場合は
[NVIDIA CUDA | gmake (64-bit Linux)]
を選択します。Windows® システムの場合は[NVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows)]
を選択します。カスタムのシステム ターゲット ファイルを使用する場合は、ツールチェーン アプローチ用のビルド コントロールを設定しなければなりません。カスタム ターゲット用のツールチェーン アプローチの詳細については、カスタム ターゲットを使用したツールチェーン アプローチのサポート (Simulink Coder)を参照してください。
[コード生成]、[インターフェイス] ペインで、[MAT ファイルのログ] を無効にします。
[コード生成]、[レポート] ペインで [コード生成レポートを作成] と [レポートを自動的に開く] を選択します。
[GPU コードの生成] パラメーターを有効にすると、GPU Coder 固有のオプションが [コード生成]、[GPU コード] ペインに表示されます。
この例では、[コード生成]、[GPU コード] ペインで GPU 固有のパラメーターの既定値を使用できます。
[OK] をクリックして、[コンフィギュレーション パラメーター] ダイアログ ボックスを保存して閉じます。
関数
set_param
を使用して、モデル パラメーターの構成を MATLAB® コマンド ウィンドウでプログラムによって行うことができます。set_param('edgeDetection','GenerateGPUCode','CUDA');
モデルの CUDA コードの生成
Simulink エディターで、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 言語のすべてのデータ型がサポートされているわけではありません。サポートされているデータ型については、ブロックのドキュメンテーションを参照してください。
GPU コード生成の場合、カスタム ターゲット ファイルは
[grt.tlc]
または[ert.tlc]
に基づいていなければなりません。
参考
関数
open_system
(Simulink) |load_system
(Simulink) |save_system
(Simulink) |close_system
(Simulink) |bdclose
(Simulink) |get_param
(Simulink) |set_param
(Simulink) |sim
(Simulink) |slbuild
(Simulink)