使用 parfor
以交互方式并行运行循环
在这个示例中,您从缓慢的 for
循环开始,然后使用 parfor
循环来加快计算速度。parfor
将 for
循环迭代的执行拆分到并行池中的工作单元上。
此示例计算矩阵的谱半径,并将 for
循环转换为 parfor
循环。了解如何测量最终的加速效果。
在 MATLAB® 编辑器中,输入以下
for
循环。添加tic
和toc
来测量经过的时间。tic n = 200; A = 500; a = zeros(n); for i = 1:n a(i) = max(abs(eig(rand(A)))); end toc
运行脚本并记录经过的时间。
Elapsed time is 31.935373 seconds.
在脚本中,将
for
循环替换为parfor
循环。tic n = 200; A = 500; a = zeros(n); parfor i = 1:n a(i) = max(abs(eig(rand(A)))); end toc
运行新脚本,然后再次运行它。请注意,第一次运行比第二次运行慢,因为并行池需要一些时间来启动并使代码可供工作单元使用。记下第二次运行的经过时间。
默认情况下,MATLAB 会自动在本地计算机上开启一个并行工作单元池。
在四个工作单元上运行的Starting parallel pool (parpool) using the 'Processes' profile ... connected to 4 workers. ... Elapsed time is 10.760068 seconds.
parfor
比相应的for
循环运行快大约三倍。该加速比对四个工作单元进行四倍加速的理想值要小。这是由于并行开销,包括将数据从客户端传输到工作单元并返回所需的时间。此示例显示了良好的加速效果和相对较小的并行开销,并且受益于转换为parfor
循环。并非所有的for
循环迭代都可以转换为更快的parfor
循环。要了解更多信息,请参阅 决定何时使用 parfor。
使用 parfor
循环的一个关键要求是各个迭代必须独立。适合 parfor
处理的独立问题包括蒙特卡罗仿真和参数扫描。有关后续步骤,请参阅 将 for 循环转换为 parfor 循环。
在这个示例中,您通过将 for
循环转换为四个工作单元的 parfor
循环来加快计算速度。您可以通过增加并行池中的工作单元数量来进一步减少经过的时间,请参阅 将 parfor 循环扩展到集群和云。
您可以修改集群配置文件来控制运行循环的工作单元数量,以及工作单元是本地的还是在集群上。有关配置文件的更多信息,请参阅 发现集群并使用集群配置文件。
修改并行设置以控制是否自动创建并行池,以及在超时之前保持可用时间的长短。有关设置的更多信息,请参阅 指定并行设置。
您可以使用 parsim
命令并行运行 Simulink® 模型,而不是使用 parfor
循环。有关并行使用 Simulink 的更多信息和示例,请参阅 Running Multiple Simulations (Simulink)。