【发布时间】:2017-09-18 05:22:40
【问题描述】:
我在一台有 44 名工人的计算机上运行了这段代码。但是,虽然整个循环的总执行时间会减少,但每次并行迭代都比串行模式慢。
template=cell(31,1);
for i=1:31
template{i}=rand(i+24);
end
parfor i=1:5
img=rand(800,1280+i); % It's an other function that gives me the values of img ,here it's just an example
tic
cellfun (@(t) normxcorr2 ( t ,img),template,'UniformOutput',0);
toc
end
因此,每个循环的经过时间约为 18 秒。当我将parfor 更改为for 时,每个循环所用的时间约为 6.7 秒。
你能解释一下为什么在这种情况下 parfor 循环比 for 循环慢吗? 我检查了 MATLAB 文档以及类似的问题,但对我没有帮助。
注意:parfor 版本的脚本执行总时间更快,我只是想了解为什么函数cellfun 在并行版本中慢了 3 倍。
【问题讨论】:
-
我想你的 CPU 内核比你的 GPU 内核快得多。我假设如果您有 44 名工作人员,则必须使用 matlab for gpu,因为您不太可能拥有一台具有 44 个 CPU 内核的计算机。
-
@GarrGodfrey IIRC,
parfor默认使用 CPU 内核,而不是 GPU 内核。 -
@ransa 一种可能的解释是,在 parfor 循环中运行计算之前,需要对数据进行分区,然后将其发送给各个工作人员。据推测,开销大于效率增加。不知道数据和功能很难说。
-
您可能想阅读 this question 向工作人员广播数据和 this one 使用
parfor(cc @Paul) 节省时间和内存 -
你的
for版本是指用for简单地替换parfor我接受吗?此外,当您的循环中只有 5 个实例时,拥有 44 个工作人员并不真正相关。要么它只使用 5 个工作器(它们必须是物理 CPU 内核,所以我希望你在服务器上),或者它会使用全部 44 个,无论你使用的是for还是parfor,如果函数有隐式多线程(参见我之前的评论,第二个链接)。如果是后者,那就更慢了,因为需要将变量广播给所有工作人员,这比计算需要更多时间
标签: matlab performance parallel-processing parfor