В этом примере показано, как ускорить осуществление алгоритма MATLAB® с помощью сгенерированной MEX-функции. Это использует codegen
команда, чтобы сгенерировать MEX-функцию для сложного приложения, которое использует несколько файлов MATLAB. Можно использовать codegen
проверять, что ваш код MATLAB подходит для генерации кода и, во многих случаях, чтобы ускорить ваш алгоритм MATLAB. Можно запустить MEX-функцию, чтобы проверять на ошибки времени выполнения.
Нет никаких необходимых условий для этого примера.
run_balls
Функция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-функцию с помощью команды codegen
сопровождаемый под названием файл MATLAB, чтобы скомпилировать. Передайте вход в качестве примера (-args 0
) указать, что сгенерированная MEX-функция будет вызвана входом, типа double.
codegen run_balls -args 0
Code generation successful.
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;
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
Оцененный убыстряются:
fprintf(1, 'Speed up: x ~%2.1f\n', t1/t2);
Speed up: x ~3.7