メインコンテンツ

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

GPU Coder™ を使用すると、MATLAB Function ブロックを含む Simulink® モデルから、最適化された CUDA® コードを生成できます。生成されたコードと実行可能ファイルを使用して、NVIDIA® GPU でのラピッド プロトタイピングを行うことができます。コード生成レポートとトレーサビリティによって、生成されたコードを表示して解析できます。コード生成レポートの詳細については、コード生成レポート (Simulink Coder)を参照してください。

生成コード内に CUDA カーネルを作成するには、アプリケーションの計算量の多い部分に MATLAB Function ブロックを使用するようにモデルを設計します。コード生成の過程で、GPU Coder は MATLAB® 関数を解析し、計算を GPU のカーネルにマッピングしようと試みます。

CUDA コードを生成するには、次のようにします。

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

  2. モデルのコンフィギュレーション パラメーター [ソルバー][タイプ] を、固定ステップ ソルバーを使用するように設定します。

  3. Windows® または Linux® オペレーティング システムのハードウェア実装パラメーターを設定します。

  4. コード生成の [言語] パラメーターを [C++] に設定し、[GPU コードの生成] パラメーターを有効にします。

  5. 必要に応じて、その他の GPU 固有のコンフィギュレーション パラメーターを設定します。

  6. Simulink Coder™ アプリまたは slbuild 関数を使用してモデルをビルドします。

ソーベル エッジ検出用の CUDA コードの生成

この例では、ソーベル エッジ検出モデル用の CUDA® コードを生成する方法を示します。このモデル例では、MATLAB Function ブロックを使用して検出アルゴリズムを実装します。GPU コード生成を有効にするようにモデルを設定し、エッジ検出アルゴリズム用の CUDA コードを生成します。

ソーベル エッジ検出アルゴリズムの検証

この例では、グレースケール イメージに対して 2 次元空間勾配演算を使用してソーベル エッジ検出を実行するモデルを作成します。このアルゴリズムは、入力イメージのエッジに相当する空間周波数が高い領域を強調します。

ソーベル エッジ アルゴリズムは、2 つの直交フィルター カーネル kk' を使用して、入力イメージの水平方向勾配 H と垂直方向勾配 V を計算します。このアルゴリズムは、フィルター処理演算を実行した後、勾配の大きさを計算してしきい値を適用し、エッジと考えられるイメージの領域を見つけます。

イメージ ファイル peppers.pngimg という名前の変数に読み込みます。

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);

MATLAB を使用して、結果イメージを元のイメージの横にプロットします。

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.上のモデルで、sobel 関数の MATLAB Function ブロックを右クリックします。コンテキスト メニューの [パラメーター] セクションで、[ブロック パラメーター] ボタンをクリックします。[コード生成] タブで、[関数のパッケージ化] パラメーターを [Reusable function] に設定します。[関数のパッケージ化] パラメーターが上記以外の値の場合、GPU Coder によって CUDA カーネルが生成されない可能性があります。

9.他の MATLAB Function ブロックを変更して、RGB からグレースケールへの変換を実装します。MATLAB Function ブロックの [関数のパッケージ化] パラメーターを [Reusable function] に設定します。

function gray = RGB2gray(RGB)   %#codegen
% Convert color image to gray 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.モデルのエラーをテストするには、モデルをシミュレートします。Simulink ツールストリップで、[実行] をクリックします。あるいは、次のコードを入力します。

set_param("edgeDetection","SimulationMode","Normal");
sim("edgeDetection");

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

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

モデルからコードを生成するには、モデル コンフィギュレーション パラメーターを設定して、ホスト コンピューター上でコードを生成するようにします。GPU コード生成を有効にし、ビルド プロセスをカスタマイズします。

1.[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。[ソルバー] ペインを開きます。CUDA コードを生成するには、固定ステップ ソルバーを使用するようにモデルを構成します。[タイプ] パラメーターを Fixed-step に、[ソルバー] パラメーターを discrete (no continuous states) に設定します。

2.左側のペインで、[ハードウェア実行] をクリックします。ホスト マシンの [デバイス タイプ] パラメーターを設定します。Linux プラットフォームの場合は、[デバイス タイプ]x86-64 (Linux 64) に設定します。Windows® システムの場合は、x86-64 (Windows64) を選択します。

3.[デバイスの詳細] セクションで、[long long のサポート] を選択します。

4.左側のペインで [コード生成] をクリックし、[システム ターゲット ファイル][grt.tlc] に設定します。Embedded Coder® のターゲット ファイル [ert.tlc] またはカスタムのシステム ターゲット ファイルも使用できます。カスタム ターゲット ファイルの開発については、システム ターゲット ファイルのカスタマイズ (Simulink Coder)を参照してください。

5.[言語]C++ に設定します。

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

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

8.[ツールチェーン] パラメーターを設定します。Linux® プラットフォームの場合、このパラメーターを NVIDIA CUDA | gmake (64-bit Linux) に設定します。Windows® システムの場合、このパラメーターを NVIDIA CUDA(w/Microsoft Visual C++ 2022) | nmake (64-bit windows) に設定します。あるいは、お使いの Microsoft Visual C++ のバージョンに合った NVIDIA CUDA 設定を使用します。

カスタムのシステム ターゲット ファイルを使用する場合は、ツールチェーン アプローチ用のビルド コントロールを設定しなければなりません。詳細については、カスタム ターゲットを使用したツールチェーン アプローチのサポート (Simulink Coder)を参照してください。

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

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

必要に応じて、[コード生成]、[GPU コード] ペインを開き、GPU 固有のオプションを表示および編集します。この例では、これらのパラメーターの既定値を使用します。

あるいは、関数 set_param を使用して、モデル パラメーターの構成をプログラムで行います。たとえば、set_param を使用して CUDA コード生成を有効にします。

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

オペレーティング システムによっては、set_param を使用してハードウェア コンフィギュレーション パラメーターを設定することもできます。set_param を使用して、適切な OS の ProdHWDeviceType を設定し、long long データ型のサポートを有効にします。

if ispc
    set_param("edgeDetection","ProdHWDeviceType","Intel->x86-64 (Windows64)")
elseif isunix
    set_param("edgeDetection","ProdHWDeviceType","Intel->x86-64 (Linux 64)")
end
set_param("edgeDetection","ProdLongLongMode","on");

モデルの CUDA コードの生成

コードを生成するには、Simulink ツールストリップで [アプリ] タブを開きます。[コード生成] の下にある [Simulink Coder] をクリックします。[C++ コード] タブで、[コード生成] をクリックします。あるいは、slbuild 関数を使用してモデルをビルドすることもできます。

slbuild("edgeDetection");
### Unable to find Simulink cache file "edgeDetection.slxc".
### Searching for referenced models in model 'edgeDetection'.
### Total of 1 models to build.
### Starting build procedure for: edgeDetection
### Generating code and artifacts to 'Model specific' folder structure
### Generating code into build folder: C:\Users\user\OneDrive - MathWorks\Documents\MATLAB\ExampleManager\user.Bdoc\gpucoder-ex36902800\edgeDetection_grt_rtw
### Invoking Target Language Compiler on edgeDetection.rtw
### Using System Target File: A:\12\user.Bdoc.j3111876\runnable\matlab\rtw\c\grt\grt.tlc
### Loading TLC function libraries
........
### Initial pass through model to cache user defined code
.
### Caching model source code
...............................................................................
### Writing header file edgeDetection_types.h
### Writing source file edgeDetection.cu
### Writing header file edgeDetection_private.h
### Writing header file edgeDetection.h
.
### Writing header file rtwtypes.h
### Writing header file multiword_types.h
### Writing header file rtmodel.h
### Writing source file edgeDetection_data.cu
### TLC code generation complete (took 14.063s).
### Creating HTML report file <a href="matlab:rtw.report.open('edgeDetection','C:\Users\user\OneDrive - MathWorks\Documents\MATLAB\ExampleManager\user.Bdoc\gpucoder-ex36902800\edgeDetection_grt_rtw')">index.html</a>
### Saving binary information cache.
Warning: In build information, source files (edgeDetection.cu,
edgeDetection_data.cu) have extensions that are not registered with toolchain
(MinGW64 | gmake (64-bit Windows)). Registered file extensions are .c, .cpp,
.cc, .cp, .cxx, .CPP, .c++, .C. Register source file extensions by updating
toolchain definition or change source file names. 
### Using toolchain: MinGW64 | gmake (64-bit Windows)
### Creating 'C:\Users\user\OneDrive - MathWorks\Documents\MATLAB\ExampleManager\user.Bdoc\gpucoder-ex36902800\edgeDetection_grt_rtw\edgeDetection.mk' ...
### Successful completion of code generation for: edgeDetection
### Simulink cache artifacts for 'edgeDetection' were created in 'C:\Users\user\OneDrive - MathWorks\Documents\MATLAB\ExampleManager\user.Bdoc\gpucoder-ex36902800\edgeDetection.slxc'.

Build Summary

Top model targets:

Model          Build Reason                                         Status           Build Duration
===================================================================================================
edgeDetection  Information cache folder or artifacts were missing.  Code generated.  0h 1m 42.321s

1 of 1 models built (0 models already up to date)
Build duration: 0h 1m 46.553s

コード ジェネレーターにより、CUDA ソース ファイルおよびヘッダー ファイルと HTML コード生成レポートが作成されます。コード ジェネレーターは、ビルド フォルダー (現在の作業フォルダー内の edgeDetection_grt_rtw という名前のサブフォルダー) にファイルを配置します。

制限

  • GPU Coder は、Stateflow® チャートでの MATLAB 関数用の GPU コード生成をサポートしていません。

  • MATLAB Function ブロックは、MATLAB 言語の一部のデータ型をサポートしていません。サポートされているデータ型については、MATLAB Function (Simulink) を参照してください。

  • GPU コード生成の場合、カスタム ターゲット ファイルは [grt.tlc] または [ert.tlc] に基づいていなければなりません。

参考

関数

ブロック

トピック