powder
powder

Reputation: 1173

Matlab parfor, cannot run "due to the way P is used"

I have a quite time consuming task that I perform in a for loop. Each iteration is completely independent from the others so I figured out to use the parfor loop and benefit from the i7 core of my machine.

The serial loop is:

 for i=1 : size(datacoord,1)

    %P matrix: person_number x z or
    P(i,1) = datacoord(i,1); %pn
    P(i,4) = datacoord(i,5); %or
    P(i,3) = predict(Barea2, datacoord(i,4)); %distance (z)

    dist = round(P(i,3)); %round the distance to get how many cells
    x = ceil(datacoord(i,2) / (im_w / ncell(1,dist)));
    P(i,2) = pos(dist, x); %x

end

Reading around about the parfor, the only doubt it had is that i use dist and x as indexes which are calculated inside the loop, i heard that this could be a problem. The error I get from matlab is about the way P matrix is used though. How is it? If i remember correcly from my parallel computing courses and I interpret correcly the parfor documentation, this should work by just switching the for with the parfor.

Any input would be greatly appreciated, thanks!

Upvotes: 0

Views: 1476

Answers (1)

Edric
Edric

Reputation: 25160

Unfortunately, in a PARFOR loop, 'sliced' variables such as you'd like P to be cannot be indexed in multiple different ways. The simplest solution is to build up a single row, and then make a single assignment into P, like this:

parfor i=1 : size(datacoord,1)

    %P matrix: person_number x z or
    P_tmp    = NaN(1, 4);
    P_tmp(1) = datacoord(i,1); %pn
    P_tmp(4) = datacoord(i,5); %or
    P_tmp(3) = predict(Barea2, datacoord(i,4)); %distance (z)

    dist = round(P_tmp(3)); %round the distance to get how many cells
    x = ceil(datacoord(i,2) / (im_w / ncell(1,dist)));
    P_tmp(2) = pos(dist, x); %x
    P(i, :) = P_tmp;
end

Upvotes: 3

Related Questions