エクスターナル モードを使用したパラメーターの調整と信号の監視
エクスターナル モード シミュレーションは、ラピッド プロトタイピングに使用できます。エクスターナル モード シミュレーションでは、開発用コンピューター (ホスト) の Simulink® と、コードの生成およびビルド プロセスにより作成された実行可能ファイルを実行するターゲット ハードウェアの間に、通信チャネルが確立されます。
この通信チャネルでは次のことが可能です。
ブロック パラメーターのリアルタイムでの変更または調整。モデルのパラメーターを変更すると、Simulink により新しい値が実行中のターゲット アプリケーションにダウンロードされます。
実行中のターゲット アプリケーションからの信号データの監視と保存。
チャネルの下位トランスポート層により、メッセージの送信が処理されます。Simulink と生成されるモデル コードは、この層に依存しません。トランスポート層とそのインターフェイス コードは、メッセージとデータ パケットの形式設定、送信、および受信を行う個別のモジュールに分離されています。
TCP/IP 通信チャネルを使用するエクスターナル モード シミュレーションを設定して実行します。
単純なモデルを作成して構成します。
ターゲットの実行可能ファイルをビルドします。
ターゲット アプリケーションを実行します。
パラメーターを調整します。
例:マンデルブロ集合
説明
マンデルブロ集合とは、下記の方程式で定義された軌跡が k→∞ のときに有限の範囲内にとどまる値 z0 で構成された複素平面の領域です。
マンデルブロ集合の全体的な幾何形状を図に示しています。この図には、集合の境界の外側周辺における詳しい構造を十分に示すための解像度がありません。拡大率を上げていくと、マンデルブロ集合の詳細な境界が示され、そこでは徐々に細かくなりながら細部が繰り返されていることがわかります。
アルゴリズム
このチュートリアルでは、メインのカージオイドとその左側にある p/q 球状部との谷間にある、マンデルブロ集合の大きく拡大された部分を指定する一連の範囲を選択します。これらの 2 つの範囲間に、実数部 (x) と虚数部 (y) の 1000 x 1000 のグリッドを作成します。次に、マンデルブロ アルゴリズムを各グリッド位置で反復します。500 回の反復回数で、完全な解像度のイメージがレンダリングされます。
maxIterations = 500; gridSize = 1000; xlim = [-0.748766713922161,-0.748766707771757]; ylim = [0.123640844894862,0.123640851045266];
このチュートリアルでは、CPU で実行される標準の MATLAB® コマンドを使ったマンデルブロ集合の実装を使用します。この計算はすべての場所が同時に更新されるようにベクトル化されています。
マンデルブロ モデルの作成
Simulink モデルを作成し、User-Defined Functions ライブラリから MATLAB Function ブロックを挿入します。
MATLAB Function ブロックをダブルクリックします。既定の関数シグネチャが MATLAB Function ブロック エディターに表示されます。
マンデルブロ アルゴリズムを実装する関数
mandelbrot_count
を定義します。関数ヘッダーは、maxIterations
、xGrid
、およびyGrid
を関数mandelbrot_count
の引数として宣言し、またcount
を戻り値として宣言します。function count = mandelbrot_count(maxIterations, xGrid, yGrid) % mandelbrot computation z0 = complex(xGrid,yGrid); count = ones(size(z0)); % Map computation to GPU coder.gpu.kernelfun; z = z0; for n = 0:maxIterations z = z.*z + z0; inside = abs(z)<=2; count = count + inside; end count = log(count);
MATLAB Function ブロックのブロック パラメーターを開きます。[コード生成] タブで、[関数のパッケージ化] パラメーターについて
[再利用可能な関数]
を選択します。[関数のパッケージ化] パラメーターが他の値に設定されている場合、CUDA® カーネルが生成されない可能性があります。
Sources および Sinks ライブラリから Inport (Simulink) ブロックと Outport (Simulink) ブロックを追加します。
これらのブロックを、次の図に示すように接続します。モデルを
mandelbrot_top.slx
として保存します。
ターゲットの実行可能ファイルのビルド
エクスターナル モード ターゲット アプリケーションに必要なモデルおよびコード生成パラメーターを設定します。次に、コードを生成してターゲット アプリケーションをビルドします。
Simulink ツールストリップの [アプリ] タブの [ハードウェアで実行するように設定] セクションで、[ハードウェア ボードで実行] をクリックします。
[ハードウェア ボード] セクションの [ハードウェア ボード] リストから、
[NVIDIA Jetson]
を選択します。[準備] セクションで [ハードウェア設定] をクリックします。[コンフィギュレーション パラメーター] ダイアログ ボックスが開き、[ハードウェア実行] 設定が表示されます。この設定は、選択したボードに応じて決まります。
[ソルバー] ペインで次を行います。
[タイプ] フィールドで
[固定ステップ]
を選択します。[ソルバー] フィールドで
[離散 (連続状態なし)]
を選択します。[ソルバーの詳細] をクリックします。[固定ステップ サイズ] フィールドで
[0.1]
と指定します(このようにしないと、コードの生成時に GPU Coder™ ビルド プロセスにより警告が出力され、値が指定されます)。[適用] をクリックします。
[データのインポート/エクスポート] ペインで [時間] および [出力] チェック ボックスをオフにします。この例では、データのログはワークスペースまたは MAT ファイルに記録されません。[適用] をクリックします。
[コード生成] 、 [最適化] ペインで、[既定のパラメーター動作] が
[調整可能]
に設定されていることを確認します。変更が完了したら、[適用] をクリックします。[コード生成] 、 [インターフェイス] ペインの [データ交換インターフェイス] セクションで [エクスターナル モード] を選択します。
[ハードウェア実行] 、 [Target hardware resources] 、 [External mode] セクションで、[Communication interface] パラメーターの既定値
[tcpip]
が選択されていることを確認します。[適用] をクリックして、エクスターナル モード設定を保存します。
モデルを保存します。
[コード生成] ペインを選択します。[コード生成のみ] がオフになっていることを確認します。
コードを生成してターゲット アプリケーションを作成するには、モデル ウィンドウで Ctrl+B を押します。あるいは [ハードウェア] タブの [ハードウェアで実行] セクションで [監視と調整] をクリックします。次に [ステップ単位のコマンド] で [監視用のビルド] をクリックします。
作業フォルダーに
mandelbrot_top
実行可能ファイルが作成されます。
ターゲット アプリケーションの実行
mandelbrot_top
ターゲット実行可能ファイルを実行し、実行中のターゲット アプリケーションの対話型フロント エンドとして Simulink を使用します。この実行可能ファイルは作業フォルダーにあります。ターゲット アプリケーションを実行して、Simulink とターゲットの間の通信を確立します。
ターゲット アプリケーションを実行するには、次を行います。
[ハードウェア] タブの [ハードウェアで実行] セクションで、次を行います。
[終了時間] フィールドに
inf
を指定します。これにより、ターゲット アプリケーションが Simulink から停止メッセージを受信するまで、モデルが実行されます。[監視と調整] をクリックします。次に、[信号の監視とパラメーターの調整] で [監視と調整] をクリックします。
ターゲット アプリケーションがターゲット上で実行を開始し、Simulink との通信を確立します。Simulink とターゲットが接続されたら、[接続] ボタンが [切断] に変わります。
[ハードウェア] タブの [ハードウェアで実行] セクションで、[監視と調整] をクリックします。次に、[ステップ単位のコマンド] で [切断] をクリックします。これにより、実行中のターゲット アプリケーションから Simulink が切断され、切断オプションが [接続] に再度変わります。
アプリケーションに接続するには、[ステップ単位のコマンド] で [接続] をクリックします。これにより、Simulink とターゲット上のアプリケーションの間の接続が再度確立され、エクスターナル モードが続行されます。
ターゲット上のアプリケーションを終了するには、[ステップ単位のコマンド] で [停止] をクリックします。これにより、ターゲット上のアプリケーションが終了し、Simulink との接続が切断されます。
メモ
深層学習ネットワークを含む Simulink モデルでエクスターナル モード シミュレーションを実行すると、ターゲットでのモデルの初期化時にタイムアウト エラーが発生する場合があります。このタイムアウトは、実行可能ファイルの初期化時間が既定の最大読み込み時間である 300 秒を超えていることが原因である可能性があります。環境変数 NVIDIA_XCP_EXTMODE_INIT_TIME
を使用して、タイムアウト時間を増やすことができます。たとえば、MATLAB コマンド ウィンドウに、次のように入力します。
setenv('NVIDIA_XCP_EXTMODE_INIT_TIME','500');
ターゲット アプリケーションの停止
ホスト/ターゲット通信から Simulink を切断する操作とターゲット アプリケーションの実行を終了する操作を同時に実行するには、[ハードウェア] タブの [ハードウェアで実行] セクションで [停止] をクリックします。
参考
関数
open_system
(Simulink) |load_system
(Simulink) |save_system
(Simulink) |close_system
(Simulink) |bdclose
(Simulink) |get_param
(Simulink) |set_param
(Simulink) |sim
(Simulink) |slbuild
(Simulink)