主要内容

决定何时使用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循环。找出如何衡量产生的加速和多少数据转移的工人在并行池。

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

    抽搐n = 200;一个= 500;一个= 0 (n);i = 1: n (i) = max (abs (eig(兰德(a))));结束toc
  2. 运行脚本,注意时间。

    运行时间是31.935373秒。

  3. 在脚本中,取代循环用parfor循环。添加ticBytestocBytes测量多少数据转移的工人在并行池。

    抽搐ticBytes (gcp);n = 200;一个= 500;一个= 0 (n);parfori = 1: n (i) = max (abs (eig(兰德(a))));结束tocBytes toc (gcp)

  4. 运行新脚本在四个工人,并再次运行它。注意,第一个比第二个慢跑,因为平行池需要一些时间开始,使可用的代码工人。注意,数据传输和第二运行花费的时间。

    默认情况下,MATLAB自动打开一个平行的工人在本地机器上。

    开始平行池(parpool)使用“本地”概要文件…连接到4工人……BytesSentToWorkers BytesReceivedFromWorkers _____________ ________________________ 1 15340 7024 13328 5712 3 13328 5704 13328 5728 55324 24168运行时间是10.760068秒。
    parfor运行在四名工人比相应的三倍循环计算。的加速小于理想的加速因子四个四个工人。这是由于并行开销,包括从客户端传输数据所需的时间和工人。使用ticBytestocBytes结果检查传输的数据量。假设数据传输所需的时间数据的大小成正比。这个近似允许您获取显示数据传输所需的时间,并比较与其他并行开销parfor循环迭代。在本例中,数据传输和并行开销与下一个示例比较起来,仍然算小的。

当前的例子有一个低开销和受益于转换成平行parfor循环。这个例子比较简单的循环迭代在下一个示例中,看到的parfor并行开销高的例子

的另一个例子parfor循环计算要求的任务,明白了嵌套parfor和for循环和其他parfor需求

的例子parfor具有高并行开销

在本例中,您写一个循环来创建一个简单的正弦波。取代了循环用parfor循环并加快你的计算。这个循环没有大量的迭代,它不花很长时间来执行,你不注意提高执行速度。这个例子中有一个高并行开销和不受益于转换成一个parfor循环。

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

    抽搐n = 1024;一个= 0 (n);i = 1: n(我:)= (1:n)。*罪(我* 2 *π/ 1024);结束toc
    运行时间是0.012501秒。
  2. 取代循环用parfor循环。添加ticBytestocBytes测量多少数据转移的工人在并行池。

    抽搐ticBytes (gcp);n = 1024;一个= 0 (n);parfor(i = 1: n)(我:)= (1:n)。*罪(我* 2 *π/ 1024);结束tocBytes toc (gcp)

  3. 运行脚本在四个工人并再次运行代码。注意,第一个比第二个慢跑,因为平行池需要一些时间开始,使可用的代码工人。注意,数据传输和第二运行花费的时间。

    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

另请参阅

||

相关的话题