主要内容

决定何时使用parfor

MATLAB中的parfor-Loops

一个parforMATLAB中的-loop®并行执行循环体中的一系列语句。MATLAB客户端发出parfor命令并与MATLAB worker协调,在a中的worker上并行执行循环迭代平行池.客户端发送必要的数据parfor操作到工作者,其中执行大部分计算。结果被发送回客户端并进行组装。

一个parfor-loop可以提供比类似方法更好的性能-loop,因为几个MATLAB worker可以在同一个循环上同时计算。

每次执行正文的一个parfor-loop是一个迭代.MATLAB工作人员评估迭代没有特定的顺序,彼此独立。因为每个迭代都是独立的,所以不能保证迭代以任何方式同步,也不需要这样做。如果工作人员的数量等于循环迭代的数量,每个工作人员执行循环的一次迭代。如果迭代比工作者多,一些工作者执行多个循环迭代;在这种情况下,工作人员可能一次接收多个迭代以减少通信时间。

决定何时使用parfor

一个parfor如果你有一个缓慢的循环。考虑parfor如果你有:

  • 一些循环迭代需要很长时间才能执行。在这种情况下,工作人员可以同时执行长迭代。确保迭代的数量超过工作人员的数量。否则,您将无法使用所有可用的worker。

  • 许多循环迭代的简单计算,如蒙特卡罗模拟或参数扫描。parfor将循环迭代划分为组,以便每个工作人员执行迭代总数的一部分。

一个parfor-loop可能没有用处,如果你有:

  • 向量化出来的代码循环。通常,如果您想让代码运行得更快,首先要尝试向量化它。有关如何做到这一点的详细信息,请参见向量化.向量化代码允许您从许多底层MATLAB库的多线程特性所提供的内置并行性中受益。但是,如果您有向量化的代码,并且只能访问当地的工人,然后parfor-loops可能比循环。不去矢量化代码允许parfor;一般来说,这种解决方案效果不佳。

  • 执行时间较短的循环迭代。在这种情况下,并行开销主导着您的计算。

你不能使用parfor当循环中的迭代依赖于其他迭代的结果时,使用-loop。每个迭代必须独立于所有其他迭代。有关处理独立循环的帮助,请参见确保parfor-Loop迭代是独立的.此规则的例外是在循环中使用减少变量

决定什么时候使用parfor,考虑并行开销。并行开销包括通信、协调和数据传输(发送和接收数据)所需的时间,从客户端到工作人员再返回。如果迭代计算是快速的,这个开销可能是总时间的一个重要部分。考虑两种不同类型的循环迭代:

  • -循环使用计算要求高的任务。这些循环通常是转换为parfor-loop,因为计算所需的时间支配着数据传输所需的时间。

  • 一个简单的计算任务。这些循环通常不会从转换为parfor-loop,因为数据传输所需的时间与计算所需的时间相比是显著的。

的例子parfor并行开销低

在本例中,从一个计算要求很高的任务开始循环。的-循环很慢,你可以使用parfor循环。parfor拆分执行-循环迭代并行池中的工作者。

这个例子计算了一个矩阵的谱半径,并转换了一个-循环成parfor循环。了解如何测量结果的加速,以及在并行池中有多少数据被传输给和从并行池中传输出来。

  1. 在MATLAB编辑器中,输入以下内容循环。添加抽搐而且toc测量计算时间。

    Tic n = 200;A = 500;A = 0 (n);i = 1:n a(i) = max(abs(eig(rand(a))));结束toc
  2. 运行脚本,并记录所消耗的时间。

    运行时间为31.935373秒。

  3. 在脚本中,替换带a的-循环parfor循环。添加ticBytes而且tocBytes度量并行池中的工作线程之间传输的数据量。

    抽搐ticBytes (gcp);N = 200;A = 500;A = 0 (n);parfori = 1:n a(i) = max(abs(eig(rand(a))));结束tocBytes toc (gcp)

  4. 在四个worker上运行新脚本,然后再次运行。请注意,第一次运行比第二次运行慢,因为并行池需要一些时间来启动并使代码对工作人员可用。注意第二次运行的数据传输和运行时间。

    默认情况下,MATLAB会自动在本地机器上打开并行工作池。

    使用'Processes'配置文件启动并行池(parpool)…连接到4个工人. ...BytesSentToWorkers BytesReceivedFromWorkers __________________ ________________________ 1 15340 7024 2 13328 5712 3 13328 5704 4 13328 5728 Total 55324 24168运行时间为10.760068秒。
    parfor在四个工人上运行大约比相应的速度快三倍循环计算。提速比理想提速要小,在4个工人上提速是4倍。这是由于并行开销造成的,包括将数据从客户机传输到工作线程并返回所需的时间。使用ticBytes而且tocBytes结果检查传输的数据量。假设数据传输所需的时间与数据的大小成正比。这个近似值允许您获得数据传输所需时间的指示,并将您的并行开销与其他并行开销进行比较parfor循环迭代。在这个例子中,与下一个例子相比,数据传输和并行开销很小。

当前示例具有较低的并行开销,并且可以从转换到parfor循环。将此示例与下一个示例中的简单循环迭代进行比较,请参见具有高并行开销的parfor示例

另一个例子是parfor-loop与计算要求的任务,参见嵌套的parfor和for-Loops和其他parfor需求

的例子parfor并行开销高

在本例中,您编写了一个循环来创建一个简单的正弦波。取代了带a的-循环parfor循环并加快计算速度。这个循环没有很多迭代,它不需要很长时间来执行,并且您没有注意到执行速度的增加。此示例具有很高的并行开销,并且不能从转换到parfor循环。

  1. 写一个循环来产生一个正弦波。使用抽搐而且toc测量所消耗的时间。

    Tic n = 1024;A = 0 (n);i = 1:n A(i,:) = (1:n) .* sin(i*2*pi/1024);结束toc
    运行时间为0.012501秒。
  2. 取代带a的-循环parfor循环。添加ticBytes而且tocBytes度量并行池中的工作线程之间传输的数据量。

    抽搐ticBytes (gcp);N = 1024;A = 0 (n);parfor(i = 1:n) A(i,:) = (1:n) .* sin(i*2*pi/1024);结束tocBytes toc (gcp)

  3. 在四个worker上运行脚本并再次运行代码。请注意,第一次运行比第二次运行慢,因为并行池需要一些时间来启动并使代码对工作人员可用。注意第二次运行的数据传输和运行时间。

    BytesSentToWorkers 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流逝时间为0.743855秒。
    注意,对于串行,所消耗的时间要小得多-loop than for的parfor-循环四个工人。在这种情况下,你不会从转向你的-循环成parfor循环。原因是数据的传输比前面的示例大得多,参见低并行开销的parfor示例.在当前示例中,并行开销支配着计算时间。因此,正弦波迭代并不受益于转换成aparfor循环。

这个例子说明了为什么高并行开销计算不能从转换为parfor循环。要了解有关加速代码的更多信息,请参见将for-Loops转换为parfor-Loops

另请参阅

||

相关的话题