在某些情况下,必须修改代码以将for循环转换为parfor循环。这个示例展示了如何使用一个简单的嵌套for循环诊断和修复parfor循环问题。在MATLAB®中运行此代码并检查结果。
for x = 0:0.1:1
for k = 2:10
x(k) = x(k-1) + k;
为了加速代码,尝试将for循环转换为parfor循环。注意这段代码会产生错误。
parfor x = 0:0.1:1
parfor k = 2:10
x(k) = x(k-1) + k;
在这种情况下,您不能在不进行修改的情况下简单地将for循环转换为parfor循环。要使其工作,您必须在几个地方更改代码。要诊断问题,请在MATLAB编辑器中查找代码分析器消息。
要解决这些问题,必须修改代码以使用parfor。parfor循环的主体在并行池中使用多个MATLAB工作程序以不确定的顺序执行。因此,对于parfor循环体,你必须满足以下要求:
1)parfor循环的主体必须是独立的。一个循环的迭代不能依赖于前一个迭代,因为迭代是以不确定的顺序并行执行的。在这个例子中,
x(k) = x(k-1) + k;
不是独立的,因此不能使用parfor。有关处理独立性问题的后续步骤,请参见确保parfor循环迭代是独立的。
2)不能将一个parfor循环嵌套到另一个parfor循环中。该示例有两个嵌套的for循环,因此您只能用一个parfor循环替换一个for循环。相反,您可以在另一个parfor循环的主体中调用一个使用parfor循环的函数。但是,这种嵌套的parfor循环不会给您带来任何计算上的好处,因为所有的workers都用于并行化最外面的循环。有关处理嵌套循环的帮助,请参见嵌套语法分析和For循环以及其他语法分析要求。
3)parfor循环变量必须是连续递增的整数。在这个例子中,
parfor x = 0:0.1:1
具有非整数循环变量,因此在这里不能使用parfor。您可以通过将循环变量的值更改为算法所需的整数值来解决这个问题。有关对parfor-loop变量进行故障诊断的后续步骤,请参见确保parfor-loop变量是连续递增的整数。
4)不能像在for循环中那样,提前跳出parfor循环。不要在parfor循环的主体中包含return或break语句。没有通信,其他运行循环的MATLAB实例不知道何时停止。作为替代方案,可以考虑parfeval。
如果在将for循环转换为parfor循环时仍有问题,请参见对parfor循环中的变量进行故障诊断。
您可以使用tic和toc对一个parfor循环进行配置,以测量与对应的for循环相比的加速速度。使用ticBytes和tocBytes来度量有多少数据被传输到并行池中的worker和从worker传输的数据。有关更多信息和示例,请参见分析parfor循环
在某些情况下,必须修改代码以将for循环转换为parfor循环。这个示例展示了如何使用一个简单的嵌套for循环诊断和修复parfor循环问题。在MATLAB®中运行此代码并检查结果。for x = 0:0.1:1 for k = 2:10 x(k) = x(k-1) + k; end xend为了加速代码,尝试将for循环转换为parfor循环。注意这段代码会产生错误。parfor x = 0:0.1:1 parfor k = 2:10
与 MATLAB 的解决方案不同,变量与其变量名称一起保存。 您必须为要保存的每个变量调用此函数,但该函数不会覆盖以前的 mat 文件。
函数解析(fname,数据)
var_name=genvarname(inputname(2)); eval([var_name '=data'])
尝试保存(fname,var_name,'-append') 抓住保存(fname,var_name) 结尾
在并行池里的workers上运行parfor来使用并行处理
并行工具箱支持交互式并行计算,并且通过并行池中运行的多个workers上加速工作流。在并行池中的workers上使用parfor执行for-loop迭代。当你已经形成你的代码,并且定义慢的for-loop,尝试增加parfor进去。在桌面开发parfor-loops和放大到集群是不会改变代码。
parfor
在并行池...
首先创建一个并行池。
然后构造一个ParforProgMon对象:
ppm = ParforProgMon(strWindowTitle, nNumIterations <, nProgressStepSize, nWidth, nHeight>);
strWindowTitle是一个字符串,其中包含进度条窗口的标题。 nNumIterations是一个整数,其中包含循环中的迭代总数。
nProgressStepSize指定每次经过此步骤数时更新进度条。 nWidth和nHei
检查代码段中是否有控制随机数生成的函数–rng(),如果有,将其改写为rng(,‘twister’)。
原因是for
循环中默认的随机数生成器是’twister‘,而
parfor则是’combRecursive’(这种bug找起来太费劲了,因为
parfor很难检查输入输出流)
Matlab的parfor并行编程
通常消耗最多计算资源的程序往往是循环。把循环并行化,或者优化循环体中的代码是最常用的加快程序运行速度的思路。Matlab提供了parfor关键字,可以很方便的在多核机器或集群上实现并行计算。
parfor关键字的使用
由for关键字引导的循环通常为串行运行,如果改为parfor则可以由多个worker以并行方式执行。parfor可以将n次循环分解为
使用
matlabpool 命令启动多个workers,使用
parfor指令。自己的电脑上是4核4进程,开启4个workers:
matlabpool 4
关闭时用
matlabpool close
parfor的语法和普通的for语法没有区别:
for i = 1:N
f(i);
parfor i = 1:N
parfor i = 0 : M * N * R - 1
ii = floor(i / (N * R)) + 1;
jj = floor(mod(i, N * R) / R) + 1;
kk = mod(i, ...
【paper 学习】3、Accurate and Efficient Wireless Device Fingerprinting Using Channel State Information
weixin_45802543: