如何让多个循环运行得更快,这是找到稳定状态的功能?
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);
0评论
接受的答案
答案(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;
打破
结束
结束
结束