parfor减慢计算速度

问题描述:

我在一台有44名工人的计算机上运行这段代码。然而,并行的每次迭代比串行模式慢,尽管整个循环的总执行时间减少了。parfor减慢计算速度

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 

因此,每个循环中的经过时间大约为18s。当我将parfor更改为for时,每个循环中经过的时间大约为6.7秒。

你能解释一下为什么在这种情况下,parfor循环比for循环慢吗? 我检查了MATLAB文档和类似的问题,但它没有帮助我。

注意:对于parfor版本,脚本执行的总时间更快,我只是想了解为什么函数cellfun在并行版本中速度降低3倍。

+0

我想你的CPU核心比你的GPU核心快得多。我假设你是否有44名工人必须使用matlab for gpu,因为你不太可能拥有一台拥有44个CPU核心的计算机。 –

+0

@GarrGodfrey IIRC,'parfor'默认使用CPU核心,而不是GPU核心。 – Paul

+0

@ransa一个潜在的解释是,在parfor循环内运行计算之前,需要对数据进行分区,然后发送给各个工作人员。据推测,开销大于效率的提高。很难说不知道看到数据和功能。 – Paul

检查CPU使用情况。

我认为这里的主要原因是像fft(这是xcorr最有可能的一部分)的东西已经不止使用一个核心。我现在无法测试parfor,但普通的for循环已经在您的代码的4C/4T CPU上具有大约70%的CPU利用率。所以,parfor最多可以填充剩余的30%(在我的电脑上),但是显然这样会比较慢地运行每个实例。

+0

你说得对,fft2/ifft2使用多核,因此效率不高。因此我的问题是如何克服这个问题?有没有其他方法可以在不使用使用多核的功能的情况下计算相关性?还有一个问题:我认为如果有2个函数使用多个单核,那么优先级是外部并行函数,所以内部函数是以串行方式运行的,为什么它不是这种情况? – ransa

+0

@ransa你是什么意思,效率不高?你的东西需要做X的计算,如果fft使用4个核心,它将花费1/4单个核心的时间。这很好,不错:)在避免fft或使其在单核上运行没有意义。如果你这样做,你会让代码运行速度减慢4倍,然后parfor会使它再次运行速度提高4倍,所以你将完全在你开始的地方。实际上,当你使用parfor时,fft实际上应该运行在单个内核上(假设你使用的线程数与内核数量一样多)。所以这个每个周期的放缓直接是1C的fft而不是4的结果。 –

+0

@ransa如果你希望在'parfor'情况下以'for'的速度运行单个情况(并且只使用其他线程中剩余的CPU周期),那么效率就会如此,我不知道该怎么做。我甚至不相信你 - 它需要Mathworks的大量工作,并且大部分时间可能无法正常工作。 –