GPU Coder を使用したシミュレーションの高速化
GPU Coder™ を使用すると、NVIDIA® GPU での Simulink® モデルの実行を高速化できます。GPU 高速化コンピューティングは異種混合プログラミング モデルに従います。アプリケーションの高度に並列化できる部分は数千個の GPU コアで並列実行されるカーネルにマッピングされ、逐次コードの残りの部分はそのまま CPU で実行されます。
GPU による高速化を使用したシミュレーションを実行するには、MATLAB Function (Simulink) ブロックを使用して、アプリケーションの計算量が多い部分を Simulink でモデル化します。MATLAB Function ブロックを含むモデルをシミュレートすると、ソフトウェアによって CUDA® MATLAB® 実行可能 (MEX) コードの分割と生成が行われ、このコードが Simulink モデルと統合されます。
GPU Coder を使用したシミュレーションの高速化の基本的なステップは、次のとおりです。
モデルを作成するか開きます。
[ソルバー]、[言語]、およびその他の GPU 固有のコンフィギュレーション パラメーターを選択して、GPU による高速化のためのモデルを構成します。
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 ブロックの [シミュレーション]、[フレームを落として性能を改善] オプションを無効にします。
GPU による高速化のためのモデルの構成
モデル コンフィギュレーション パラメーターにより、シミュレーション中に使用される高速化の方法が決定します。
[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを開きます。高速化のためにモデルをコンパイルし、CUDA コードを生成するには、固定ステップ ソルバーを使用するようにモデルを構成します。次の表に、この例のソルバー構成を示します。
パラメーター 設定 生成されたコードに対する影響 タイプ 固定ステップ
一定の (固定) ステップ サイズを維持します。 ソルバー 離散 (連続状態なし)
モデルの状態微分の計算に固定ステップ積分手法を適用します。 固定ステップ サイズ auto
Simulink によりステップ サイズが選択されます。 [シミュレーション ターゲット] ペインで [GPU による高速化] パラメーターを有効にします。
メモ
[言語] パラメーターが自動的に
[C++]
に設定されます。GPU Coder 固有のオプションが、[シミュレーション ターゲット]、[GPU による高速化] ペインに表示されます。この例の目的上、すべての GPU 固有パラメーターに既定値を使用できます。
[コンフィギュレーション パラメーター] ダイアログ ボックスを保存して閉じるには、[OK] をクリックします。
set_param
(Simulink) を使用して、モデル パラメーターの構成を MATLAB コマンド ウィンドウでプログラムによって行うこともできます。set_param('edgeDetection','GPUAcceleration','on');
GPU による高速化を使用するモデルのビルド
GPU による高速化を使用するモデルをビルドしてシミュレートするには、[シミュレーション] タブで [実行] を選択するか、次の MATLAB コマンドを使用します。
sim('edgeDetection');
ソフトウェアはまず、CUDA コードがそのモデル用に以前にコンパイルされているかどうかを確認します。コードが以前に作成されている場合は、ソフトウェアがモデルを実行します。コードが以前にビルドされていない場合は、ソフトウェアはまず CUDA コードを生成およびコンパイルし、その後モデルを実行します。コード生成ツールは、生成されたコードを slprj/_slprj/edgeDetection
という名前の作業フォルダーのサブフォルダーに配置します。
制限
Stateflow® チャートでの MATLAB Function ブロック用の GPU コード生成はサポートされていません。
[GPU による高速化] が有効な場合、コード ジェネレーターでは、カスタム作成された CUDA ソース ファイル (*.cu) のインポートに対する [カスタム コードのインポート] はサポートされません。代わりに、MATLAB Function ブロック内で
coder.ceval
を使用します。MATLAB Function ブロックでは、MATLAB 言語のすべてのデータ型がサポートされているわけではありません。サポートされているデータ型については、ブロックのドキュメンテーションを参照してください。
参考
関数
open_system
(Simulink) |load_system
(Simulink) |save_system
(Simulink) |close_system
(Simulink) |bdclose
(Simulink) |get_param
(Simulink) |set_param
(Simulink) |sim
(Simulink) |slbuild
(Simulink)