Main Content

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

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

GPU Coder™ は、MATLAB Function ブロックを含む Simulink® モデルから CUDA® C++ コードを生成します。生成されたコードと実行可能ファイルは、NVIDIA® Tesla®NVIDIA Tegra® などの 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 モデルを作成し、[ユーザー定義関数] ライブラリから 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 ブロックの [シミュレーション]、[Drop Frames to improve Performance] オプションを無効にします。

    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 コードの生成] を選択します。GPU Coder 固有のオプションが、[コード生成]、[GPU コード] ペインに表示されます。

  5. [コード生成のみ] を選択します。

  6. [ツールチェーン] を選択します。Linux® プラットフォームの場合は [NVIDIA CUDA | gmake (64-bit Linux)] を選択します。Windows® システムの場合は [NVIDIA CUDA (w/Microsoft Visual C++ 20XX) | nmake (64-bit windows)] を選択します。

  7. [コード生成]、[インターフェイス] ペインで、[MAT ファイルのログ] を無効にします。コード ジェネレーターでは、CUDA コードの生成時に MAT ファイルのログをサポートしません。

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

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

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

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

  11. 別の方法として、set_param (Simulink) を使用して、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 つの連続する山形かっこで囲まれている情報が、カーネルの実行コンフィギュレーションです。

  3. 生成された CUDA コードの例を示します。

     edgeDetection.cu

制限

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

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

参考

関数

関連するトピック