Когда вы выбираете раздел MATLAB® код для ускорения, рекомендованы следующие практики.
Найдите раздел кода MATLAB, который доминирует во времени запуска. Ускорите этот раздел кода с помощью MEX-функции следующим образом:
Поместите этот раздел кода в отдельную функцию MATLAB.
Из этой функции MATLAB сгенерируйте MEX-функцию.
Из вашего оригинального кода MATLAB вызовите MEX-функцию.
Чтобы найти время выполнения каждой инструкции MATLAB, используйте Профилировщик MATLAB.
Чтобы открыть профилировщик из командной строки, введите profile viewer
.
Чтобы открыть Профилировщика из РЕДАКТОРА MATLAB окна, под вкладкой 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 (или 10000 × 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
сам.