Parforを用いてSimulink モデルを並列に実行する方法
5 views (last 30 days)
Show older comments
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と設定しているのですが、なぜ未定義となってしまうのでしょうか。
0 Comments
Accepted Answer
Jiro Doke
on 15 Nov 2016
Edited: Jiro Doke
on 15 Nov 2016
これは、 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 Comments
More Answers (0)
See Also
Categories
Find more on Parallel Computing Fundamentals in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!