Сгенерируйте код MEX для ускорения симуляции прыгающих мячей

В этом примере показано, как ускорить выполнение алгоритма MATLAB ® с помощью сгенерированной MEX-функции. Он использует codegen команда, чтобы сгенерировать MEX-функцию для сложного приложения, которое использует несколько файлов MATLAB. Можно использовать codegen проверить, что ваш код MATLAB подходит для генерации кода, и во многих случаях ускорить алгоритм MATLAB. Для проверки ошибок времени выполнения можно запустить MEX-функцию.

Необходимые условия

Для этого примера нет необходимых условий.

О run_balls Функция

The run_balls.m функция принимает один вход, чтобы задать количество прыгающих мячей для симуляции. Симуляция запускает и строит график прыгающих мячей, пока не останется энергии, и возвращает состояние (положения) всех мячей.

type run_balls
% balls = run_balls(n)
% Given 'n' number of balls, run a simulation until the balls come to a
% complete halt (or when the system has no more kinetic energy).
function balls = run_balls(n) %#codegen

coder.extrinsic('fprintf');

%   Copyright 2010-2013 The MathWorks, Inc.

% Seeding the random number generator will guarantee that we get
% precisely the same simulation every time we call this function.
old_settings = rng(1283,'V4');

% The 'cdata' variable is a matrix representing the colordata bitmap which
% will be rendered at every time step.
cdata = zeros(400,600,'uint8');

% Setup figure windows
im = setup_figure_window(cdata);

% Get the initial configuration for 'n' balls.
balls = initialize_balls(cdata, n);

energy = 2; % Something greater than 1
iteration = 1;
while energy > 1
    % Clear the bitmap
    cdata(:,:) = 0;
    % Apply one iteration of movement
    [cdata,balls,energy] = step_function(cdata,balls);
    % Render the current state
    cdata = draw_balls(cdata, balls);
    iteration = iteration + 1;
    if mod(iteration,10) == 0
        fprintf(1, 'Iteration %d\n', iteration);
    end
    refresh_image(im, cdata);
end
fprintf(1, 'Completed iterations: %d\n', iteration);

% Restore RNG settings.
rng(old_settings);

Сгенерируйте MEX-функцию

Во-первых, сгенерируйте MEX-функцию с помощью команды codegen далее указывается имя файла MATLAB для компиляции. Передайте пример входа (-args 0), чтобы указать, что сгенерированная MEX-функция будет вызвана с входом типа double.

codegen run_balls -args 0
Code generation successful.

The run_balls функция вызывает другие функции MATLAB, но при вызове необходимо задать только функцию точки входа codegen.

По умолчанию codegen генерирует MEX-функцию с именем run_balls_mex в текущей папке. Это позволяет вам протестировать код MATLAB и MEX-функцию и сравнить результаты.

Сравнение результатов

Запуск и время исходного run_balls функция, за которой следует сгенерированная MEX-функция.

tic, run_balls(50); t1 = toc;
Iteration 10
Iteration 20
Iteration 30
Iteration 40
Iteration 50
Iteration 60
Iteration 70
Iteration 80
Iteration 90
Iteration 100
Iteration 110
Iteration 120
Iteration 130
Iteration 140
Iteration 150
Iteration 160
Iteration 170
Iteration 180
Iteration 190
Iteration 200
Iteration 210
Iteration 220
Iteration 230
Iteration 240
Iteration 250
Iteration 260
Iteration 270
Iteration 280
Completed iterations: 281
tic, run_balls_mex(50); t2 = toc;

Figure MATLAB Coder Bouncing Balls contains an axes. The axes contains an object of type image.

Iteration 10
Iteration 20
Iteration 30
Iteration 40
Iteration 50
Iteration 60
Iteration 70
Iteration 80
Iteration 90
Iteration 100
Iteration 110
Iteration 120
Iteration 130
Iteration 140
Iteration 150
Iteration 160
Iteration 170
Iteration 180
Iteration 190
Iteration 200
Iteration 210
Iteration 220
Iteration 230
Iteration 240
Iteration 250
Iteration 260
Iteration 270
Iteration 280

Figure MATLAB Coder Bouncing Balls contains an axes. The axes contains an object of type image.

Completed iterations: 281

Предполагаемая скорость:

fprintf(1, 'Speed up: x ~%2.1f\n', t1/t2);
Speed up: x ~1.7