Main Content

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

GPU Coder を使用したシミュレーション速度の高速化

GPU Coder™ を使用すると、MATLAB Function (Simulink) ブロックを含む Simulink® モデルの実行を高速化できます。GPU による高速化を使用したシミュレーションは、Deep Learning Toolbox™ の Deep Neural Networks ライブラリまたは Computer Vision Toolbox™ の Analysis and Enhancement ライブラリのブロックを含むモデルでも動作します。GPU による高速化を使用したシミュレーションには、CUDA® 対応の NVIDIA® GPU が必要です。

GPU による高速化を使用したシミュレーションを有効にすると、ソフトウェアは MATLAB Function ブロックから CUDA MATLAB® 実行可能 (MEX) コードを分割して生成し、シミュレーション時に生成コードを Simulink に動的にリンクします。生成コードには、数千の GPU コアで並列実行される CUDA カーネルが含まれています。また、CPU で実行されるコードの連続したセクションも含まれています。

GPU による高速化を使用したシミュレーションを実行するには、次のようにします。

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

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

  • GPU による高速化を使用するモデルを実行します。

ソーベル エッジ検出の高速化

この例では、ソーベル エッジ検出モデルについて、GPU による高速化を使用したシミュレーションを実行する方法を示します。エッジ検出モデルは、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');

GPU による高速化のためのモデルの構成

モデル コンフィギュレーション パラメーターにより、シミュレーション中に使用される高速化の方法が決まります。

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

2.左側のペインで、[シミュレーション ターゲット] をクリックし、[GPU による高速化] パラメーターを有効にします。

メモ: [言語] パラメーターが自動的に [C++] に設定されます。

3.必要に応じて、[シミュレーション ターゲット]、[GPU による高速化] をクリックして、GPU 固有のオプションを表示および変更します。この例では、これらすべてのパラメーターに既定値を使用できます。

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

あるいは、関数 set_param を使用して、モデル パラメーターの構成を MATLAB コマンド ウィンドウでプログラムによって行います。

set_param('edgeDetection','SolverType','Fixed-step');
set_param('edgeDetection','SolverName','FixedStepDiscrete');
set_param('edgeDetection','FixedStep','auto');
set_param('edgeDetection','GPUAcceleration','on');

GPU による高速化を使用するモデルのビルド

GPU による高速化を使用するモデルをビルドしてシミュレートするには、[実行] をクリックするか、次のコマンドを使用します。

sim('edgeDetection');

ソフトウェアはまず、CUDA コードがそのモデル用に以前にコンパイルされているかどうかを確認します。コードが以前に作成されている場合は、ソフトウェアがモデルを実行します。コードが以前にビルドされていない場合は、ソフトウェアはまず CUDA コードを生成およびコンパイルし、その後モデルを実行します。コード生成ツールは、生成されたコードを slprj/_slprj/edgeDetection という名前の作業フォルダーのサブフォルダーに配置します。

制限

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

  • [GPU による高速化] を有効にした場合、[シミュレーション ターゲット]、[詳細設定パラメーター]、[カスタム コードのインポート] パラメーターを使用してカスタム CUDA ソース ファイル (*.cu) をインポートすることはできません。代わりに、MATLAB Function ブロック内で coder.ceval を使用します。

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

参考

関数

関連するトピック