Main Content

Simulink.sdi.enablePCTSupport

並列シミュレーションからシミュレーション データ インスペクターにデータをインポートするタイミングを制御

説明

Simulink.sdi.enablePCTSupport(mode) は、mode によって指定されたモードに従って、並列ワーカーからシミュレーション データ インスペクターへのデータ インポートを設定します。シミュレーション データ インスペクターは、ローカル ワーカーのデータのみ、またはローカル ワーカーとリモート ワーカーのデータをインポートするように設定できます。モードを手動に設定することもできます。これにより、関数 Simulink.sdi.sendWorkerRunToClient を使用して実行をシミュレーション データ インスペクターに手動でインポートできます。既定では、シミュレーション データ インスペクターは手動インポート モードに設定されています。

すべて折りたたむ

ローカル ワーカーとリモート ワーカーの両方から出力を自動的にインポートするようにシミュレーション データ インスペクターの並列ワーカー サポートを設定します。

Simulink.sdi.enablePCTSupport('all')

Parallel Computing Toolbox™ ワーカーからの出力がシミュレーション データ インスペクターに自動的にインポートされるのを防ぐには、手動サポート モードを指定します。

Simulink.sdi.enablePCTSupport('manual')

この例では、並列ワーカーを使用して作成された実行をSimulink.sdi.sendWorkerRunToClientを使用して手動でシミュレーション データ インスペクターに送信する方法について説明します。

設定

この例では、Gain ブロックの値 Mu を変化させて、vdp モデルの複数のシミュレーションを実行します。並列シミュレーションを設定するには、Mu 値のベクトルを定義し、手動による Parallel Computing Toolbox のサポート用にシミュレーション データ インスペクターを設定します。

MuVals = [0.1 0.2 0.3 0.4];
Simulink.sdi.enablePCTSupport("manual");

並列ワーカーの初期化

parpool (Parallel Computing Toolbox)を使用して 4 つの並列ワーカーのプールを開始します。この例では if ステートメント内の parpool を呼び出すため、作成するのは並列プールのみです (まだない場合)。

p = gcp("nocreate");
if isempty(p)
    parpool(4);
end

spmd (Parallel Computing Toolbox)を使用してすべてのワーカーに共通の初期化コードを実行できます。たとえば、vdp モデルを読み込み、関数 Simulink.sdi.markSignalForStreaming でシミュレーション データ インスペクターにログを記録する信号を選択します。parfor 内の sim でシミュレーションを実行する場合にデータの同時実行の問題を回避するには、各ワーカーに一時ディレクトリを作成します。

spmd
    load_system("vdp")
    Simulink.sdi.markSignalForStreaming("vdp/x1",1,"on")
    Simulink.sdi.markSignalForStreaming("vdp/x2",1,"on")
    
    workDir = pwd;
    addpath(workDir)
    tempDir = tempname;
    mkdir(tempDir)
    cd(tempDir)
end

parfor を使用した並列シミュレーションの実行

並列ワーカーからシミュレーション データ インスペクターにデータをストリーミングするには、parfor (Parallel Computing Toolbox)を使用して並列シミュレーションを実行します。各ワーカーは Mu の異なる値を使用して vdp シミュレーションを実行します。parfor ループの内容にはアクセスできないため、変数 MuVal がワーカーのワークスペースで定義されます。この場合、assigninを使用して vdp モデルで内容を表示できます。

parfor (index = 1:4)
    assignin("base","MuVal",MuVals(index));
    set_param("vdp/Mu","Gain","MuVal")
    sim("vdp");

データにアクセスしてクライアント MATLAB に実行を送信

クライアント MATLAB で使用する場合と同じ方法で、ワーカーでシミュレーション データ インスペクターのプログラムによるインターフェイスを使用できます。この例では、Simulink.sdi.Runオブジェクトを作成し、Tag プロパティを使用したシミュレーションで使われた Mu の値を付加します。

    IDs = Simulink.sdi.getAllRunIDs;
    lastIndex = length(IDs);
    runID = Simulink.sdi.getRunIDByIndex(lastIndex);
    parRun = Simulink.sdi.getRun(runID);
    parRun.Tag = strcat("Mu = ",num2str(MuVals(index)));
    
    Simulink.sdi.sendWorkerRunToClient   
end

一時ディレクトリを閉じてシミュレーション データ インスペクターで実行を表示

シミュレーションが完了したら、別の spmd セクションを使用してワーカーで作成された一時ディレクトリを削除します。

spmd
    cd(workDir)
    rmdir(tempDir,"s")
    rmpath(workDir)
end

各シミュレーションで、関数 Simulink.sdi.sendWorkerRunToClient はすべてのワーカーからシミュレーション データ インスペクターに実行をインポートしました。データを表示して実行プロパティを確認し、シミュレーション中に使われた Mu の値を確認できます。

Simulink.sdi.view

さまざまな入力フィルターの時定数でモデル slexAircraftExample の並列シミュレーションを実行し、シミュレーション データ インスペクターのプログラムによるインターフェイスを使用してさまざまな方法でデータにアクセスします。

設定

シミュレーション データ インスペクターが空であり、Parallel Computing Toolbox のサポートがローカル ワーカーで作成された実行を自動的にインポートするように構成されていることを確認します。次に、各シミュレーションで使用するフィルター パラメーター値のベクトルを作成します。

Simulink.sdi.clear
Simulink.sdi.enablePCTSupport("local")

Ts_vals = [0.01, 0.02, 0.05, 0.1, 0.2, 0.5, 1]; 

並列ワーカーの初期化

並列シミュレーションを実行するローカル ワーカーのプールを未作成の場合は、関数 gcp を使用して作成します。spmd コード ブロックで、slexAircraftExample モデルを読み込み、ログに記録する信号を選択します。simparfor で使用する際のデータの同時実行の問題を回避するには、シミュレーション中に使用する一時ディレクトリをワーカーごとに作成します。

p = gcp;
Starting parallel pool (parpool) using the 'Processes' profile ...
02-Nov-2023 16:05:17: Job Queued. Waiting for parallel pool job with ID 1 to start ...
02-Nov-2023 16:06:18: Job Queued. Waiting for parallel pool job with ID 1 to start ...
Connected to parallel pool with 6 workers.
spmd
    % Load system and select signals to log
    load_system("slexAircraftExample")
    Simulink.sdi.markSignalForStreaming("slexAircraftExample/Pilot", 1, "on")
    Simulink.sdi.markSignalForStreaming("slexAircraftExample/Aircraft Dynamics Model", 4, "on")
    
    % Create temporary directory on each worker
    workDir = pwd;
    addpath(workDir)
    tempDir = tempname;
    mkdir(tempDir)
    cd(tempDir)
end

並列シミュレーションの実行

parfor を使用して 7 つのシミュレーションを並列実行します。各シミュレーションの Ts の値を選択し、モデル ワークスペースで Ts の値を変更します。次に、シミュレーションを実行し、Simulink.sdi.WorkerRun オブジェクトの配列を作成して、シミュレーション データ インスペクターでデータにアクセスします。parfor ループの後、別の spmd セグメントを使用して一時ディレクトリをワーカーから削除します。

parfor index = 1:7
    % Select value for Ts
    Ts_val = Ts_vals(index);
    
    % Change the filter time constant and simulate
    modelWorkspace = get_param("slexAircraftExample","modelworkspace");
    assignin(modelWorkspace,"Ts",Ts_val)
    sim("slexAircraftExample");
    
    % Create a worker run for each simulation
    workerRun(index) = Simulink.sdi.WorkerRun.getLatest
end

spmd        
    % Remove temporary directories
    cd(workDir)
    rmdir(tempDir, "s")
    rmpath(workDir)
end

並列シミュレーション出力から Dataset オブジェクトを取得

関数 getDatasetWorkerRun オブジェクトから Dataset オブジェクトにデータを格納することで、簡単に後処理できるようになります。

ds(7) = Simulink.SimulationData.Dataset;

for a = 1:7
    ds(a) = getDataset(workerRun(a));
end
ds(1)
ans = 
Simulink.SimulationData.Dataset '' with 12 elements

                         Name        BlockPath                                
                         __________  ________________________________________ 
    1  [1x1 State ]      ''          slexAircraftExample/Actuator Model      
    2  [1x1 Signal]      alpha, rad  ...rcraftExample/Aircraft Dynamics Model
    3  [1x1 State ]      ''          ...cs Model/Pitch Channel/Integrate qdot
    4  [1x1 State ]      ''          ...mics Model/Vertical Channel/Integrate
    5  [1x1 State ]      ''          ...ntroller/Alpha-sensor Low-pass Filter
    6  [1x1 State ]      ''          ...ller/Integrator/Continuous/Integrator
    7  [1x1 State ]      ''          ...ple/Controller/Pitch Rate Lead Filter
    8  [1x1 State ]      ''          ...aftExample/Controller/Stick Prefilter
    9  [1x1 State ]      ''          .../Dryden Wind Gust Models/Q-gust model
   10  [1x1 State ]      ''          .../Dryden Wind Gust Models/W-gust model
   11  [1x1 Signal]      Stick       slexAircraftExample/Pilot               
   12  [1x1 Signal]      alpha, rad  slexAircraftExample/alpha, rad          

  - Use braces { } to access, modify, or add elements using index.

並列シミュレーション出力から DatasetRef オブジェクトを取得

ビッグ データのワークフローの場合は、関数 getDatasetRef を使用して WorkerRun に関連付けられているデータを参照します。

for b = 1:7
    datasetRef(b) = getDatasetRef(workerRun(b));
end
datasetRef(1)
ans = 
  DatasetRef with properties:

           Name: 'Run <run_index>: <model_name>'
            Run: [1×1 Simulink.sdi.Run]
    numElements: 12

シミュレーション データ インスペクターで並列シミュレーション データを処理

ローカルの Simulink.sdi.Run オブジェクトを作成し、シミュレーション データ インスペクターのプログラムによるインターフェイスを使用してデータの解析と可視化を行うこともできます。この例では、各実行に対するフィルター時定数値を示すタグを示します。

for c = 1:7
    Runs(c) = getLocalRun(workerRun(c));
    Ts_val_str = num2str(Ts_vals(c));
    desc = strcat("Ts = ", Ts_val_str);
    Runs(c).Description = desc;
    Runs(c).Name = strcat("slexAircraftExample run Ts=", Ts_val_str);    
end

ワーカー リポジトリをクリーンアップ

ワーカーが使用したファイルをクリーンアップし、ワーカー プールで実行するその他のシミュレーション用にディスク容量を解放します。

Simulink.sdi.cleanupWorkerResources

入力引数

すべて折りたたむ

並列ワーカーで記録されたデータに関するシミュレーション データ インスペクターのデータ インポート モード。次のいずれかのオプションとして指定します。

  • 'manual' — 並列ワーカーで作成された実行を自動的にインポートしません。並列ワーカーで作成された実行を関数 Simulink.sdi.sendWorkerRunToClient を使用して手動でインポートできます。

  • 'local' — ローカル ワーカーで作成された実行を自動的にインポートします。

  • 'all' — ローカル ワーカーおよびリモート ワーカーで作成された実行を自動的にインポートします。

データ型: char | string

代替機能

[基本設定][並列] を選択することで、シミュレーション データ インスペクターで並列計算サポート モードを変更することができます。

バージョン履歴

R2017b で導入

すべて展開する