决定何时使用parfor
在MATLAB parfor-Loops
一个parfor
在MATLAB循环®执行一系列的语句在并行循环体。MATLAB客户端问题parfor
指挥和协调与MATLAB工人并行执行循环迭代的工人平行池。客户端发送必要的数据parfor
操作工人,大部分的计算执行。结果发送回客户机和组装。
一个parfor
比类似的循环可以提供更好的性能为
循环,因为几个MATLAB工人可以同时计算在同一循环。
身体的每个执行的parfor
循环是一个迭代。MATLAB工人评估迭代没有特定的顺序和彼此独立的。因为每次迭代都是独立的,不能保证迭代以任何方式都是同步的,也没有必要。如果工人的数量等于循环迭代的数量,每个工人执行的一个迭代循环。如果有更多的迭代比工人,一些工人执行超过一个循环迭代;在这种情况下,一个工人可能会收到多个迭代,以减少沟通时间。
决定何时使用parfor
一个parfor
如果你有一个缓慢的循环可以有用为
循环。考虑parfor
如果你有:
一些循环迭代,需要很长时间来执行。在这种情况下,员工可以同时执行长的迭代。确保迭代次数超过工人的数量。否则,你不会使用所有可用的工人。
许多循环迭代的一个简单的计算,如蒙特卡罗模拟法或扫描参数。
parfor
循环迭代分为团体,每个工人总数的一部分执行迭代。
一个parfor
循环可能不是有用的,如果你有:
矢量化的代码
为
循环。一般来说,如果你想让代码运行得更快,第一次尝试它进行向量化。如何做到这一点的详细信息,请参见向量化。Vectorizing代码允许您将受益于提供的内置并行多线程许多潜在的MATLAB库的性质。然而,如果你向量化代码只能访问当地的工人,然后parfor
循环可能会低于为
循环。不devectorize代码允许吗parfor
;一般来说,这个解决方案没有很好的工作。循环迭代,短时间内执行。在这种情况下,并行开销占据你的计算。
你不能使用parfor
循环当迭代循环的结果取决于其他迭代。每个迭代都必须独立于其他。帮忙处理独立循环,明白了确保parfor-Loop迭代是独立的。这条规则的例外是积累值在一个循环中使用减少变量。
在决定何时使用parfor
,考虑并行开销。并行开销包括所需的时间沟通、协调和数据传输,发送和接收数据,从客户到工人和回来。如果快速迭代评估,此开销可能的总时间的重要组成部分。考虑两种不同类型的循环迭代:
为
循环计算要求的任务。这些循环一般适合使用转换成一个parfor
循环,因为所需的时间计算在数据传输所需的时间。为
循环用一个简单的计算任务。这些循环通常不受益于转换成一个parfor
循环,因为数据传输所需的时间是重要而计算所需的时间。
的例子parfor
并行开销较低
在本例中,您从一个计算要求的任务在一个开始为
循环。的为
循环缓慢,你加快计算使用parfor
循环。parfor
分裂的执行为
工人在一个平行的池循环迭代。
这个例子计算矩阵的谱半径和转换为
循环到一个parfor
循环。找出如何衡量产生的加速和多少数据转移的工人在并行池。
在MATLAB编辑器中,输入以下
为
循环。添加抽搐
和toc
测量计算时间。抽搐n = 200;一个= 500;一个= 0 (n);为i = 1: n (i) = max (abs (eig(兰德(a))));结束toc
运行脚本,注意时间。
运行时间是31.935373秒。
在脚本中,取代
为
循环用parfor
循环。添加ticBytes
和tocBytes
测量多少数据转移的工人在并行池。抽搐ticBytes (gcp);n = 200;一个= 500;一个= 0 (n);parfori = 1: n (i) = max (abs (eig(兰德(a))));结束tocBytes toc (gcp)
运行新脚本在四个工人,并再次运行它。注意,第一个比第二个慢跑,因为平行池需要一些时间开始,使可用的代码工人。注意,数据传输和第二运行花费的时间。
默认情况下,MATLAB自动打开一个平行的工人在本地机器上。
开始平行池(parpool)使用“本地”概要文件…连接到4工人……BytesSentToWorkers BytesReceivedFromWorkers _____________ ________________________ 1 15340 7024 13328 5712 3 13328 5704 13328 5728 55324 24168运行时间是10.760068秒。
parfor
运行在四名工人比相应的三倍为
循环计算。的加速小于理想的加速因子四个四个工人。这是由于并行开销,包括从客户端传输数据所需的时间和工人。使用ticBytes
和tocBytes
结果检查传输的数据量。假设数据传输所需的时间数据的大小成正比。这个近似允许您获取显示数据传输所需的时间,并比较与其他并行开销parfor
循环迭代。在本例中,数据传输和并行开销与下一个示例比较起来,仍然算小的。
当前的例子有一个低开销和受益于转换成平行parfor
循环。这个例子比较简单的循环迭代在下一个示例中,看到的parfor并行开销高的例子。
的另一个例子parfor
循环计算要求的任务,明白了嵌套parfor和for循环和其他parfor需求
的例子parfor
具有高并行开销
在本例中,您写一个循环来创建一个简单的正弦波。取代了为
循环用parfor
循环并不加快你的计算。这个循环没有大量的迭代,它不花很长时间来执行,你不注意提高执行速度。这个例子中有一个高并行开销和不受益于转换成一个parfor
循环。
编写一个循环来创建一个正弦波。使用
抽搐
和toc
测量时间。抽搐n = 1024;一个= 0 (n);为i = 1: n(我:)= (1:n)。*罪(我* 2 *π/ 1024);结束toc
运行时间是0.012501秒。
取代
为
循环用parfor
循环。添加ticBytes
和tocBytes
测量多少数据转移的工人在并行池。抽搐ticBytes (gcp);n = 1024;一个= 0 (n);parfor(i = 1: n)(我:)= (1:n)。*罪(我* 2 *π/ 1024);结束tocBytes toc (gcp)
运行脚本在四个工人并再次运行代码。注意,第一个比第二个慢跑,因为平行池需要一些时间开始,使可用的代码工人。注意,数据传输和第二运行花费的时间。
BytesSentToWorkers BytesReceivedFromWorkers _____________ ________________________ 1 13176 2.0615 e + 06 2 15188 2.0874 e + 06年3 13176 2.4056 1.8567 e + e + 06年4 13176 06总54716 8.4112 e + 06年运行时间是0.743855秒。
为
循环比parfor
循环在四个工人。在这种情况下,您不受益于你的为
循环到一个parfor
循环。传输数据的原因是远远大于在上一个示例中,看到的parfor并行开销较低的例子。在当前的例子中,并行开销占据了计算时间。因此正弦波迭代不受益于转换成一个parfor
循环。
这个例子说明了为什么高并行计算开销不受益于转换成一个parfor
循环。了解更多关于加快代码,请参阅for循环转换成parfor-Loops