Convertfor
-Loops Intoparfor
-Loops
In some cases, you must modify the code to convertfor
-loops toparfor
-loops. This example shows how to diagnose and fixparfor
-loop problems using a simple nestedfor
-loop. Run this code in MATLAB®and examine the results.
forx = 0:0.1:1fory = 2:10 A(y) = A(y-1) + y;endend
To speed up the code, try to convert thefor
-loops toparfor
-loops. Observe that this code produces errors.
parforx = 0:0.1:1parfory = 2:10 A(y) = A(y-1) + y;endend
In this case you cannot simply convert thefor
-loops toparfor
-loops without modification. To make this work, you must change the code in several places. To diagnose the problems, look for Code Analyzer messages in the MATLAB Editor.
This code shows common problems when you try to convertfor
-loops toparfor
-loops.
To solve these problems, you must modify the code to useparfor
。The body of theparfor
-loop is executed in a parallel pool using multiple MATLAB workers in a nondeterministic order. Therefore, you have to meet these requirements for the body of theparfor
-loop:
The body of the
parfor
-loop must be independent. One loop iteration cannot depend on a previous iteration, because the iterations are executed in parallel in a nondeterministic order. In the example,A(y) = A(y-1) + y;
parfor
。下一步的处理with independence issues, seeEnsure That parfor-Loop Iterations are Independent。You cannot nest a
parfor
-loop inside anotherparfor
-loop. The example has two nestedfor
-loops, and therefore you can replace only onefor
-loop with aparfor
-loop. Instead, you can call a function that uses aparfor
-loop inside the body of the otherparfor
-loop. However, such nestedparfor
-loops give you no computational benefit, because all workers are used to parallelize the outermost loop. For help dealing with nested loops, seeNested parfor and for-Loops and Other parfor Requirements。parfor
-loop variables must be consecutive increasing integers. In the example,parforx = 0:0.1:1
parfor
here. You can solve this problem by changing the value of the loop variable to integer values required by the algorithm. For next steps in troubleshootingparfor
-loop variables, seeEnsure That parfor-Loop Variables Are Consecutive Increasing Integers。You cannot break out of a
parfor
-loop early, as you can in afor
-loop. Do not include a return or break statement in the body of yourparfor
-loop. Without communication, the other MATLAB instances running the loop do not know when to stop. As an alternative, considerparfeval
。If you still have problems converting
for
-loops toparfor
-loops, see排除变量parfor-Loops。
Tip
You can profile aparfor
-loops usingtic
andtoc
to measure the speedup compared to the correspondingfor
-loop. UseticBytes
andtocBytes
to measure how much data is transferred to and from the workers in the parallel pool. For more information and examples, see剖析parfor-loops。