Main Content

Best Practices for Using MEX Functions to Accelerate MATLAB Algorithms

When you choose a section of MATLAB® code to accelerate, the following practices are recommended.

Accelerate Code That Dominates Execution Time

Find the section of MATLAB code that dominates run time. Accelerate this section of the code using a MEX function as follows:

  1. Place this section of the code inside a separate MATLAB function.

  2. From this MATLAB function, generate a MEX function.

  3. From your original MATLAB code, call the MEX function.

To find the execution time of each MATLAB instruction, use MATLAB Profiler.

  • To open the Profiler from the command line, type profile viewer.

  • To open Profiler from the MATLAB Editor window, under the Editor tab, click Run and Time.

For more information about using the Profiler to measure run time of MATLAB code, see Profile Your Code to Improve Performance.

Include Loops Inside MEX Function

Instead of calling a MEX function inside a loop in the MATLAB code, include the loop inside the MEX function. Including the loop eliminates the overheads in calling the MEX function for every run of the loop.

For example, the following code finds the greatest element in every row of a 1000–by–1000 matrix, mat. You can accelerate sections 1,2, and 3 using a MEX function.:

% Section 1 begins
for i = 1:10000

   % Section 2 begins
   max = mat(i,0); % Initialize max
   for j = 1:10000
     
     % Section 3 begins
     if (mat(i,j) > max)
       max = mat(i,j) % Store the current maximum
     end
     % Section 3 ends
     
   end
   % Section 2 ends

end
% Section 1 ends

Accelerate section 1 using a MEX function. Accelerate section 1 first so that the MEX function is called only once.. If you cannot accelerate section 1 first, then accelerate sections 2 or 3, in that order. If section 2 (or 3) is accelerated using a MEX function, the function is called 10000 (or 10000 × 10000) times.

Avoid Generating MEX Functions from Unsupported Functions

Check that the section of MATLAB code that you accelerate does not contain many functions and language features that are unsupported by MATLAB Coder™. For a list of supported functions, see Functions and Objects Supported for C/C++ Code Generation.

Note

In certain situations, you might have to accelerate sections of code even though they contain a few unsupported functions. Declare an unsupported function as extrinsic to invoke the original MATLAB function instead of the code generated for the function. You can declare a function as extrinsic by using coder.extrinsic or wrapping it in an feval statement. See Use MATLAB Engine to Execute a Function Call in Generated Code.

Avoid Generating MEX Functions if Built-In MATLAB Functions Dominate Run Time

Use MEX functions to accelerate MATLAB code only if user-generated code dominates the run time.

Avoid generating MEX functions if computationally intensive, built-in MATLAB functions dominate the run time. These functions are pre-compiled and optimized, so the MATLAB code is not accelerated significantly using a MEX function. Examples of such functions include svd, eig ,fft, qr, lu.

Tip

You can invoke computationally intensive, built-in MATLAB functions from your MEX function. Declare the MATLAB function as extrinsic using coder.extrinsic or wrap it in an feval statement. For more information, see Use MATLAB Engine to Execute a Function Call in Generated Code.

Minimize MEX Function Calls

Accelerate as much of the MATLAB code as possible using one MEX function instead of several MEX functions called at lower levels. This minimizes the overheads in calling the MEX functions.

For example, consider the function,testfunc,which calls two functions,testfunc_1 and testfunc_2:

function [y1,y2] = testfunc(x1,x2)
  y1 = testfunc_1(x1,x2);
  y2 = testfunc_2(x1,x2);
end

Instead of generating MEX functions individually for testfunc_1 and testfunc_2, and then calling the MEX functions in testfunc, generate a MEX function for testfunc itself.