2016-09-19 196 views
2

我发出parfeval和获取输出使用parfor其他做同样的事情比较两个块之间的执行时间,一:parfeval慢于PARFOR

parfor k = 1:N 
    a = rand(5000); 
    b = inv(a); 
end 

for k = 1:N 
    a = rand(5000); 
    F(k) = parfeval(p,'inv',1,a); 
end 
for k = 1:N 
    [completedIdx,value] = fetchNext(F); 
    fprintf(1,'%d ',completedIdx); 
end 

parfor始终更快。对此情况有何洞见?我的简单理解是parfor本质上是将每个循环作为一个并行作业运行。

+0

相关阅读:http://stackoverflow.com/questions/32146555/saving-time-and-memory-using-parfor-in-matlab/32146700#32146700'inv'操作确实是隐式多线程的,所以使用' parfor'不会让它变得更快(请参阅我链接的帖子)。 – Adriaan

+0

具有完美的感觉。我看,但没有找到多线程功能之间的调用,但我相信你。我仍然不确定这是否解释了与parfor相比较慢的parfeval –

回答

2

你的理解是正确的。

通过运行parfeval的循环,您没有获得并行计算工具箱的优势。

在第一种情况下,5000 x 5000矩阵的倒数看起来好像是计算密集型的,但是MATLAB针对这些类型的操作(特别是矩阵运算)进行了优化。

很明显,MATLAB的一个弱点是循环,在第二个用例中使用parfeval意味着您正在顺序评估每个矩阵的逆(即使您正在平行化反函数)。

通过使用parfor,您可以获得并行化代码中最耗时的方面的优势。

我敢打赌,只有在size(a) >> N你会看到parforparfeval跑赢的情况。

编辑 @Adriaan也生成a great point。与大多数MATLAB函数一样,inv也是一个隐式并行函数。

+0

我想我不太理解您的回复: “在第二个用例中使用parfeval意味着您正在按顺序评估每个矩阵的逆(即使您正在平行化反函数)“ 我以为我通过调用parfeval来并行化,它怎么还没有并行化? –

+0

我不会去说大多数MATLAB函数是并行的;我宁愿说,当你尝试编辑时,大多数不显示代码的函数是预编译函数(在C++ afaik中),并且它们已经在速度方面进行了优化。隐式多线程函数的完整列表可以在[这里]找到(http://nl.mathworks.com/products/parallel-computing/parallel-support.html;jsessionid=c9625ed2c7026e49e0e6921b2e5d) – Adriaan