Programming and Data Types    

Program 2 -- Relaxation Algorithm

This program starts by creating a sharply contrasted graphics display in a figure window. When you press any key after starting the program, it runs a relaxation algorithm on the figure, gradually blurring the color boundaries.

When run on a MATLAB version that doesn't support performance acceleration, you can see the algorithm taking effect in distinct steps that are spaced over time. When run with acceleration, the display changes smoothly over a much shorter time period.

This table shows comparative execution times for 300 iterations of the program. (The version of this program used in these measurements is slightly different from what is shown below. The final image handling functions (set and drawnow) were moved to the outside of the three nested for loops, and thus refresh the image only once, at the very end.)

Operating System
MATLAB 6.1
MATLAB 6.5
Performance Gain
Windows
1 min., 25.9 sec.
1.1 sec.
x 78.1
Linux
3 min., 13.8 sec.
1.7 sec.
x 114.0
Solaris
8 min., 51.0 sec.
23.5 sec.
x 22.6

Here is the program.

You can see the visual effect of the faster execution by running the program yourself. Put the code into an M-file named relax.m, and run it for 300 iterations by typing

A new window is created showing the initial image. Once you see this, reselect the MATLAB Command Window, and then press any key to start processing the image.

What Makes It Faster

The program spends most of its time in a nested for loop that modifies the image data. The newPlate calculation in the inner loop executes 3 million times when iterations is set to 300, as it is in the above test.

MATLAB accelerates the two inner for loops for the reasons explained below. The outer loop does not accelerate (see The Outer for Loop), yet that has little effect on the overall execution time, as nearly all of the time spent is in the inner loops.

Scalar loop indices.   The for loops operate on a range of scalar values. For example,

Supported Data Types and Array Shapes.   All of the statements within the inner loops use a double data type with either a scalar value or two-dimensional matrix. These are among the data types and array shapes that MATLAB accelerates.

Higher Complexity Operations.   MATLAB usually shows a noticeable performance gain for statements containing multiple operators and/or functions. The plate computation is an example of this.

Function Calls and Overloading.   One factor that enables the acceleration of the two inner loops is that the only function calls made in this code are to built-in functions. The program performs a number of mathematical operations, but as long as none of the math operators used (+, -, and /) is overloaded for the data type being operated on (double), these math operations execute quickly, not having to make M-file calls.

The Outer for Loop

MATLAB does not accelerate the outer for loop. One reason is that the leading for statement relies on an ambiguous data type for the maximum index value. The value for iterations is passed into the program and thus may not necessarily be one of the data types or array shapes supported for acceleration.

If you include the final set and drawnow calls in the loop, MATLAB does not accelerate these either, because they operate on Handle Graphics® objects, which are not among the data types supported for performance acceleration.

The fact that the outer loop does not accelerate is not that important in this case, as nearly all of the time spent is in the inner loops.


  Sample Accelerated Programs Program 3a -- Vector Comparison, with Loop