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