このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
GPU Coder を使用した Simulink モデルからのコード生成
GPU Coder™ は、MATLAB Function ブロックを含む Simulink® モデルから、最適化された CUDA® コードを生成します。生成されたコードと実行可能ファイルを使用して、NVIDIA® GPU でのラピッド プロトタイピングを行うことができます。コード生成レポートとトレーサビリティによって、生成されたコードを表示して解析できます。
CUDA コードを生成するには、次のようにします。
モデルを作成するか開きます。アプリケーションの計算量の多い部分を MATLAB Function ブロックに移行します。
[ソルバー]、[言語]、およびその他の GPU 固有のコンフィギュレーション パラメーターを選択します。
モデルをビルドします。
ソーベル エッジ検出用の CUDA コードの生成
この例では、ソーベル エッジ検出モデル用の CUDA® コードを生成する方法を示します。エッジ検出モデルは、MATLAB Function ブロックを使用して検出アルゴリズムを実装します。
ソーベル エッジ検出
ソーベル エッジ検出アルゴリズムは、グレースケール イメージに対して 2 次元空間勾配演算を実行します。このアルゴリズムは、入力イメージのエッジに相当する空間周波数が高い領域を強調します。
ソーベル エッジ検出アルゴリズムは、2 つの直交フィルター カーネル k
と k'
を使用して、入力イメージの水平方向勾配 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
への入力引数として grayImage
と threshold
を宣言し、戻り値として 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]
に基づいていなければなりません。
参考
関数
open_system
(Simulink) |load_system
(Simulink) |save_system
(Simulink) |close_system
(Simulink) |bdclose
(Simulink) |get_param
(Simulink) |set_param
(Simulink) |sim
(Simulink) |slbuild
(Simulink)