Main Content

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

GPU Coder を使用した Simulink モデルからのコード生成

GPU Coder™ は、MATLAB Function ブロックを含む Simulink® モデルから、最適化された CUDA® コードを生成します。生成されたコードと実行可能ファイルを使用して、NVIDIA® GPU でのラピッド プロトタイピングを行うことができます。コード生成レポートとトレーサビリティによって、生成されたコードを表示して解析できます。GPU Coder を使用した CUDA コード生成の基本的な手順は次のとおりです。

  • モデルを作成するか開きます。

  • [ソルバー][言語][ツールチェーン] およびその他の 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 ブロックを追加して、その値を 0.4 に設定します。

  3. [Computer Vision Toolbox™] ライブラリから From Multimedia File ブロックを追加します。

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

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

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

    Simulink model containing blocks for implementing edge detection algorithm.

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

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

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

    [関数のパッケージ化] パラメーターが他の値に設定されている場合、CUDA カーネルが生成されません。

  9. 他の 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
  10. これらのブロックを、次の図に示すように接続します。モデルを edgeDetection.slx として保存します。

    Simulink model showing connection between the blocks.

  11. モデルのエラーをテストするには、Simulink エディターでモデルをシミュレートします。ツールストリップで、[実行] をクリックします。

    シミュレーション中にすべてのビデオ フレームを表示するには、Video Viewer ブロックの [シミュレーション]、[フレームを落として性能を改善] オプションを無効にします。

    Edge detected output from the Video Viewer block.

コード生成用のモデルの構成

モデル コンフィギュレーション パラメーターにより、コードの生成とビルドのプロセスのさまざまなオプションを指定できます。

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

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

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

  2. [コード生成] ペインで、[システム ターゲット ファイル][grt.tlc] に設定します。

    Embedded Coder® のターゲットファイル [ert.tlc] を使用することもできます。

  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)] を選択します。

  7. [コード生成]、[インターフェイス] ペインで、[MAT ファイルのログ] を無効にします。

  8. [コード生成]、[レポート] ペインで [コード生成レポートを作成][レポートを自動的に開く] を選択します。

  9. [GPU コードの生成] パラメーターを有効にすると、GPU Coder 固有のオプションが [コード生成]、[GPU コード] ペインに表示されます。

    この例では、[コード生成]、[GPU コード] ペインで GPU 固有のパラメーターの既定値を使用できます。

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

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

    関数 set_param を使用して、モデル パラメーターの構成を MATLAB® コマンド ウィンドウでプログラムによって行うことができます。

    set_param('edgeDetection','GenerateGPUCode','CUDA');
    

モデルの CUDA コードの生成

  1. Simulink エディターで、Simulink Coder アプリを開きます。

  2. コードを生成します。

診断ビューアーにメッセージが表示されます。コード ジェネレーターにより、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 言語のすべてのデータ型がサポートされているわけではありません。サポートされているデータ型については、ブロックのドキュメンテーションを参照してください。

参考

関数

関連するトピック