並列シミュレーションの入力としての MAT ファイルからのデータのストリーミング
この例では、Simulink.SimulationData.DatasetRef
オブジェクトとparsim
関数を使用して、並列シミュレーションの入力データを Version 7.3 の MAT ファイルからストリーミングする方法を示します。シミュレーションの入力がメモリに読み込めないほど大きい場合、この例で示す手順に従うことを検討してください。たとえば、並列シミュレーションの 1 つのセットから永続ストレージに記録したデータを別のシミュレーションの入力として使用することができます。
この例では、parsim
を使用してモデルの複数のシミュレーションを実行します。各シミュレーションで一意の入力データを使用します。モデルは複数のシミュレーション ワークフローのヒントの例で使用されるモデル sldemo_suspn_3dof
に基づいています。この例のモデルは、入力のソースとしてSignal EditorブロックではなくInportブロックを使用するように変更したものです。このモデルでは、さまざまな路面状況におけるサスペンション システムの応答をシミュレートします。この例で使用する MAT ファイルには、さまざまな路面状況を表す複数のSimulink.SimulationData.Dataset
オブジェクトが含まれています。この例では、DatasetRef
オブジェクトを使用して、参照される Dataset
オブジェクト全体の内容をシミュレーションの入力としてストリーミングします。
また、matlab.io.datastore.SimulationDatastore
オブジェクトを使用して、parsim
で実行する並列シミュレーションに個々の信号のデータをストリーミングすることもできます。詳細については、SimulationDatastore オブジェクトを使用した個別の信号のストリーミングを参照してください。
モデルを開いて入力データにアクセス
モデル ex_sldemo_suspn_3dof_parsim_stream
を開きます。このモデルには、外部入力データを読み込む最上位の入力端子が 2 つあります。シミュレーションの入力として使用される各 Dataset
オブジェクトに、2 つの入力端子のそれぞれに対応する要素が 1 つずつ含まれています。
mdl = "ex_sldemo_suspn_3dof_parsim_stream";
open_system(mdl)
MAT ファイルの内容をメモリにデータを読み込まずに調べるには、Simulink.SimulationData.DatasetRef.getDatasetVariableNames
関数を使用します。この関数は、MAT ファイル内の Dataset
オブジェクトを格納する各変数の名前に対応する要素が格納された cell 配列を返します。
f = "suspn_3dof_test_cases.mat";
vars = Simulink.SimulationData.DatasetRef.getDatasetVariableNames(f);
numCases = numel(vars);
シミュレーション時のモデルへのテスト ケース データのストリーミングには DatasetRef
オブジェクトを使用します。DatasetRef
オブジェクトで MAT ファイル内の Dataset
オブジェクトを参照します。シミュレーションの実行時、DatasetRef
オブジェクトが参照する Dataset
オブジェクトからデータをインクリメンタルに読み込むことで、ファイルから入力データがストリーミングされます。
MAT ファイル内の Dataset
オブジェクトを格納する各変数に対応する要素をもつ DatasetRef
オブジェクトの配列を事前に割り当てます。その後、DatasetRef
オブジェクトを作成して、それらの各変数を参照します。
inData(1:numCases) = Simulink.SimulationData.DatasetRef(f,vars{1}); for k = 1:numCases inData(k) = Simulink.SimulationData.DatasetRef(f,vars{k}); end
並列シミュレーションの構成と実行
テスト ケースの入力のセットを一連の並列シミュレーションの入力として使用するには、Simulink.SimulationInput
オブジェクトの配列を作成して各シミュレーションを構成します。その後、setExternalInput
関数を使用して、各シミュレーションの入力としてストリーミングするテスト ケースを指定します。
simin(1:numCases) = Simulink.SimulationInput(mdl); for n = 1:numCases simin(n) = setExternalInput(simin(n),inData(n)); end
parsim
関数を使用してシミュレーションを並列実行するには、Parallel Computing Toolbox™ が必要です。Parallel Computing Toolbox がない場合、関数 parsim
はシミュレーションを逐次実行します。
シミュレーションを並列実行するために、parsim
関数はワーカー プールを作成します。既定では、parsim
はローカル プールを使用します。ローカル プール内のすべてのワーカーから、DatasetRef
オブジェクトの作成に使用された MAT ファイルにアクセスできます。
リモート ワーカーを使用する場合は、名前と値の引数 AttachedFiles
を使用して MAT ファイルを各ワーカーに送信できます。ファイルが大きい場合は特に、ファイルのコピーを各ワーカーに送信すると時間がかかることがあります。リモート ワーカーを使用する並列シミュレーション用に MAT ファイルから入力データをストリーミングする場合は、すべてのワーカーからアクセスできる場所に MAT ファイルを格納し、そのファイルのコピーを参照する DatasetRef
オブジェクトを作成することを検討してください。
parsim
関数を使用してシミュレーションを実行します。
out = parsim(simin);
[30-Sep-2024 13:27:44] Checking for availability of parallel pool... Starting parallel pool (parpool) using the 'Processes' profile ... 30-Sep-2024 13:28:50: Job Queued. Waiting for parallel pool job with ID 5 to start ... 30-Sep-2024 13:29:51: Job Running. Waiting for parallel pool workers to connect ... Connected to parallel pool with 8 workers. [30-Sep-2024 13:30:14] Starting Simulink on parallel workers... [30-Sep-2024 13:31:07] Configuring simulation cache folder on parallel workers... [30-Sep-2024 13:31:08] Loading model on parallel workers... [30-Sep-2024 13:31:17] Running simulations... [30-Sep-2024 13:31:32] Completed 1 of 20 simulation runs [30-Sep-2024 13:31:32] Received simulation output (size: 3.06 MB) for run 1 from parallel worker. [30-Sep-2024 13:31:33] Completed 2 of 20 simulation runs [30-Sep-2024 13:31:33] Received simulation output (size: 3.06 MB) for run 2 from parallel worker. [30-Sep-2024 13:31:33] Completed 3 of 20 simulation runs [30-Sep-2024 13:31:33] Received simulation output (size: 3.06 MB) for run 3 from parallel worker. [30-Sep-2024 13:31:33] Completed 4 of 20 simulation runs [30-Sep-2024 13:31:33] Received simulation output (size: 3.06 MB) for run 4 from parallel worker. [30-Sep-2024 13:31:33] Completed 5 of 20 simulation runs [30-Sep-2024 13:31:33] Received simulation output (size: 3.06 MB) for run 5 from parallel worker. [30-Sep-2024 13:31:33] Completed 6 of 20 simulation runs [30-Sep-2024 13:31:33] Received simulation output (size: 3.06 MB) for run 6 from parallel worker. [30-Sep-2024 13:31:33] Completed 7 of 20 simulation runs [30-Sep-2024 13:31:33] Received simulation output (size: 3.06 MB) for run 7 from parallel worker. [30-Sep-2024 13:31:33] Completed 8 of 20 simulation runs [30-Sep-2024 13:31:33] Received simulation output (size: 3.06 MB) for run 8 from parallel worker. [30-Sep-2024 13:31:36] Completed 9 of 20 simulation runs [30-Sep-2024 13:31:36] Received simulation output (size: 3.06 MB) for run 9 from parallel worker. [30-Sep-2024 13:31:36] Completed 10 of 20 simulation runs [30-Sep-2024 13:31:36] Received simulation output (size: 3.06 MB) for run 10 from parallel worker. [30-Sep-2024 13:31:36] Completed 11 of 20 simulation runs [30-Sep-2024 13:31:36] Received simulation output (size: 3.06 MB) for run 11 from parallel worker. [30-Sep-2024 13:31:36] Completed 12 of 20 simulation runs [30-Sep-2024 13:31:36] Received simulation output (size: 3.06 MB) for run 12 from parallel worker. [30-Sep-2024 13:31:36] Completed 13 of 20 simulation runs [30-Sep-2024 13:31:36] Received simulation output (size: 3.06 MB) for run 13 from parallel worker. [30-Sep-2024 13:31:36] Completed 14 of 20 simulation runs [30-Sep-2024 13:31:36] Received simulation output (size: 3.06 MB) for run 14 from parallel worker. [30-Sep-2024 13:31:36] Completed 15 of 20 simulation runs [30-Sep-2024 13:31:36] Received simulation output (size: 3.06 MB) for run 15 from parallel worker. [30-Sep-2024 13:31:36] Completed 16 of 20 simulation runs [30-Sep-2024 13:31:36] Received simulation output (size: 3.06 MB) for run 16 from parallel worker. [30-Sep-2024 13:31:40] Completed 17 of 20 simulation runs [30-Sep-2024 13:31:40] Received simulation output (size: 3.06 MB) for run 17 from parallel worker. [30-Sep-2024 13:31:40] Completed 18 of 20 simulation runs [30-Sep-2024 13:31:40] Received simulation output (size: 3.06 MB) for run 18 from parallel worker. [30-Sep-2024 13:31:40] Completed 19 of 20 simulation runs [30-Sep-2024 13:31:40] Received simulation output (size: 3.06 MB) for run 19 from parallel worker. [30-Sep-2024 13:31:40] Completed 20 of 20 simulation runs [30-Sep-2024 13:31:40] Received simulation output (size: 3.06 MB) for run 20 from parallel worker. [30-Sep-2024 13:31:40] Cleaning up parallel workers...
シミュレーション結果の表示
エラーなしでシミュレートされたすべての路面凹凸のテスト ケースについて、車両の垂直変位のプロットを作成します。
if isempty(out(1).ErrorMessage) legendLabels = cell(1,numCases); for m = 1:numCases if isempty(out(m).ErrorMessage) simout = out(m); logsout = simout.logsout; ts = get(logsout,"vertical_disp").Values; plot(ts); legendLabels{m} = ['Run ' num2str(m)]; end hold on end title("Response of a 3-DoF Suspension Model") xlabel("Time (s)"); ylabel("Vehicle vertical displacement (m)"); legend(legendLabels,Location="NorthEastOutside"); end
parsim
のシミュレーション結果はシミュレーション マネージャーを使用して表示することもできます。シミュレーション マネージャーで結果を表示するには、parsim
で名前と値の引数 ShowSimulationManager
を使用します。シミュレーション マネージャーを使用すると、実行の進捗を監視したり、シミュレーション データを表示したり、parsim
の結果をシミュレーション データ インスペクターで表示したりできます。
並列ワーカーを閉じる
並列シミュレーションの実行が終了したら、次のコマンドを使用してワーカー プールを閉じるか、ワーカー プールが自動的に閉じるまで待つことができます。
delete(gcp("nocreate"))
Parallel pool using the 'Processes' profile is shutting down.
参考
オブジェクト
Simulink.SimulationData.DatasetRef
|Simulink.SimulationData.Dataset
|matlab.io.datastore.SimulationDatastore
|Simulink.SimulationInput
|Simulink.SimulationOutput
関数
parsim
|setExternalInput
|Simulink.SimulationData.DatasetRef.getDatasetVariableNames
|gcp
(Parallel Computing Toolbox)