db1234
db1234

Reputation: 807

A concrete example of a parfor loop in Matlab that outperforms the for loop

I am still somewhat new to parallel computing in Matlab. I have used OpenMP in C successfully, but could not get better performance in Matlab.

First, since I'm machine at a university that I am new to, I verified that the machine I am on has the Parallel Computing Toolbox by typing ver in the command prompt and it displayed: Parallel Computing Toolbox Version 5.2 (R2011b). Note that the machine has 4 cores

I tried simple examples of using parfor vs. for, but for always won, though this might be because of the overhead cost. I was doing simple things like the example here: MATLAB parfor is slower than for -- what is wrong?

Before trying to apply parfor to my bigger more complicated program (I need to compute 500 evaluations of a function and each evaluation takes about a minute, so parallelizing will help here), I would very much like to see a concrete example where parfor beats for. . Examples are abundant for OpenMP, but did not find a simple example that I can copy and paste that shows parfor is better than for

Upvotes: 2

Views: 9567

Answers (3)

Mr Purple
Mr Purple

Reputation: 2425

Serg describes how to "enable" parallel functionality. Here is a very simple cut and paste example to test it with as requested. Simply copy and paste the follwing into an mfile and run it.

function parfortest()
enable_parallel;
pause on
tic;
N=500;
for i=1:N
    sequential_answer=slow_fun(i);
end
sequential_time=toc
tic;
parfor i=1:N
   sequential_answer=slow_fun(i);
end
parallel_time=toc
end
function result=slow_fun(x)
    pause(0.001);
    result=x;
end

If you have run the code to enable parallel as shown in the answer by Serg you should get a pretty obvious improvement in performance.

Upvotes: 0

Serg
Serg

Reputation: 14098

I use the following code (once per Matlab session) in order to use parfor:

pools = matlabpool('size');
cpus = feature('numCores');
if pools ~= (cpus - 1)
    if pools > 0
        matlabpool('close');
    end
    matlabpool('open', cpus - 1);
end

This leaves 1 core for other processes. Note, the feature() command is undocumented.

Upvotes: 7

cjh
cjh

Reputation: 866

There is an example of improved performance from parfor on Loren Shure's MATLAB blog.

Her example is simply computing the rank of a magic square matrix:

function ranks = parMagic(n)

ranks = zeros(1,n);
parfor (ind = 1:n)
    ranks(ind) = rank(magic(ind));  % last index could be ind,not n-ind+1
end

Upvotes: 4

Related Questions