メインコンテンツ

並列シミュレーションの入力としての 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

Figure contains an axes object. The axes object with title Response of a 3-DoF Suspension Model, xlabel Time (s), ylabel Vehicle vertical displacement (m) contains 20 objects of type line. These objects represent Run 1, Run 2, Run 3, Run 4, Run 5, Run 6, Run 7, Run 8, Run 9, Run 10, Run 11, Run 12, Run 13, Run 14, Run 15, Run 16, Run 17, Run 18, Run 19, Run 20.

parsim のシミュレーション結果はシミュレーション マネージャーを使用して表示することもできます。シミュレーション マネージャーで結果を表示するには、parsim で名前と値の引数 ShowSimulationManager を使用します。シミュレーション マネージャーを使用すると、実行の進捗を監視したり、シミュレーション データを表示したり、parsim の結果をシミュレーション データ インスペクターで表示したりできます。

並列ワーカーを閉じる

並列シミュレーションの実行が終了したら、次のコマンドを使用してワーカー プールを閉じるか、ワーカー プールが自動的に閉じるまで待つことができます。

delete(gcp("nocreate"))
Parallel pool using the 'Processes' profile is shutting down.

参考

オブジェクト

関数

ツール

トピック