Когда вы выбираете раздел кода MATLAB®, чтобы ускориться, применяющие методы рекомендуются.
Найдите раздел кода MATLAB, который доминирует над временем выполнения. Ускорьте этот раздел кода с помощью MEX-функции можно следующим образом:
Поместите этот раздел кода в отдельной функции MATLAB.
От этой функции MATLAB сгенерируйте MEX-функцию.
От вашего оригинального кода MATLAB вызовите MEX-функцию.
Чтобы найти время выполнения каждой инструкции MATLAB, используйте профилировщика MATLAB.
Чтобы открыть Профилировщика из командной строки, введите profile viewer
.
Чтобы открыть Профилировщика из окна MATLAB Editor, под вкладкой Editor, нажимают Run и Time.
Для получения дополнительной информации об использовании Профилировщика, чтобы измерить время выполнения кода MATLAB, смотрите Профиль, чтобы Улучшить Производительность (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
. Смотрите Внешние Функции.
Используйте MEX-функции, чтобы ускорить код MATLAB, только если пользовательский сгенерированный код доминирует над временем выполнения.
Постарайтесь не генерировать MEX-функции, если в вычислительном отношении интенсивный, встроенные функции MATLAB доминируют над временем выполнения. Эти функции предварительно скомпилированы и оптимизированы, таким образом, код MATLAB значительно не ускоряется с помощью MEX-функции. Примеры таких функций включают svd
, eig
, fft
, qr
, lu
.
Можно вызвать в вычислительном отношении интенсивные, встроенные функции MATLAB от MEX-функции. Объявите функцию MATLAB как внешнее использование coder.extrinsic
или перенесите его в оператор feval
. Для получения дополнительной информации смотрите Внешние Функции.
Ускорьте как можно больше кода 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
.