GPU Coder を使用した Simulink モデルからのコード生成
GPU Coder™ を使用すると、MATLAB Function ブロックを含む Simulink® モデルから、最適化された CUDA® コードを生成できます。生成されたコードと実行可能ファイルを使用して、NVIDIA® GPU でのラピッド プロトタイピングを行うことができます。コード生成レポートとトレーサビリティによって、生成されたコードを表示して解析できます。コード生成レポートの詳細については、コード生成レポート (Simulink Coder)を参照してください。
生成コード内に CUDA カーネルを作成するには、アプリケーションの計算量の多い部分に MATLAB Function ブロックを使用するようにモデルを設計します。コード生成の過程で、GPU Coder は MATLAB® 関数を解析し、計算を GPU のカーネルにマッピングしようと試みます。
CUDA コードを生成するには、次のようにします。
モデルを作成するか開きます。計算量の多いアプリケーション部分を MATLAB Function ブロックで設計してモデルを作成します。
モデルのコンフィギュレーション パラメーター [ソルバー] と [タイプ] を、固定ステップ ソルバーを使用するように設定します。
Windows® または Linux® オペレーティング システムのハードウェア実装パラメーターを設定します。
コード生成の [言語] パラメーターを
[C++]に設定し、[GPU コードの生成] パラメーターを有効にします。必要に応じて、その他の GPU 固有のコンフィギュレーション パラメーターを設定します。
Simulink Coder™ アプリまたは
slbuild関数を使用してモデルをビルドします。
ソーベル エッジ検出用の CUDA コードの生成
この例では、ソーベル エッジ検出モデル用の CUDA® コードを生成する方法を示します。このモデル例では、MATLAB Function ブロックを使用して検出アルゴリズムを実装します。GPU コード生成を有効にするようにモデルを設定し、エッジ検出アルゴリズム用の CUDA コードを生成します。
ソーベル エッジ検出アルゴリズムの検証
この例では、グレースケール イメージに対して 2 次元空間勾配演算を使用してソーベル エッジ検出を実行するモデルを作成します。このアルゴリズムは、入力イメージのエッジに相当する空間周波数が高い領域を強調します。
ソーベル エッジ アルゴリズムは、2 つの直交フィルター カーネル k と k' を使用して、入力イメージの水平方向勾配 H と垂直方向勾配 V を計算します。このアルゴリズムは、フィルター処理演算を実行した後、勾配の大きさを計算してしきい値を適用し、エッジと考えられるイメージの領域を見つけます。
イメージ ファイル peppers.png を img という名前の変数に読み込みます。
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 への入力引数として grayImage と threshold を宣言し、戻り値として 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]に基づいていなければなりません。
参考
関数
coder.gpu.kernelfun|set_param(Simulink) |sim(Simulink) |slbuild(Simulink)
ブロック
- MATLAB Function (Simulink)