How to Classify the Variable for parfor program?

1 view (last 30 days)
Hi Everybody,
I am priya Now doing one research. I want execute my code parallel using parfor. But not able to Run It. I got a Error Msg. ??? Error: The variable mcode in a parfor cannot be classified. See Parallel for Loops in MATLAB, "Overview".
This is my sample code
parfor i1=1:1:n
disp(i1);
??? Error: The variable mcoder,mcodeg,mcodeb,a,e,gcoder,gcodeg,gcodeb in a parfor cannot be classified.
See Parallel for Loops in MATLAB, "Overview".
if (var(i1) < 25)
label(i1)=0;
mcoder(e)=mranr(i1);
mcodeg(e)=mrang(i1);
mcodeb(e)=mranb(i1);
mgacode=cat(3,mcoder,mcodeg,mcodeb);
e=e+1;
else
label(i1)=1;
[a b c d er]=rand1(value1r(i1,:),value2,value3,value4);
[a b c d eg]=rand1(value1g(i1,:),value2,value3,value4);
[a b c d eb]=rand1(value1b(i1,:),value2,value3,value4);
??? Error using ==>
parallel_function at 598
Error in ==>
parallel_function>make_general_channel/channel_general
at 872
Subscripted assignment
dimension mismatch.
% following code mismatch error
gcoder(a,:) = [a b c d er];
gcodeg(a,:) = [a b c d eg];
gcodeb(a,:) = [a b c d eb];
gcode=cat(3,gcoder,gcodeg,gcodeb);
a=a+1;
err=(er+eg+eb)/3;
if (err > llim)
eno=eno+1;
end
end
end
My code Run properly without parfor. But With Parfor I got so many error msg.
I am a new matlab user. How can I modify that code please any one help me my problem.
Thank You so much.

Accepted Answer

Walter Roberson
Walter Roberson on 25 Jun 2012
You are indexing arrays at "e", which is not initialized within the parfor loop. The value of "e" at any one point thus depends upon what the previous iterations of the loop have done. That makes indexing by "e" dependent on the sequential execution of the loops. "parfor" loops are executed in an unspecified order (currently they are launched in reverse order!), so any indexing within "parfor" must depend only on the loop variable and constants.
The same kind of problem occurs for your indexing by "a": parfor cannot know that your calls to rand1() are going to produce values that are dependent upon the loop variable "i1" so that it can be sure that indexing by "a" is not going to overlap locations with other iterations of the parfor loop. Indeed, considering that you do not even pass "i1" to rand1(), it seems quite unlikely that "a" will turn out to be unique for each "i1" value, so the parfor loop iterations would almost certainly attempt to write to the same locations within gcode* arrays.
Your output arrays need to be indexed at "i1" to prevent clashes with other iterations.
It is allowed for you to use a cell array that you index at "i1" and only sometimes store results in, and it is allowed for you to delete the unused (empty) cells after the end of the "parfor" loop. This would have the effect of allowing data to be added only "sometimes", with the end order being in increasing loop index order like you had for your "for" loop.
  7 Comments
Walter Roberson
Walter Roberson on 28 Jun 2012
Edited: Walter Roberson on 28 Jun 2012
size() is normally a key MATLAB function which takes as its first argument an expression (almost always given as a variable name), and as its second argument a dimension number, and it returns the number of elements that expression has along that dimension. For example,
foo = rand(3,5); size(foo,1) %3 because foo is 3 elements along dimension #1 size(foo,2) %5 because foo is 5 elements along dimension #2
Now, the expression "1" is a scalar expression, whose dimensions are 1 x 1. The nrr1'th dimension of a scalar is also 1 (all trailing dimensions are treated as being 1). So size(1,nrr1) is going to be the same as just 1, and so you are initializing e to 1, which is probably not an efficient pre-allocation.
If your "e" variable is intended to be a vector or array, then your expression mgacoder{e} is going to have problems. If your "e" is intended to be initialized to 1 (which is what happens to get done now) then remember that is being done in every "parfor" iteration, and since you never use any other value of "e" after your "e=e+1" statement (remember, your parfor is going to re-initialize "e" for each iteration of "i1"), there is no point in having "e" in that context at all and you might as well just code
mgacoder{1}=meanranr(i1);
mgacodeg{1}=meanrang(i1);
mgacodeb{1}=meanranb(i1);
Then later in your code exactly the same thing occurs for your use of the variable "a".
Meanwhile, your variable "eno" is not initialized in the loop but is incremented in some circumstances. This is in violation of what I said before:
Each parfor iteration must be independent of what is being done in every other iteration. No using information that would have to be calculated in a different iteration.
The only person who has enough information to fix your code is you, as you have not posted indicating what the overall code is intended to do, or how the sections are intended to work. Two short comments total is not enough for us to know what your program does or how you think it should work.
I remind you of my earlier answer:
It is allowed for you to use a cell array that you index at "i1" and only sometimes store results in, and it is allowed for you to delete the unused (empty) cells after the end of the "parfor" loop.
Are your cell arrays indexed at "i1" ?
PRIYANGA
PRIYANGA on 2 Jul 2012
Thank you so much you help Sir. I was change array indexing value 'e' to 'i1' that's all, my code was running parallel. thank you so much your idea and help sir.

Sign in to comment.

More Answers (0)

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!