决定何时使用parfor
在MATLAB parfor-Loops
一个parfor
在MATLAB循环®并行执行循环体中的一系列语句。MATLAB客户端发出parfor
命令,并与MATLAB的worker协调,在a的worker上并行执行循环迭代平行池.客户端发送必要的数据parfor
操作到工作者,在那里执行大部分的计算。结果被发送回客户端并进行组装。
一个parfor
-loop可以提供比类似函数更好的性能为
-loop,因为几个MATLAB工作者可以在同一个循环上同时计算。
每执行一个主体parfor
循环是一个迭代.MATLAB工作者对迭代的评估没有特定的顺序,彼此独立。因为每个迭代都是独立的,所以不能保证迭代以任何方式同步,也不需要这样做。如果worker的数量等于循环迭代的数量,每个worker执行循环的一次迭代。如果迭代比工作人员多,一些工作人员执行多个循环迭代;在这种情况下,一个worker可能一次接收多个迭代以减少通信时间。
决定何时使用parfor
一个parfor
-loop可以很有用,如果你有一个慢为
循环。考虑parfor
如果你有:
有些循环迭代需要很长时间才能执行。在这种情况下,工作人员可以同时执行长迭代。确保迭代的数量超过工作人员的数量。否则,您将不能使用所有可用的工作者。
许多循环迭代的简单计算,如蒙特卡洛模拟或参数扫描。
parfor
将循环迭代划分为组,以便每个工作人员执行迭代总数的一部分。
一个parfor
-loop可能不太有用,如果你有:
对象向量化的代码
为
循环。一般来说,如果您想让代码运行得更快,首先要尝试向量化它。有关如何执行的详细信息,请参见向量化.向量化代码允许您从许多底层MATLAB库的多线程特性所提供的内置并行性中获益。但是,如果您有向量化的代码并且只能访问当地的工人,然后parfor
-循环可能运行得比为
循环。不去撤消代码以允许parfor
;一般来说,这种解决方案效果不好。执行时间较短的循环迭代。在这种情况下,并行开销主导了您的计算。
您不能使用parfor
-loop当你的循环中的一个迭代依赖于其他迭代的结果时。每个迭代必须独立于所有其他迭代。有关处理独立循环的帮助,请参见确保parfor-Loop迭代是独立的.此规则的例外是在循环中使用减少变量.
在决定何时使用时parfor
,考虑并行开销。并行开销包括通信、协调和数据传输(发送和接收数据)所需的时间,从客户端到工作人员并返回。如果迭代计算是快速的,这个开销可能是总时间的一个重要部分。考虑两种不同类型的循环迭代:
为
-循环的计算要求任务。这些循环通常是转换为a的很好的候选者parfor
-loop,因为计算所需的时间超过数据传输所需的时间。为
-循环使用一个简单的计算任务。这些循环通常不会从转换为parfor
-loop,因为数据传输所需的时间与计算所需的时间相比是显著的。
的例子parfor
低并行开销
在本例中,您从一个需要计算量的任务开始为
循环。的为
-循环比较慢,你可以使用parfor
循环。parfor
的执行拆分为
-循环迭代并行池中的工作线程。
这个例子计算了一个矩阵的谱半径,并将一个为
循环到一个parfor
循环。了解如何度量产生的加速,以及并行池中的工作者之间传输了多少数据。
在MATLAB编辑器中,输入以下内容
为
循环。添加抽搐
而且toc
测量计算时间。Tic n = 200;一个= 500;一个= 0 (n);为i = 1:n a(i) = max(abs(eig(rand(a))));结束toc
运行该脚本,并注意所花费的时间。
运行时间为31.935373秒。
在脚本中替换
为
循环用parfor
循环。添加ticBytes
而且tocBytes
测量并行池中的工作者之间的数据传输量。抽搐ticBytes (gcp);n = 200;一个= 500;一个= 0 (n);parfori = 1:n a(i) = max(abs(eig(rand(a))));结束tocBytes toc (gcp)
在四个工作人员上运行新脚本,然后再运行一次。注意,第一次运行比第二次运行慢,因为并行池需要一些时间来启动并使代码对工作者可用。注意第二次运行的数据传输和运行时间。
默认情况下,MATLAB会自动在本地机器上打开一个并行工作池。
使用“Processes”配置文件启动并行池(parpool)…连接到4个工人. ...bytesessenttoworkers BytesReceivedFromWorkers __________________ ________________________ 1 15340 7024 2 13328 5712 3 13328 5704 4 13328 5728 Total 55324 24168流逝时间为10.760068秒。
parfor
在四个工人上运行大约比相应的速度快三倍为
循环计算。这种加速比理想的四倍加速要小。这是由于并行开销,包括将数据从客户机传输到工作者和返回所需的时间。使用ticBytes
而且tocBytes
结果,以检查传输的数据量。假设数据传输所需的时间与数据的大小成正比。这种近似使您可以得到数据传输所需时间的指示,并将并行开销与其他开销进行比较parfor
循环迭代。在本例中,与下一个示例相比,数据传输和并行开销较小。
当前示例具有较低的并行开销,并且从转换为parfor
循环。请将此示例与下一个示例中的简单循环迭代进行比较具有高并行开销的parfor示例.
再举一个例子parfor
-循环与计算要求的任务,见嵌套的语句替换和for循环以及其他语句替换需求
的例子parfor
高并行开销
在本例中,您编写了一个循环来创建一个简单的正弦波。取代了为
循环用parfor
循环并不加快计算速度。这个循环没有很多迭代,执行时间不长,您不会注意到执行速度的提高。此示例具有很高的并行开销,并且不能从转换为parfor
循环。
写一个循环来创建一个正弦波。使用
抽搐
而且toc
测量所消耗的时间。Tic n = 1024;一个= 0 (n);为i = 1:n A(i,:) = (1:n) .* sin(i*2*pi/1024);结束toc
运行时间为0.012501秒。
取代
为
循环用parfor
循环。添加ticBytes
而且tocBytes
测量并行池中的工作者之间的数据传输量。抽搐ticBytes (gcp);n = 1024;一个= 0 (n);parfor(i = 1:n) A(i,:) = (1:n) .* sin(i*2*pi/1024);结束tocBytes toc (gcp)
在四个工人上运行脚本,然后再次运行代码。注意,第一次运行比第二次运行慢,因为并行池需要一些时间来启动并使代码对工作者可用。注意第二次运行的数据传输和运行时间。
bytesessenttoworkers BytesReceivedFromWorkers __________________ ________________________ 1 13176 2.0615e+06 2 15188 2.0874e+06 3 13176 2.4056e+06 4 13176 1.8567e+06 Total 54716 8.4112e+06 Elapsed time is 0.743855 seconds。
为
-loop than for theparfor
-循环在四个工人。在这种情况下,您无法从转换您的为
循环到一个parfor
循环。原因是数据传输比前面的例子要大得多具有低并行开销的parfor示例.在当前示例中,并行开销占据了计算时间的大部分。因此,正弦波迭代不会从转换成a中受益parfor
循环。
这个例子说明了为什么高并行开销计算不能从转换为parfor
循环。要了解有关加速代码的更多信息,请参见将for-Loops转换为parfor-Loops