Loren关于MATLAB的艺术

将想法转化为MATLAB

工人跑!

今天的嘉宾帖来自肖恩·德Wolski他是洛伦的一位应用工程师同事。你可能在MATLAB的答案本周精选博客!

这篇博客文章将关注在所有命令上运行命令的方法的细微差别并行计算工具箱工人。

内容

背景

并行计算工具箱允许您打开无头MATLAB工作器,然后您可以将工作分配到其中,以加速您的代码或将其从MATLAB主会话中卸载。通常,有一些初始设置,您将希望在每个工作器上运行,以便为它们的运行做准备。一些例子包括:加载库、更改路径或打开Simulink模型。金宝app有三种不同的方法来解决这个问题,每种方法都有自己的特点。

这对我来说一直是一个困惑的来源,所以我最终研究了它,以确定何时使用它们。让我们回顾一下每一个用例。

pctRunOnAll

pctRunOnAll将同步运行,一次可以运行一个命令,不能有输出返回。它在所有工作器上运行该命令客户端。

pctRunOnAll应该用于任何类型的设置,在没有输出预期,没有工人忙碌。如果有一个工作线程处于繁忙状态,控制将不会被返回,直到它在每个工作线程上运行,所以这可能需要一段时间来等待非空闲的工作线程完成。

由于它运行在所有的工人和客户端上,我喜欢在加载Simulink模型时使用它,因为这样我可以直观地确保在客户端机器上打开正确的模型。金宝app

它使用命令语法,所以所有内容都必须定义为字符串。例如:

pctRunOnAll加载(“Data.mat”)

这使得参数化输入变得更加困难,也就是说,您将需要使用sprintf和朋友,所以如果将有很多变化的命令正在运行,它可能会值得看spmd.但是,对于基于命令行的快速一次性操作来说,它是很好的。下面是一个如何在上面的例子中提供mat文件名称的例子:

文件=“Data.mat”;pctRunOnAll (sprintf (“负载(“% s”)”、文件)

pctRunOnAll如果并行池未打开,也不会自动启动并行池。它将返回一个错误。如果使用默认值,其他两种方法会将并行池卷起来偏好“当检测到某些语言特性时,自动创建一个并行池”。

SPMD

spmd代表单程序,多数据.它将在并行池中的所有工作人员上同步运行同一组命令,但客户端除外。

spmd除了在每个worker上运行相同的命令,还有很多用途,你可以根据worker的索引使用这个函数来管理每个worker上发生的事情labindex.因此,它允许完整的消息传递并行化。

对于在每个worker上运行相同的命令,将多个命令组合在一起作为spmd块运行并允许您存储输出。让我们在每个worker上随机设置一个10000x1的向量,然后取其平均值来模拟一个简单的中心极限定理的蒙特卡罗模拟:

spmdx =兰德(10000 1);xmean =意味着(x);结束

xxmean复合数组意味着每个worker都有自己的值,数据存储在worker的内存中。你可以用花括号(比如单元格数组)对其进行索引,以获取任何特定元素的本地副本,或者修改特定worker上的元素。

xmeans = [xmean {}):;disp (xmeans)
0.50508 - 0.50163

我有两个工人,所以xmeans是1 x2。

使用spmd是否要求并行池是SpmdEnabled.这个设置可以在启动池时更改,默认情况下是开启的。关闭此功能的一个原因是,如果一个或多个工人死亡,剩余的工人仍然可以使用parfor循环或parfeval声明中没有死亡工人。

parfevalOnAll

parfevalOnAll,在R2013b中首次发布,带有新的并行计算API,是评估worker函数的最新和最好的工具。它异步运行,并允许您返回输出。输入必须是一个函数,所以您需要将您的命令封装到一个函数中,无论是在文件中还是匿名中。

这里最大的特点是它是异步的;也就是说,一旦你运行parfevalOnAll命令,并提交期货,控制返回到MATLAB命令提示符,这样您可以继续工作和运行其他东西。对于任何计算密集型的操作,或者任何由用户界面驱动的操作(在操作运行时,您希望用户界面继续发挥作用),都应该考虑使用这种方法。

就像spmdparfevalOnAll将启动一个并行池,并且只在工人上运行。

下面是一个简单的例子来证明的力量parfevalOnAll.让我们在本地运行一个计算开销很大的命令,以了解它需要多长时间。

f = @optimizeCraneSwing;Tic xs = f();toc
运行时间是28.676841秒。

现在卸载它,让两个工人都运行:

tic期货= parfevalOnAll(f, 1);Tsubmit = toc disp(“期货提交;命令行访问返回!')等(期货);Tfinish = toc disp(“期货完成”
tsubmit = 0.0089678期货已交;命令行访问返回!tfinish = 37.641期货成交

注意,命令行访问几乎立即返回,而期货稍后完成。为了获得准确的时间,我等待他们完成,如果你需要在继续之前的结果,这是一个必要的步骤。但是,如果不需要结果,可以查询“状态”直到他们成为完成了然后获取输出。

期货。状态
ans =完成

如果你想让它自动化,一个计时器定期查询状态。

表的权衡

最后,作为快速参考,这里有一个权衡表,以帮助您在未来的决策。

缺乏PARFOR

你可能已经注意到了parfor未在上述名单中出现。平行-循环做自己的内部负载平衡,这不能保证每个worker的利用率,因此不能依赖。

评论和反馈

您以前使用过这些方法吗?你有什么偏好或警示故事吗?分享它在这里




MATLAB®R2016a发布

|
  • 打印
  • 发送电子邮件

评论

要留下评论,请点击在这里以登录您的MathWorks帐户或创建一个新的帐户。