Path: news.mathworks.com!not-for-mail
From: <HIDDEN>
Newsgroups: comp.soft-sys.matlab
Subject: Re: performance of parfor
Date: Fri, 5 Apr 2013 14:49:18 +0000 (UTC)
Organization: The MathWorks, Inc.
Lines: 108
Message-ID: <kjmo9e$pl6$1@newscl01ah.mathworks.com>
References: <kjkcb2$hpu$1@newscl01ah.mathworks.com> <ytw6201w39j.fsf@uk-eellis0l.dhcp.mathworks.com>
Reply-To: <HIDDEN>
NNTP-Posting-Host: www-04-blr.mathworks.com
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 8bit
X-Trace: newscl01ah.mathworks.com 1365173358 26278 172.30.248.35 (5 Apr 2013 14:49:18 GMT)
X-Complaints-To: news@mathworks.com
NNTP-Posting-Date: Fri, 5 Apr 2013 14:49:18 +0000 (UTC)
X-Newsreader: MATLAB Central Newsreader 2101682
Xref: news.mathworks.com comp.soft-sys.matlab:792753

Edric M Ellis <eellis@mathworks.com> wrote in message <ytw6201w39j.fsf@uk-eellis0l.dhcp.mathworks.com>...
> "kinor " <kinor.removethiswithdot@gmx.de> writes:
> 
> > I used parfor a while ago and it worked quite well (2.5 time faster
> > with 3 labs).  Now I tried to use it on win 7 with 2012a and an
> > example from
> > http://blogs.mathworks.com/loren/2007/10/03/parfor-the-course/ with
> > the following results:
> >
> > matlabpool local 3
> >
> > n = 600;
> > tic
> > ranks = zeros(1,n);
> > parfor (ind = 1:n)
> >    ranks(ind) = rank(magic(ind));  % last index could be ind,not n-ind+1
> > end
> > toc
> >
> > tic
> > ranks = zeros(1,n);
> > for (ind = 1:n)
> >    ranks(ind) = rank(magic(ind));  % last index could be ind,not n-ind+1
> > end
> > toc
> >
> > Starting matlabpool using the 'local' profile ... connected to 3 labs.
> > Elapsed time is 10.773548 seconds.
> > Elapsed time is 13.993966 seconds.
> >
> > Which is surprisingly slow for 3 labs. I would be really grateful for
> > any hint to get the 3 labs working.
> 
> The MATLAB function 'RANK' is instrinsically multithreaded. On a single
> machine, it's always going to be more efficient to use intrinsic
> multithreading than to use explicit parallelism using a MATLABPOOL and
> PARFOR because of the overheads of distributing the body of the loop to
> the workers. MATLABPOOL workers run in "single computational thread"
> mode, so to make a fair comparison, you should start MATLAB using
> "-singleCompThread".
> 
> Cheers,
> 
> Edric.

Hi Edric,

thanks a lot for this clear explanation. I should have read the example more carefully, now there is a certain gain in speed by parfor: double speed with 3 labs.

I looked in the help of rank, its multithreading is not mentioned there, where did you know that?

As a simple example I tried to generate an image with the following function:

function speedtest
maxNumCompThreads(1);
matlabpool(3)
n = 6000;
k = ones(n, n, 3);
fh = {@r @g @b};

tic
for c = 1:3
    k(:,:,c) = fh{c}(ones(n));
end
toc

tic
parfor c = 1:3
    k(:,:,c) = fh{c}(ones(n));
end
toc

matlabpool close


function rV = r(k)
for y = size(k,1):-1:1
    for x = size(k,2):-1:1
        rV(y,x) = sin(y*0.1)*cos(x*0.2);
    end
end

function rV = g(k)
for y = size(k,1):-1:1
    for x = size(k,2):-1:1
        rV(y,x) = sin(y*0.015)*cos(x*0.12);
    end
end

function rV = b(k)
for y = size(k,1):-1:1
    for x = size(k,2):-1:1   
        rV(y,x) = sin(y*0.1)*cos(x*0.2);
    end
end

in 2012a i got:
Starting matlabpool using the 'local' profile ... connected to 3 labs.
Elapsed time is 8.331768 seconds.
Elapsed time is 11.959129 seconds.
Sending a stop signal to all the labs ... stopped.

which  means a loss of speed applying parfor to long executing functions.
I am curious if there is any explanation for this.


Cheers
kinor