主要内容

决定何时使用议案

Parlab中的循环

一种议案在MATLAB循环®并行执行循环体中的一系列语句。MATLAB客户端发布议案命令,并与MATLAB工作者协调,以并行执行循环迭代的工人在a平行池.客户端发送必要的数据议案运营到工人,其中大部分计算都是在执行的地方。结果将被发送回客户端并组装。

一种议案-Loop可以提供比其类似的更好的性能为了-loop,因为几个MATLAB工作人员可以在同一个循环上同时进行计算。

每次执行身体议案-loop是一个迭代.Matlab Workers在没有特定的秩序中评估迭代,彼此独立。由于每个迭代是独立的,因此无法保证迭代以任何方式同步,也不需要这一点。如果工人数量等于循环迭代的数量,则每个工作人员执行循环的一次迭代。如果有更多的迭代,一些工人执行多于一个循环迭代;在这种情况下,工作人员可以一次接收多个迭代以减少通信时间。

决定何时使用parcom

一种议案- 如果你有慢速,它可能很有用为了循环。考虑议案如果你有:

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

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

一种议案- 如果您有:

  • 向量化的代码为了循环。通常,如果您想让代码运行得更快,首先尝试向量化它。具体操作方法请参见向量化.矢量化代码允许您从内置的Matlab库的多线程性质提供的内置并行性中受益。但是,如果您有矢量化代码,并且您只有访问权限当地的工人,然后议案- 砍伐可能比为了循环。不要划分代码以允许议案;一般来说,这个解决方案并不能很好地工作。

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

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

在决定何时使用时议案,考虑并行开销。并行开销包括通信,协调和数据传输 - 发送和接收数据所需的时间 - 从客户到工人和后退。如果迭代评估快速,则此开销可能是总时间的重要部分。考虑两种不同类型的循环迭代:

  • 为了-循环一个需要计算的任务。这些循环通常是转换为议案-loop,因为计算所需的时间超过了数据传输所需的时间。

  • 为了-循环一个简单的计算任务。这些循环通常不能从转换为议案- 因此,与计算所需的数据传输所需的时间与计算所需的时间有效。

的例子议案低并行开销

在此示例中,您可以从一个计算所需的苛刻的任务开始为了循环。这为了- leops很慢,你加快计算使用议案循环。议案分裂执行为了- 在并行池中的工人上迭代。

该示例计算矩阵的频谱半径并转换a为了循环到一个议案循环。了解如何度量产生的加速,以及向并行池中的工作人员传输和从工作人员传输多少数据。

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

    Tic n = 200;a = 500;a =零(n);为了a(i) = max(abs(eig(rand(a))));结尾toc
  2. 运行脚本,并注意经过的时间。

    经过时间是31.935373秒。

  3. 在脚本中,更换为了- 与A.议案循环。添加ticBytestocbytes.要测量并行池中从工人转移多少数据。

    抽搐ticBytes (gcp);n = 200;a = 500;a =零(n);议案a(i) = max(abs(eig(rand(a))));结尾tocBytes toc (gcp)

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

    默认情况下,Matlab会自动打开本地计算机上的并行工人池。

    使用“本地”配置文件启动并行池(Parpool)...连接到4名工人。... BytessentToworks BytesreceivedFrom Wherwworkers __________________ ______________________15340 7024 2 13328 5712 3 13328 5704 4 13328 5728总共55324 24168经过时间为10.760068秒。
    议案运行在4个工位上的速度大约是相应工位的3倍为了循环计算。这个速度比四个工人理想速度的四倍还要小。这是由于并行开销造成的,包括将数据从客户端传输到工作者和传回所需的时间。使用ticBytestocbytes.结果检查转移的数据量。假设数据传输所需的时间与数据的大小成比例。此近似允许您介绍数据传输所需的时间,并与其他相比并行开销进行比较议案循环迭代。在本例中,与下一个示例相比,数据传输和并行开销较小。

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

另一个例子议案- 使用计算要求苛刻的任务,请参阅嵌套parfor循环和for循环以及其他parfor需求

的例子议案高平行的开销

在此示例中,您写入循环以创建一个简单的正弦波。更换为了- 与A.议案循环并不是加快你的计算速度。这个循环没有很多迭代,执行时间不长,并且您不会注意到执行速度的提高。这个例子有很高的并行开销,不能从转换为议案循环。

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

    Tic n = 1024;一个= 0 (n);为了A(i,:) = (1:n) .* sin(i*2*pi/1024);结尾toc
    运行时间是0.012501秒。
  2. 更换为了- 与A.议案循环。添加ticBytestocbytes.要测量并行池中从工人转移多少数据。

    抽搐ticBytes (gcp);n = 1024;一个= 0 (n);议案A(i,:) = (1:n) .* sin(i*2*pi/1024);结尾tocBytes toc (gcp)

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

    BytessentToworks BytesreceivedFromWorkers ________________________________________113176 2.0615E + 06 2 15188 2.0874C + 06 3 13176 2.4056C 2.4056C + 06 4 13176 1.8567E + 06总共54716 8.4112E + 06经过的时间为0.743855秒。
    注意,对于串行,经过的时间要短得多为了-循环比for循环议案- 在四名工人身上。在这种情况下,您不会受益转动您的为了循环到一个议案循环。原因是传输的数据比前面的例子要大得多,见具有低平行开销的Parcol的示例.在当前的例子中,并行开销占了计算时间的主要地位。因此,正弦波迭代并不利于转换为议案循环。

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

也可以看看

||

相关话题