Performance MATLAB parfor比for慢——怎么了?

Performance MATLAB parfor比for慢——怎么了?,performance,matlab,parallel-processing,parfor,Performance,Matlab,Parallel Processing,Parfor,我正在处理的代码有如下循环: bistar = zeros(numdims,numcases); parfor hh=1:nt bistar = bistar + A(:,:,hh)*data(:,:,hh+1)' ; end 小新界(10) 计时后,它实际上比使用常规循环慢100倍!!!我知道parfor可以做并行求和,所以我不知道为什么这不起作用 我跑 matlabpool 在运行我的代码之前使用开箱即用的配置 我对matlab比较陌生,刚刚开始使用并行功能,

我正在处理的代码有如下循环:

bistar = zeros(numdims,numcases); 
parfor hh=1:nt       
  bistar = bistar +  A(:,:,hh)*data(:,:,hh+1)' ;
end   
小新界(10)

计时后,它实际上比使用常规循环慢100倍!!!我知道parfor可以做并行求和,所以我不知道为什么这不起作用

我跑

matlabpool
在运行我的代码之前使用开箱即用的配置

我对matlab比较陌生,刚刚开始使用并行功能,所以请不要认为我没有做什么蠢事

谢谢


PS:我正在四核上运行代码,因此我希望看到一些改进。

对于
nt
的小值,对结果进行分区和分组(划分工作和从多个线程/核收集结果的开销)是很高的。这是正常的,您不会为简单循环中可以快速执行的简单任务划分数据

始终在循环中执行一些具有挑战性的操作,这些操作值得分区开销。这是一个很好的例子

线程来自线程池,因此不应存在创建线程的开销。但是为了从
bistar
大小创建部分结果
n
矩阵,必须先计算所有部分结果,然后再添加所有这些部分结果(重新组合)。在一个直接循环中,这是一个很高的概率,没有分配发生

帮助中的完整声明(感谢您在下面的链接)是:

如果计算f、g和h的时间为 大型,parfor将显著 比对应的 语句,即使n相对 小的


因此,您可以看到,它们的意思与我的意思完全相同,只有在循环中所做的工作足够复杂/耗时的情况下,小n值的开销才值得付出努力。

Parfor
会带来一些开销。因此,如果
nt
非常小,并且如果循环中的计算非常快(如加法),则
parfor
解决方案的速度较慢。此外,如果在四核上运行
parfor
,1-3核的速度增益将接近线性,但如果使用4核,速度增益将更小,因为最后一个核也需要运行系统进程

例如,如果parfor的开销为100ms,循环中的计算时间为5ms,如果我们假设速度增益为线性,最多4个核的系数为1(即使用4个核使计算速度加快4倍),
nt
大约需要30才能使用
parfor
(对于<代码>为150毫秒,对于<代码>为132毫秒,对于<代码>为parfor<代码>为132毫秒)。如果只运行10次迭代,<代码>为parfor<代码>将较慢(对于<代码>为50毫秒,对于<代码>为parfor<代码>为112毫秒)


您可以通过比较1个worker与0个worker的执行时间来计算机器上的开销,还可以通过对1到4个worker的执行时间进行线性拟合来估计速度增益。这样,您就知道除了通信开销导致的性能不佳之外,使用
parfor

什么时候有用了(见其他答案),在这种情况下,还有另一个不使用
parfor
的原因。在这种情况下,在
parfor
中执行的所有操作都使用。假设所有工作人员都在同一台PC上运行,则没有任何优势,因为单个调用已经使用了处理器的所有内核。

您能告诉我们numdims、numcases和ac的值吗您找到的实际计时数字?谢谢。感谢您的回复,但其中指出“即使n相对较小,parfor也会比相应的for语句快得多。”(当然,idk相对较小的意思是什么。)但是我很困惑,你说的划分工作和从几个线程/核心收集结果的开销是什么意思?变量A和数据是全局的,应该在所有线程之间共享。matlab所要做的就是小心添加到bistar。我添加了一个精度,感谢链接我查看了帮助,它说明了sa我不太擅长解释:-)如果这句话的一部分很重要。希望它有帮助!这不仅适用于matlab,也适用于所有类型的并行计算。充分划分问题是至关重要的。+1指出阅读所有帮助的必要性,而不仅仅是显示你想要什么的那部分。Thx再次jdehaan:)有趣的是,我认为MATLAB实际上创建了4个进程,我猜这是将工作外包给这些进程,因此您所说的开销是可以感觉到的(因为进程之间没有共享内存)。然而,在一个完美的世界中,工作将外包给共享变量a、数据和bistar的线程,因此分区将是一个传递索引的问题(开销可以忽略不计),并且由于bistar是共享的,所以重新组合只是并行地添加正确的索引的问题(开销可以忽略不计)。这不是更快吗?我错过了什么吗?@Donnie我不是故意忽略它的,我工作累了,几乎要睡觉了。。。