Когда вы выбираете раздел MATLAB® код, чтобы ускориться, применяющие методы рекомендуются.
Найдите раздел кода MATLAB, который доминирует над временем выполнения. Ускорьте этот раздел кода с помощью MEX-функции можно следующим образом:
Поместите этот раздел кода в отдельной функции MATLAB.
От этой функции MATLAB сгенерируйте MEX-функцию.
От вашего оригинального кода MATLAB вызовите MEX-функцию.
Чтобы найти время выполнения каждой инструкции MATLAB, используйте профилировщика MATLAB.
Чтобы открыть Профилировщик из командной строки, введите profile viewer
.
Открытому Профилировщику из окна MATLAB Editor, под вкладкой Editor, нажимают Run and Time.
Для получения дополнительной информации об использовании Профилировщика, чтобы измерить время выполнения кода MATLAB, смотрите Профиль Ваш Код, чтобы Улучшать Производительность.
Вместо того, чтобы вызвать MEX-функцию в цикле в коде MATLAB, включайте цикл в MEX-функции. Включая цикл устраняет издержки в вызове MEX-функции для каждого запуска цикла.
Например, следующий код находит самый большой элемент в каждой строке матрицы 1000 на 1000, mat
. Можно ускорить разделы 1,2, и 3 использования MEX-функции.:
% 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
Ускорьте раздел 1 использование MEX-функции. Ускорьте раздел 1 первое так, чтобы MEX-функция была названа только однажды.. Если вы не можете ускорить раздел 1 первое, затем ускорить разделы 2 или 3, в том порядке. Если раздел 2 (или 3) ускоряется с помощью MEX-функции, функция вызвана 10000 (или 10 000 × 10000) времена.
Проверяйте, что раздел кода MATLAB, который вы ускоряете, не содержит много функций и функций языка, которые не поддержаны MATLAB Coder™. Для списка поддерживаемых функций смотрите Функции и Объекты, Поддержанные для Генерации кода C/C++.
Примечание
В определенных ситуациях вам придется ускорить разделы кода даже при том, что они содержат несколько неподдерживаемых функций. Объявите, что неподдерживаемая функция как значение внешних параметров вызывает исходную функцию MATLAB вместо кода, сгенерированного для функции. Можно объявить функцию как значение внешних параметров при помощи coder.extrinsic
или перенос его в feval
оператор. Смотрите Использование MATLAB Engine, чтобы Выполнить Вызов функции в Сгенерированном коде.
Используйте MEX-функции, чтобы ускорить код MATLAB, только если пользовательский сгенерированный код доминирует над временем выполнения.
Постарайтесь не генерировать MEX-функции, если в вычислительном отношении интенсивный, встроенные функции MATLAB доминируют над временем выполнения. Эти функции предварительно скомпилированы и оптимизированы, таким образом, код MATLAB значительно не ускоряется с помощью MEX-функции. Примеры таких функций включают svd
, eig
,fft
, qr
, lu
.
Совет
Можно вызвать в вычислительном отношении интенсивные, встроенные функции MATLAB от MEX-функции. Объявите функцию MATLAB как внешнее использование coder.extrinsic
или перенесите его в feval
оператор. Для получения дополнительной информации смотрите Использование MATLAB Engine, чтобы Выполнить Вызов функции в Сгенерированном коде.
Ускорьте как можно больше кода MATLAB, использование одной MEX-функции вместо нескольких MEX-функций зашло в более низкие уровни. Это минимизирует издержки в вызове MEX-функций.
Например, рассмотрите функцию,testfunc
, который вызывает две функции,testfunc_1
и testfunc_2
:
function [y1,y2] = testfunc(x1,x2) y1 = testfunc_1(x1,x2); y2 = testfunc_2(x1,x2); end
Вместо того, чтобы генерировать MEX-функции индивидуально для testfunc_1
и testfunc_2
, и затем призыв MEX-функций testfunc
, сгенерируйте MEX-функцию для testfunc
самостоятельно.