2

我需要并行执行两个 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;

我怎样才能让结果快速返回?我发现MATLAB 上的 Parallel Programming 可以同时执行 3 个不同的函数,但速度没有任何问题。

4

1 回答 1

1

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

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

  2. 尝试将其作为分布式批处理作业运行。最新版本的 matlab 允许您创建批处理作业并在本地计算机上运行它们(而不是在专用集群上)。由于您的两个功能是完全独立的,您可以使用这种方法来更快地检索数据。

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

  4. 看看里面的功能。如果您可以/被允许修改您正在调用的两个函数,您可能能够以一种没有这种通信开销的方式并行化它们。在向量的并行处理方面,Matlab 非常聪明,因此如果有任何操作可以转换为向量/矩阵操作,您可以在那里显着节省速度,而无需通信开销。

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

我自己在 Matlab 中也遇到过类似的并行编程问题,尽管在我的情况下,尽管共享输入数据,但问题是令人尴尬的并行,所以我最终将输出直接从工作节点保存到磁盘。

于 2013-03-27T16:52:26.240 回答