如何加快模拟包含多个循环吗?

2视图(30天)
我有一个脚本:
(DBuck_On = 0.99: -0.09:0.01)
(Mode_Control = 0:1:3)
(DT_Comp_Mode = 0:1:3)
(Fs = 50 e3:50e3:200e3)
(DT_On = -500 e-9:50e-9:500e-9)
(DT_Off = -500 e-9:50e-9:500e-9)
(T_On_Min = 50 e-9: 50 e-9: 250 e-9)
(T_Off_Min = 50 e-9: 50 e-9: 250 e-9)
(Aux_Control = 0:1)
(T_Aux_On_Min = [50 e-9 60 e-9])
(T_Aux_Off_Min = [50 e-9 60 e-9])
(DT_Aux_On =[200年50 e-9 100 e-9 e-9])
(DT_Aux_Off =[200年50 e-9 100 e-9 e-9])
Ts = 1 / f;
DBuck_Off = 1-DBuck_On;
如果(Mode_Control = = 1)
DBuck_Off = 0.5 -dbuck_on / 2;
结束
D1 = DBuck_On;
D2 = DBuck_Off;
D3 = 1-DBuck_On-DBuck_Off;
sim卡(“DPWMIgalSimulation_Comparison_RoiVersion_Vs_MyVersion”);
MyRawData = csvread (strcat (pwd,“\ MyTempTestVector.csv”));
RoiRawData = csvread (strcat (pwd,“\ RoiTempTestVector.csv”));
如果(~ isequal (MyRawData RoiRawData))
如果(旗)
MyData = MyRawData;
RoiData = RoiRawData;
国旗= false;
继续;
结束
MyData = [MyData; MyRawData]
RoiData = [RoiData; RoiRawData]
结束
结束
结束
结束
结束
结束
结束
结束
结束
结束
结束
结束
结束
结束
我模拟接待输入(DbuckOn模式,DT…)和输出单一向量,为MyRawData / RoiRawData然后我积累向量在两个数据库是不一样的:MyData RoiData。这个数据我将保存在CSV。 有办法使用所有处理器核为了执行循环更快呢? 我试着parfor但似乎不工作(我使用Matlab2016试验)。 任何其他建议速度优化吗? 谢谢你!

答案(2)

提多Edelhofer
提多Edelhofer 2016年6月14日
你好,
您应该能够使用parfor等问题,如见。 这个例子
此外,我建议更换你的许多循环ndgrid,类似
[DBuck_OnVec, Mode_ControlVec DT_Comp_ModeVec] = ndgrid (0.99: -0.09:0.01 0:3, 0:3);
parfor问= 1:元素个数(DBuck_On)
DBuck_On = DBuck_OnVec(问);
sim卡()
结束
提图斯
3评论
俄梅珥
俄梅珥 2016年6月16日
编辑:俄梅珥 2016年6月16日
嘿,提多,再次感谢。我改变了代码,现在我做ndgrid为了保存所有数据矩阵和只使用一个循环:
清晰的所有;
Dir = pwd;
%模拟运行
SimTime = 0;% Ts完全模拟
N = 1 e5;
SampleTime = SimTime / N;
MyFileName = strcat (pwd,“\ MyTestVec”);
RoiFileName = strcat (pwd,“\ RoiTestVec”);
% CCM模式
DBuck_On = 0.99: -0.09:0.01;
Mode_Control = [0 1 2 3];
DT_Comp_Mode = [0 1 2 3];
Fs = 50 e3:50e3:200e3;
DT_On = -100 e-9:50e-9:100e-9;
DT_Off = -100 e-9:50e-9:100e-9;
T_On_Min = 50 e-9: 50 e-9: 250 e-9;
T_Off_Min = 50 e-9: 50 e-9: 250 e-9;
Aux_Control = [0 1];
T_Aux_On_Min = (50 e-9 60 e-9);
T_Aux_Off_Min = (50 e-9 60 e-9);
DT_Aux_On = [50 e-9 100 e-9 200 e-9];
DT_Aux_Off = [50 e-9 100 e-9 200 e-9];
[XDBuck_On, XMode_Control XDT_Comp_Mode, XFs, XDT_On, XDT_Off, XT_On_Min, XT_Off_Min, XAux_Control, XT_Aux_On_Min, XT_Aux_Off_Min, XDT_Aux_On, XDT_Aux_Off] = ndgrid (DBuck_On, Mode_Control DT_Comp_Mode, Fs, DT_On DT_Off, T_On_Min, T_Off_Min, Aux_Control, T_Aux_On_Min, T_Aux_Off_Min, DT_Aux_On, DT_Aux_Off);
清晰的DBuck_On Mode_Control DT_Comp_Mode Fs DT_On DT_Off T_On_Min T_Off_Min Aux_Control T_Aux_On_Min T_Aux_Off_Min DT_Aux_On DT_Aux_Off
XDBuck_On = XDBuck_On (:);
XMode_Control = XMode_Control (:);
XDT_Comp_Mode = XDT_Comp_Mode (:);
XFs = XFs (:);
XDT_On = XDT_On (:);
XDT_Off = XDT_Off (:);
XT_On_Min = XT_On_Min (:);
XT_Off_Min = XT_Off_Min (:);
XAux_Control = XAux_Control (:);
XT_Aux_On_Min = XT_Aux_On_Min (:);
XT_Aux_Off_Min = XT_Aux_Off_Min (:);
XDT_Aux_On = XDT_Aux_On (:);
XDT_Aux_Off = XDT_Aux_Off (:);
国旗= true;
MyData =细胞(1、长度(XDT_Aux_Off));
RoiData =细胞(1、长度(XDT_Aux_Off));
parfork = 1:长度(XDT_Aux_Off)
MyData {k} = {};
RoiData {k} = {};
Ts = 1 / XFs (k);
Mode_Control = XMode_Control (k);
DT_Comp_Mode = XDT_Comp_Mode (k);
DT_On = XDT_On (k);
DT_Off = XDT_Off (k);
T_On_Min = XT_On_Min (k);
T_Off_Min = XT_Off_Min (k);
Aux_Control = XAux_Control (k);
T_Aux_On_Min = XT_Aux_On_Min (k);
T_Aux_Off_Min = XT_Aux_Off_Min (k);
DT_Aux_On = XDT_Aux_On (k);
DT_Aux_Off = XDT_Aux_Off (k);
DBuck_Off = 1-XDBuck_On (k);
如果(XMode_Control (k) = = 1)
DBuck_Off = 0.5 -xdbuck_on (k) / 2;
结束
D1 = XDBuck_On (k);
D2 = DBuck_Off;
D3 = 1-D1-D2;
sim卡(“DPWMIgalSimulation_Comparison_RoiVersion_Vs_MyVersion”);
MyRawData = csvread (strcat (pwd,“\ MyTempTestVector.csv”));
RoiRawData = csvread (strcat (pwd,“\ RoiTempTestVector.csv”));
如果(~ isequal (MyRawData RoiRawData))
MyData {k}{结束+ 1}= MyRawData;
RoiData {k}{结束+ 1}= RoiRawData;
结束
结束
MyData = (MyData {:});
RoiData = [RoiData {}):;
MyNewData = MyData(:, 2:结束);
RoiNewData = RoiData(:, 2:结束);
csvwrite (strcat (MyFileName,“_CCM”,. csv”),MyNewData);
csvwrite (strcat (RoiFileName,“_CCM”,. csv”),RoiNewData);
我用你的建议改变MyData / RoiData parfor开始工作,然后输出如下:* “开始平行池(parpool)使用“本地”概要文件…连接到4工人。我们加载模块版本3.7.5警告:对话框启动时不再支持MATLAB -nodisplay或-noFigureWindows选项或金宝app没有显示。有关更多信息,请参见“-nodisplay变化和-noFigureWindows启动选项”MATLAB版本说明。查看浏览器发布在您的系统,运行web ('www.tatmou.com/help/matlab/release-notes.html # br5ktrh-3”、“浏览器”)> warnfiguredialog(第21行)我们将加载模块版本3.7.5警告:对话框启动时不再支持MATLAB与-nodisplay -noFigureWindows选项或没有显示。金宝app有关更多信息,请参见“-nodisplay变化和-noFigureWindows启动选项”MATLAB版本说明。查看浏览器发布在您的系统,运行web ('www.tatmou.com/help/matlab/release-notes.html # br5ktrh-3”、“浏览器”)>在warnfiguredialog(21行)在对话框对话框(35)行(第211行)errordlg(47)行parallel_function > make_general_channel / channel_general(第914行)remoteParallelFunction(38)行错误评估表达式“SimTime”“StopTime框图的配置参数对话框中指定的DPWMIgalSimulation_Comparison_RoiVersion_Vs_MyVersion:未定义的函数或变量SimTime’” *
但simtime确实定义(其在基金的仿真时间文件)。
开始时他有一个其他错误:* “开始平行池(parpool)使用“本地”概要文件…连接到4工人。用户文件' M: \ \ Omer_o \ Matlab05_forOmer \ DPWMIgalSimulation_Comparison_RoiVersion_Vs_MyVersion。基金的基金不包含一个有效的仿真软件模型格式:不能开源包”金宝app *
简短概述:模拟我们街区有13块参数(DbuckOn DTCom . .)。当我定义工作区中的参数可以模拟运行。可能由于错误原因问题运行相同的模拟以多线程的方式与不同的参数吗?有什么建议吗?
* *之后,一个朋友建议他说更好的如果我通过所有输入参数在仿真函数本身所以工人可以在并行模式下工作,但是每次我试着通过输入paramter sim的错误:_ * “审判> > sim (“DPWMIgalSimulation_Comparison_RoiVersion_Vs_MyVersion”、“t”, 1 e-5) block_diagram没有参数命名为“t”
审判> > get_param (' DPWMIgalSimulation_Comparison_RoiVersion_Vs_MyVersion ', ' Ts ') block_diagram没有参数命名为“t”“* _
也许这可以解决这个问题,但我能图为什么它不认识我块参数。
非常感谢。俄梅珥

登录置评。


提多Edelhofer
提多Edelhofer 2016年6月17日
嗨俄梅珥,
通常最好将调用sim卡放入一个函数。传递函数的变量,因为他们是必须的,类似
函数y =模拟(k, Ts, Mode_Control DT_Comp_Mode)
sim卡(“DPWMIgalSimulation_Comparison_RoiVersion_Vs_MyVersion”,“SrcWorkspace”,“当前”);
结束
为什么k ?你应该确保文件名包含了“k”,否则并行模拟将写入同一个. csv文件。
csv文件之后(即阅读。,after the call to "simulate") and delete them in order to not have hundreds of files.
提图斯
6个评论
俄梅珥
俄梅珥 2016年6月21日
嘿,提多1。我不理解这个警告及其原因。这个警告的情况是什么?2。因为它没有工作,看到我previouse发表评论。当我分配参数正常(t = xt (k),…)并不知道他们和生产强调的一个警告

登录置评。

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!