Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Matlab从并行函数得到的结果比较慢_Performance_Matlab_Function_Parallel Processing_Parfor - Fatal编程技术网

Performance Matlab从并行函数得到的结果比较慢

Performance Matlab从并行函数得到的结果比较慢,performance,matlab,function,parallel-processing,parfor,Performance,Matlab,Function,Parallel Processing,Parfor,我需要并行执行两个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, a

我需要并行执行两个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版本-我可以建议一些事情来尝试

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

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

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

  • 看看函数内部。如果您可以/被允许修改您正在调用的两个函数,那么您可能能够以一种不会产生这种通信开销的方式将它们并行化。当涉及到向量的并行处理时,Matlab非常聪明,因此,如果有任何操作可以转换为向量/矩阵操作,则可以在不需要通信开销的情况下显著节省速度

  • 尝试一下matlab以外的东西。如果你有时间和编码技能,那么你可以重新编码函数,允许多线程执行,如C++与OpenMP。p>

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

    如果这是一个愚蠢的问题,请原谅,但是,如果一开始就这么快,为什么还要费心让它并行呢?首先,我必须让我的程序并行以进行研究。第二,我只是希望它比顺序版本更快。事实上,如果我不考虑结果的话,它比顺序(0.24 vs0.17s)快40%。所以,我想知道,是否有可能快速得到结果:)令人惊讶的结果!第二次运行时(以及已经完成任何预初始化时),速度是否不同?另外,
    K{:}
    是否可能超过了您可以有效存储的容量(在Ram中)?可以使用300而不是1000检查一次。是什么让您得出结论,问题在于将结果传递给其他人所产生的开销?当您在parfor中做一些小事情时,开销通常是一个问题,但这里的情况肯定不是这样。在最初的问题中,第一个方法将实际工作(调用两个方法)与获取数据(
    k=k{1}
    )清楚地分开,并给出每个步骤所花费的时间。方法调用总共需要0.17秒,而结果通过需要1.15秒。谢谢大家的帮助。现在,我在不做任何事情的情况下得到了大约缩短10倍的时间结果,现在这两个时间(执行和数据检索)对于1000 e来说是相等的,但是随着元素的增加,数据检索时间也在增加。我似乎在测试不合适的程序,因为它使用了大量数据来进行不广泛的执行。