Parforを用いてSimulink モデルを並列に実行する方法

5 次查看(过去 30 天)
O.E
O.E 2016-11-15
评论: O.E 2016-11-16
1BitΔΣADCのSimulink モデルをParforを利用してローカルで並列実行したいと考えています。 シミュレーション時間を0~Tsimまでとし、入力信号(Sin波)の振幅をAとして並列実行し、 出力データをTo workspace (OUT_DATA)に出力しようと考えています。
%%%%%%%%%%パラメータ設定 %%%%%%%%%%%%%%%%
Sp=2^14; %サンプル点数
Ts=1; %サンプリング周期
OSR=64; %オーバーサンプリングレーシオ
fb=(1/Ts)/(2*OSR); %帯域 (OSR=fclk/(2*fb)) fb=fclk/(2*OSR))
fsin=fb/2; %信号帯域の半分の周波数の信号を使ってシミュレーション
Tsim=(Sp)*Ts; %システムのシミュレーション時間
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
J = [0,1,2,3,4,5.6]; % モデルに引き渡すパラメータの組
parfor i = 1:length(J)
A = J(i); % 使用するパラメータ
  sim('dsm')
B(i) = transpose(OUT_DATA);
end
このようにプログラムを組んだのですが、 ″ブロック線図 'dsm' では、[コンフィギュレーション パラメーター] ダイアログ内の 'StopTime' に指定された式 'Tsim' の評価中にエラーが発生しました: 関数または変数 'Tsim' が未定義です。″
とエラーが表示され実行することができませんでした。TsimはTsim=(Sp)*Tsと設定しているのですが、なぜ未定義となってしまうのでしょうか。

采纳的回答

Jiro Doke
Jiro Doke 2016-11-15
编辑:Jiro Doke 2016-11-15
これは、 parfor 内でループの外の変数が見えていないから起きます。一番簡単な対処法はループ内のコードを一つの関数としてまとめる方法です。
実際に dsim のモデル内でどの変数が必要か分かりませんが、仮に A, fsin, Tsim が使われている場合、それらを入力として受け付ける関数を書きます。
J = [0,1,2,3,4,5.6]; % モデルに引き渡すパラメータの組
parfor i = 1:length(J)
B{i} = simModel(J(i),fsin,Tsim);
end
%%%%%
function B = simModel(A,fsin,Tsim)
simOut = sim('dsm','SrcWorkspace','current');
OUT_DATA = get(simOut,'OUT_DATA'); % シミュレーション出力オブジェクトから抽出
B = transpose(OUT_DATA);
end
%%%%%
sim は既定の設定でベースワークスペースの変数を参照するため、関数内で実行するには SrcWorkspace current に設定する必要があります。また、それを行うと出力データはシミュレーション出力オブジェクトに格納されるので、抽出する必要があります。
参考:
  3 个评论
Jiro Doke
Jiro Doke 2016-11-15
すみません。
sim のオプションが間違っていました。回答を修正しましたのでもう一度試してみてください。
O.E
O.E 2016-11-16
無事動作いたしました。 丁寧な御回答ありがとうございました。

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Parallel Computing Fundamentals 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by