MATLAB: Cannot give the value to part of the matrix in parallel computing

MATLABparallel computing

As I'm trying to wrtie a code for matrix multiplying with the 'parfor', I've got an error that 'cannot verify the type of variable C'. Could anyone tell me how to manipulate part of C'value ?
parfor r = 1:d
i = mod(r-1,b)+1;
j = floor(r-1/a)+1;
s = min(i*subsize,m); t = min(j*subsize,n);
tmp = zeros(s-(i-1)*subsize,t-(j-1)*subsize);
for k = 1:c
q = min(k*subsize,l);
tmp = tmp+A((i-1)*subsize+1:s,(k-1)*subsize+1:q)*B((k-1)*subsize+1:q,(j-1)*subsize+1:t);
end
C((i-1)*subsize+1:s,(j-1)*subsize+1:t) = tmp;
end

Best Answer

  • Hi Archer,
    The problem is that MATLAB doesn't know how to properly index into C. I would suggest a slight rewrite, using parfeval instead of parfor.
    % Assumed a, b, c, d, l, m, n, subsize, A, B are all define above
    % Using a nested function so that input arguements don't need to be passed to unitOfWork
    p = gcp;
    for r = 1:d
    f(r) = p.parfeval(@unitOfWork,5);
    end
    for r = 1:d
    [~,i,j,s,t,tmp] = f.fetchNext();
    C((i-1)*subsize+1:s,(j-1)*subsize+1:t) = tmp;
    end
    function [i,j,s,t,tmp] = unitOfWork()
    i = mod(r-1,b)+1;
    j = floor(r-1/a)+1;
    s = min(i*subsize,m); t = min(j*subsize,n);
    tmp = zeros(s-(i-1)*subsize,t-(j-1)*subsize);
    for k = 1:c
    q = min(k*subsize,l);
    tmp = tmp+A((i-1)*subsize+1:s,(k-1)*subsize+1:q)*B((k-1)*subsize+1:q,(j-1)*subsize+1:t);
    end
    end
    end