如何让多个循环运行得更快,这是找到稳定状态的功能?

1视图(30天)
嗨。我编程双重循环找到迭代物理过程的稳定状态(包括fft /传输线矩阵)。与默认的单线程程序适用计算但需要多少时间。而“parfor”我试着似乎是无用的,甚至花费更多的时间。我附上下面的代码的一部分。感谢如果任何人都可以给我建议,帮助提高我的代码的速度,或者一个更好的方法来找到稳定状态。
% %输入参数并创建变量
元= 2 ^ 12;%的采样点
N = 2000;%最大迭代数
一个= 0 (N, nt);%创建初始
(1:)= randn(1元)+ 1我* randn (nt);
%……和other parameters
% %主循环
rmse = 1 (N, 1);%创建均方根误差变量
B = fftshift (fft (ifftshift (A)));
C = abs (B) ^ 2;
国旗= 0;%初始稳态标志= = 0
m = 1:10%找到最小m值导致稳态(线性,当m > =阈值,成为稳定)
n = 1: n - 1%迭代过程
:一个(n + 1) = Function ((n:), m);%一个自定义函数,输入(n)和m,输出一个(n + 1)
:B (n + 1) = fftshift (fft (ifftshift ((n + 1,:))));
:C (n + 1) = abs (B (n + 1:)) ^ 2;
rmse (n + 1) =√意味着((C (n + 1:) - C (n,:)) ^ 2));%计算之间的均方根误差(n)和C (n + 1)
鳍= n + 1;% n值存储
如果(rmse(鳍)< 0.02)& &(鳍> 2)%看看稳定状态
标志= 1;%设置标志= = 1在稳定状态
打破
结束
结束
如果标志= = 1% junmp循环
打破
结束
结束
% %可视化
图;
次要情节(2,1,1);
网(一个);
次要情节(2,1,2);
网格(C);

接受的答案

雷蒙德·诺里斯
雷蒙德·诺里斯 2021年11月9日
渡濑应该能够改变过去的几行
结束
临时(m, 1) = rmsep;
结束
rmse = temp;
说完这些,我不会去逐行,而不是说,我不认为你最初发布的地图 parfor 建议。具体来说,最初的例子可能提早退出,而你 parfor 例子不会(嗯,只有部分)。

答案(1)

雷蒙德·诺里斯
雷蒙德·诺里斯 2021年11月8日
编辑:雷蒙德·诺里斯 2021年11月8日
你能稍微阐述如下:
  • 你测量时间(walltime,抽搐/ toc分析器)
  • 需要多长时间连续运行,加速你寻找的东西(如需要2天,lookng 3小时,等等)。
  • 你访问你什么计算上运行您的代码(例如4核,16 GB的内存,等等)。
  • 我假设你试图并行化了for循环rmse有一个依赖C (n + 1)C (n)。不管你选择哪一个,你需要重写他们正在写的for循环。你可以发布你的吗parfor循环的样子。
(即稳态问题。“针”)不会处理 parfor ,你无法预先结束循环。相反,你更好 parfeval ,在那里你可以看到结果,取消“期货”当你遇到一个threashold。
例如
%设置池的大小如何选择(可以小于的数量
%的迭代
p = parpool (10);
m = 10: 1:1
f (m) = p.parfeval (@calc_steady_state 3 m);
结束
m = 1:10
[indx,国旗,A、C] = f (m) .fetchNext;
如果标志= = true
%早发现我们的稳态
f.cancel
结束
结束
% %可视化
图;
次要情节(2,1,1);
网(一个);
次要情节(2,1,2);
网格(C);
函数国旗,A、C = calc_steady_state
% %输入参数并创建变量
元= 2 ^ 12;%的采样点
N = 2000;%最大迭代数
一个= 0 (N, nt);%创建初始
(1:)= randn(1元)+ 1我* randn (nt);
%……和other parameters
% %主循环
rmse = 1 (N, 1);%创建均方根误差变量
B = fftshift (fft (ifftshift (A)));
C = abs (B) ^ 2;
国旗= 0;
n = 1: n - 1%迭代过程
:一个(n + 1) = Function ((n:), m);%一个自定义函数,输入(n)和m,输出一个(n + 1)
:B (n + 1) = fftshift (fft (ifftshift ((n + 1,:))));
:C (n + 1) = abs (B (n + 1:)) ^ 2;
rmse (n + 1) =√意味着((C (n + 1:) - C (n,:)) ^ 2));%计算之间的均方根误差(n)和C (n + 1)
鳍= n + 1;% n值存储
如果(rmse(鳍)< 0.02)& &(鳍> 2)%看看稳定状态
标志= 1;
打破
结束
结束
结束
1评论
ChiQAQ
ChiQAQ 2021年11月8日
嗨,诺里斯。谢谢你的快速和专业的回答。我将试着 parfeval 为你演示的例子。老实说我不是很熟悉并行池功能。让我先通过帮助中心了解更多关于它。
通知你,
  • 使用分析器测量时间。
  • 需要4分钟完成一个内部循环由2000次迭代。所以整个项目将花费40分钟,计算外部循环。然而,这是一个简化的测试代码。我处理的一个至少包括m = 1:380,甚至需要三重循环解决多个参数。只是考虑到m = 1:10的情况下,我更喜欢不超过10分钟,如果可能的话。
  • i7 - 6700 @3.4ghz, 4核,8线程,16 gb的RAM。(还有GPU,但没有使用它)
  • 你是对的。我试图并行化出循环。下面是我模仿的parfor循环从另一个例子。
%创建A, B, C, rmse鳍
一个= 0 (N, nt, 10);
(1::)= repmat (randn(1元)+ 1我* randn(1元),1,1,10);
B = fftshift (fft (ifftshift (A)));
C = abs (B) ^ 2;
rmse = 1 (10, 1);
鳍= 0 (10,1);
% parfor循环
parform = 1:10
美联社=一个;%不能直接使用,因为一个并非公认的切片变量。
%或错误发生的“有效指数A PARFOR循环受到限制”
英国石油(Bp) = B;% B, C、rmse鳍有同样的原因
Cp = C;
rmsep = rmse;
finp =鳍;
n = 1: n - 1
美联社(n + 1: m) =函数(Ap (n:米),m);
英国石油公司(n + 1: m) = fftshift (fft (ifftshift(美联社(n + 1: m))));
Cp (n + 1: m) = abs (Bp (n + 1: m)) ^ 2;
rmsep (m) =√意味着(Cp (n + 1: m) - Cp (n: m)) ^ 2));
finp (m) = n + 1;
如果(rmsep (m) < 0.02) & & (finp > 2)
打破
结束
结束
临时{m} = rmsep;
结束
m = 1:10
rmse (m) = temp {m};
结束

登录置评。

类别

找到更多的在循环和条件语句帮助中心文件交换

下载188bet金宝搏


释放

R2021a

社区寻宝

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

开始狩猎!