Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

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

GPU Coder™ を使用すると、NVIDIA® GPU によって Simulink® モデルの実行を高速化できます。MATLAB® コードで記述されたアルゴリズムがある場合、MATLAB Function (Simulink) ブロックを使用してその MATLAB コードを Simulink モデルまたはサブシステムに組み込むことができます。MATLAB Function ブロックが含まれるモデルをシミュレーションするときに、ソフトウェアがそのブロックから CUDA® MATLAB 実行可能 (MEX) コードを生成して、生成されたコードが動的に Simulink にリンクされます。GPU Coder がサポートしているコード生成のワークフローの詳細については、GPU コード生成ワークフローを参照してください。

GPU を使用したシミュレーションの高速化の基本的なステップは、次のとおりです。

  • モデルを作成または開く

  • "ソルバー"、"言語"、およびその他の GPU 固有のコンフィギュレーション パラメーターを選択して、GPU による高速化のためのモデルを構成する

  • GPU により高速化されたモデルを実行する

例:ソーベル エッジ検出

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

ソーベル エッジ検出アルゴリズムは、2 つの直交フィルター カーネル (kk') を使用して、入力イメージの水平方向勾配 (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);

MATLAB peppers.png test image and its edge detected output.

エッジ検出モデルの作成

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

  2. Constant (Simulink) ブロックを追加して、その値を 0.4 に設定します。[Computer Vision Toolbox™] ライブラリから From Multimedia File (Computer Vision Toolbox) ブロックを追加します。

  3. From Multimedia File ブロックの [ブロック パラメーター] ダイアログを開き、[ファイル名] パラメーターを rhinos.avi に設定します。

    [イメージ信号] パラメーターを [1 つの多次元信号] に設定します。

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

    Simulink model containing blocks for implementing edge detection algorithm.

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

  6. ソーベル エッジ検出アルゴリズムを実装する、関数 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
    

  7. MATLAB Function ブロックを右クリックし、[ブロック パラメーター (Subsystem)] を選択します。

  8. [コード生成] タブで、[関数のパッケージ化] について [再利用可能な関数] を選択します。

  9. もう一方の MATLAB Function ブロックについて、手順 3 と 4 を繰り返します。このブロックは、ソーベル エッジ検出の演算の前に、RGB からグレースケールへの変換を実装します。

    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 として保存します。

    Simulink model showing connection between the blocks.

  11. エラーについてテストするために、ツールストリップの [実行] ボタンを使用して、Simulink エディターでモデルをシミュレーションします。シミュレーション中にすべてのビデオ フレームを表示するには、Video Viewer ブロックの [シミュレーション]、[フレームを落として性能を改善] オプションを無効にします。

    Edge detected output from the Video Viewer block.

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

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

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

    パラメーター設定生成されたコードに対する影響
    タイプ固定ステップコード生成に必要である、一定の (固定) ステップ サイズを維持します。
    ソルバー離散 (連続状態なし)モデルの状態微分の計算に固定ステップ積分手法を適用します。
    固定ステップ サイズautoSimulink によりステップ サイズが選択されます。

    Snapshot of the configuration parameters dialog showing solver options for simulation.

  2. [シミュレーション ターゲット] ペインを選択します。[GPU による高速化] を選択します。

    メモ

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

  3. GPU Coder 固有のオプションが、[シミュレーション ターゲット]、[GPU による高速化] ペインに表示されます。この例の目的上、これらのパラメーターの既定値を使用できます。

    GPU Acceleration pane on the configuration parameters dialog of the model.

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

  5. 別の方法として、set_param (Simulink) を使用して、MATLAB コマンド ウィンドウからモデル パラメーターをプログラムで構成することもできます。次に例を示します。

    set_param('edgeDetection','GPUAcceleration','on');
    

GPU により高速化されたモデルのビルド

GPU により高速化されたモデルをビルドしてシミュレートするために、[シミュレーション] タブの [実行] を選択するか、次のコマンドを実行することによってモデルを開始できます。

sim('edgeDetection');

上記を MATLAB プロンプトで実行します。

Edge detected output from the Video Viewer block.

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

制限

  • Stateflow® チャートでの MATLAB Function ブロックの使用はサポートされていません。

  • [GPU による高速化] が有効な場合、コード ジェネレーターでは、カスタム作成された CUDA ソース ファイル (*.cu) のインポートに対する [カスタム コードのインポート] はサポートされません。代わりに、MATLAB Function ブロック内で coder.ceval を使用します。

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

参考

関数

関連するトピック