并行编程与createJob

13个视图(30天)
嗨。我有一些困惑关于函数createJob和createTask。
我有一个函数,计算(a, b),回馈a和b之间的质数数目。它不使用函数isprime (x)。相反,它使用一个循环来检查是否每个数字a和b之间是质数。
现在假设我的目标是找质数数目a = 1, b = 30之间。我可以简单地写NumPrimes =计算(30);我将得到所需的值。我想让脚本运行得更快,所以我决定并行化(这是一个词吗?)代码。
我有三个工人,所以我做的是单独的数字1到30之间在三组:从1到10,11 - 20和21到30。
(显然我在实际的脚本使用更大的数字,我确保实验室的时间来执行每一组的数字很相似)
仅仅使用一个parfor / spmd函数,将每组分配给一个不同的实验室,减少运行时间执行。我想换一种方式吧。当我开始与我的代码的麻烦。
我决定创建一个工作提交三个不同的任务,每一个照顾一组不同的数字。并行的任务应该是跑,一旦工作完成检索每个任务的输出。这是代码:
matlabpool开3
工作= createJob (“配置”,“本地”,“FileDependencies”,{“compute.m”});
createTask(工作,@compute 1 {1, 10})
createTask(工作,@compute 1{11日20})
createTask(工作,@compute 1{21日30})
提交(工作)
等待(工作)
= getAllOutputArguments(工作);
这并没有像预期的那样运行。花了约3倍的时间比当我只是运行中的代码系列NumPrimes =计算(30);这是相反的我想要的……
我想我不理解createJob和createTask函数是如何工作的。我认为当一个创建三个任务和并行运行作业将运行在不同的工人,减少执行时间相比,一个串行执行。不能吧。工作似乎并不在系列还跑步,因为时间增加3倍…
我真的很困惑。如果有人可以告诉我正确的方向我欣赏。
谢谢。丹尼尔

接受的答案

托马斯Ibbotson
托马斯Ibbotson 2013年2月11日
嗨,丹尼尔,
问题是在第一行代码,你打开一个matlabpool。这不是必需的使用时的工作和任务,并将事实上消耗系统资源,不会再使用的提交工作。我的猜测是,你有一个4核机,matlabpool使用3的核心,这让剩下1上运行的工作,当你有3个任务运行在一个核心是3倍的时间。
所做的一切很好,只是删除第一行,打开matlabpool,再试一次。
干杯,汤姆
2的评论
托马斯Ibbotson
托马斯Ibbotson 2013年2月12日
当您创建一个独立的工作(使用createJob)每个任务的工作是独立于其他的任务,这意味着每个任务可以同时运行在可用的工人。
几乎没有区别创建3工作每1任务,和1 3的工作任务在每种情况下的任务将同时运行在可用的工人。每个工人将执行一个任务只在一个独立的工作。请注意,如果您使用的是一个独立的工作代码不应该“spmd”或“parfor”,这些都是仅供使用matlabpools。
如果你需要工人之间的通信,您可以使用并行作业,或者一个matlabpool工作。在这两个有一个任务是自动复制到所有可用的工人和同时运行。并行任务的代码等价于一个spmd块的身体(但不应该包含一个spmd语句),可以使用labSend labReceive等等。
matlabpool工作的代码可以包括spmd和parfor语句,并保留一个工人想到作为“客户端”,和其他工人们用来形成matlabpool。这允许您编写并行代码,你将使用一个交互式matlabpool客户机,但是异步在集群上运行它。
至于为什么你的代码并不是加快使用的工作和任务时,spmd相比,你必须确保你没有matlabpool集群上运行之前运行您的工作。否则我将希望看到相同的加速。
这些都是复杂的概念理解和描述,如果你有任何问题请让我知道,我会尝试澄清。
汤姆

登录置评。

更多的答案(0)

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!