2013-03-27 64 views
2

我需要并行执行两个Matlab函数。问题是从他们那里获得结果比执行慢得多。Matlab从并行函数中获得结果很慢

第一种方法:

spmd; 
if labindex==1, 
    K=MatricaK(NP, NE, r, Kxx, N, h, 1); %K is 1000x1000 matrix 
end; 
if labindex==2, 
    F=Apkrovos(NP, NE, N, r, Ta, h, 1); %F is 1000x1 vector 
end; 
end; 
%This part is quite fast, around 0.17s. 
K=K{1}; 
F=F{2}; 
%This part is very slow, around 1.15s. 

方法二:

parfor i=1:2 
if i==1 
    K=MatricaK(NP, NE, r, Kxx, N, h, 1); %this way doesn't return K outside the loop, but very fast, around 0.15 for all loop 
.. 
    K{i}=MatricaK(NP, NE, r, Kxx, N, h, 1); %this works, but slow, around 1.5s 
.. 
    K = [K MatricaK(NP, NE, r, Kxx, N, h, 1)]; %also works, but slow, around 1.5s 
... 
end; 

我如何才能让结果反馈快?我发现Parallel Programming on MATLAB to execute 3 different functions at the same time,但没有速度。

+0

对不起,如果这是一个愚蠢的问题,但为什么要这么快就开始平行呢? – wakjah 2013-03-27 15:34:39

+0

首先,我必须让我的程序平行进行研究。其次,我只是希望它比顺序版本更快。实际上,如果我不考虑获得结果,它会比序贯(0.24 vs 0.17s)快40%。所以,我想知道,如果有可能快速获得结果:) – 2013-03-27 15:46:55

+0

令人惊讶的结果!第二次运行时速度是否有所不同(以及是否已经完成任何预先初始化)?另外,'K {:}'也许超出了你能够有效存储的内容(在Ram中)?可以通过使用300而不是1000来检查一次。 – 2013-03-27 15:52:35

回答

1

所以,问题是开销产生的开销。虽然我不能给你一个具体的答案 - 这取决于你的情况和matlab版本 - 我可以建议一些事情来尝试。

  1. 尝试使用不同的方法从matlabpool实验室中检索数据。其中一些可能允许matlab做一些幕后优化。为此我建议看分布式数组。或者,如果您不需要对数据进行任何后续处理,则可以将其直接保存到磁盘,而不是通过内存传递。

  2. 尝试作为分布式运行它batch job。更新版本的matlab允许您创建批处理作业并在本地机器(而不是专用群集)上运行它们。由于你的两个函数是完全独立的,你可以使用这种方法来获取数据。

  3. 试着寻找将结果放置在共享内存中的方法。这很难,因为Matlab的并行处理基于消息传递的MPI;有些模式基本上是MPI上的matlab封装。这意味着每个工作人员都是独立的Matlab存储空间实例,因此当您再次收集数据时,实际上会生成一个MPI消息,这会产生一些开销。避免这种情况的方法已在​​3210之前讨论过。

  4. 看看功能。如果你可以/可以修改你所调用的两个函数,那么你可能能够以没有这种通信开销的方式对它们进行并行化。当涉及到向量的并行处理时,Matlab非常聪明,所以如果有任何操作可以转化为向量/矩阵操作,那么可以在不需要通信开销的情况下节省大量的速度。

  5. 试试matlab以外的东西。如果您有时间和编码技能,那么您可以使用允许多线程执行的语言重新编写函数,如使用OpenMP的C++。

我已经尽管共享输入数据的问题是易并行所以我最终拯救直接从工作节点输出到磁盘面临着自己的Matlab的并行编程,但在我的情况类似问题。

+0

是什么让你得出结论:“问题是通过结果产生的开销”?当你在parfor中做小事情时,开销通常是一个问题,但在这里肯定不是这种情况。 – 2013-03-27 17:06:26

+0

在原始问题中,第一种方法将获取数据('k = k {1}')的实际工作(调用两种方法)完全分开并给出每个步骤花费的时间。方法调用总共需要0.17s,而结果传递需要1.15s。 – Alan 2013-03-27 17:29:24

+0

谢谢你们的帮助。现在,无所事事后,我的搜索结果缩短了10倍,而且现在两次(执行和数据检索)的搜索结果都相等,但随着元素数量越来越多,搜索时间越来越长。看来我正在测试不适合的程序,因为它使用了大量的数据而不能广泛执行。 – 2013-03-27 19:15:51