主要内容

决定何时使用parfor

在MATLAB parfor-Loops

一个parfor-MATLAB中的循环®并行执行循环体中的一系列语句。MATLAB客户端发布parfor命令并与MATLAB workers协调,以在一个特定的环境中对workers并行执行循环迭代平行池.客户端发送必要的数据parfor操作到工人,在那里大部分的计算被执行。结果被发送回客户端并进行组装。

一个parfor-loop可以提供比其类似功能更好的性能-循环,因为几个MATLAB工作人员可以在同一个循环上同时计算。

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

决定何时使用parfor

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

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

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

一个parfor-loop可能不会有用,如果你有:

  • 已矢量化出-循环。通常,如果您想让代码运行得更快,首先尝试将其矢量化。有关如何执行此操作的详细信息,请参阅矢量化.向量化代码使您能够从许多底层MATLAB库的多线程特性所提供的内置并行性中获益。但是,如果您有向量化的代码,并且您只能访问地方的工人,那么parfor-loops可能运行得比循环。不去除代码允许parfor; 一般来说,此解决方案不起作用。

  • 循环迭代,需要很短的时间来执行。在这种情况下,并行开销主导了您的计算。

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

在决定何时使用时parfor,考虑并行开销。并行开销包括通信、协调和数据传输所需的时间——从客户端到工作人员再返回数据的发送和接收。如果迭代计算非常快,那么这种开销将占总时间的很大一部分。考虑两种不同类型的循环迭代:

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

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

举例parfor具有较低的并行开销

在这个例子中,您从一个计算要求很高的任务开始循环。的-循环是缓慢的,你加快计算使用parfor-而是循环。parfor分割执行对并行池中的工作人员进行循环迭代。

这个例子计算一个矩阵的光谱半径,并转换-绕成一圈parfor-循环。了解如何测量结果的加速比,以及并行池中的工作线程之间传输了多少数据。

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

    Tic n = 200;一个= 500;一个= 0 (n);i=1:na(i)=最大值(abs(eig(rand(a));结束toc
  2. 运行脚本,并记录运行时间。

    运行时间为31.935373秒。

  3. 在脚本中,替换循环用parfor循环。添加ticBytestocBytes测量有多少数据被传输到并行池中的工作人员或从工作人员那里。

    抽搐ticBytes (gcp);n = 200;一个= 500;一个= 0 (n);parfori=1:na(i)=最大值(abs(eig(rand(a));结束toc字节(gcp)toc

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

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

    使用“local”配置文件启动并行池(parpool)…连接到4个工人. ...bytesenttoworkers BytesReceivedFromWorkers __________________ ________________________ 1 15340 7024 2 13328 5712 3 13328 5704 4 13328 5728 Total 55324 24168 Elapsed time is 10.760068 seconds。
    parfor在四名工人身上运行的速度大约是相应速度的三倍-循环计算。该速度比理想的四对四工作进程的速度小。这是由于并行开销,包括从客户端向工作进程传输数据所需的时间。使用ticBytestocBytes结果来检查传输的数据量。假设数据传输所需的时间与数据的大小成正比。这种近似允许您得到数据传输所需时间的指示,并将您的并行开销与其他并行开销进行比较parfor-循环迭代。在本例中,与下一个示例相比,数据传输和并行开销较小。

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

另一个例子parfor-loop与计算要求的任务,参见嵌套parfor和for循环以及其他parfor要求

举例parfor具有高并行开销

在这个例子中,您编写一个循环来创建一个简单的正弦波。取代了循环用parfor-循环加快你的计算速度。这个循环没有太多的迭代,执行时间也不长,而且您不会注意到执行速度的提高。此示例具有很高的并行开销,并且不能从转换为parfor循环。

  1. 编写一个循环以创建正弦波。使用抽搐toc来测量经过的时间。

    tic n=1024;A=0(n);i=1:na(i,:)=1:n.*sin(i*2*pi/1024);结束toc
    运行时间为0.012501秒。
  2. 取代循环用parfor循环。添加ticBytestocBytes测量有多少数据被传输到并行池中的工作人员或从工作人员那里。

    tic ticBytes(gcp);n=1024;A=0(n);parfor(i=1:n)A(i,:)=1:n.*sin(i*2*pi/1024);结束toc字节(gcp)toc

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

    bytesenttoworkers 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。
    请注意,串行通信的运行时间要小得多-循环比为parfor-循环四个工人。在这种情况下,你不会受益于你的-绕成一圈parfor-循环。原因是数据传输比上一个示例中的要大得多,请参见具有低并行开销的parfor示例. 在当前示例中,并行开销控制着计算时间。因此,正弦波迭代不能从转换为parfor循环。

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

另请参阅

||

相关的话题