Use Objects and Handles in parfor
-Loops
Objects
When you run a parfor
-loop, you can send broadcast variables or
sliced input variables from the client to workers, or send sliced output variables
from workers back to the client. The save
and
load
functions must be supported for each object that you
send to or from workers. For more information, see Default Save and Load Process for Objects.
Assigning a value to the sliced property of an object or the sliced field of a
structure is not supported in a parfor
-loop.
Invalid | Valid |
---|---|
s = struct; parfor i = 1:4 s.SomeField(i) = i; end |
parfor i = 1:4 x(i) = i; end s = struct('SomeField',x); |
For more information about first-level indexing constraints, see Sliced Variables.
Handle Classes
You can send handle objects as inputs to the body of a
parfor
-loop. However, any changes that you make to handle objects
on the workers during loop iterations are not automatically propagated back to the
client. That is, changes made inside the loop are not automatically reflected after
the loop.
To make the client reflect the changes after the loop, explicitly assign the
modified handle objects to output variables of the parfor
-loop.
In the following example, maps
is a sliced input/output
variable.
maps = {containers.Map(),containers.Map(),containers.Map()}; parfor ii = 1:numel(maps) mymap = maps{ii}; % input slice assigned to local copy for jj = 1:1000 mymap(num2str(jj)) = rand; end maps{ii} = mymap; % modified local copy assigned to output slice end
Sliced Variables Referencing Function Handles
You cannot directly call a function handle with the loop index as an input
argument, because this variable cannot be distinguished from a sliced input
variable. If you must call a function handle with the loop index variable as an
argument, use feval
.
The following example uses a function handle and a
for
-loop.
B = @sin; for ii = 1:100 A(ii) = B(ii); end
A corresponding parfor
-loop does not allow B
to reference a function handle. As a workaround, use
feval
.
B = @sin; parfor ii = 1:100 A(ii) = feval(B,ii); end