exponenta event banner

Рекомендации по использованию функций MEX для ускорения алгоритмов MATLAB

При выборе раздела кода MATLAB ® для ускорения рекомендуется выполнить следующие действия.

Ускорение кода, доминирующего во времени выполнения

Найдите раздел кода MATLAB, который доминирует во время выполнения. Ускорьте этот раздел кода с помощью функции MEX следующим образом:

  1. Поместите этот раздел кода в отдельную функцию MATLAB.

  2. На основе этой функции MATLAB создайте функцию MEX.

  3. Из исходного кода MATLAB вызовите функцию MEX.

Для определения времени выполнения каждой команды MATLAB используйте Профилировщик MATLAB.

  • Чтобы открыть профилировщик из командной строки, введите profile viewer.

  • Чтобы открыть приложение Profiler в окне Редактор MATLAB (MATLAB Editor), на вкладке Редактор (Editor) щелкните Выполнить (Run) и Время (Time).

Дополнительные сведения об использовании профилировщика для измерения времени выполнения кода MATLAB см. в разделе Профилирование кода для повышения производительности.

Включить петли внутри функции MEX

Вместо вызова функции 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) раз.

Избегайте генерации функций MEX из неподдерживаемых функций

Убедитесь, что ускоряемый раздел кода MATLAB содержит не так много функций и языковых функций, которые не поддерживаются Coder™ MATLAB. Список поддерживаемых функций см. в разделе Функции и объекты, поддерживаемые для генерации кода C/C + +.

Примечание

В некоторых ситуациях может потребоваться ускорить разделы кода, даже если они содержат несколько неподдерживаемых функций. Объявите неподдерживаемую функцию внешней, чтобы вызвать исходную функцию MATLAB вместо кода, созданного для функции. Функцию можно объявить как внешнюю с помощью coder.extrinsic или обернуть его в feval заявление. См. раздел Использование механизма MATLAB для выполнения вызова функции в сгенерированном коде.

Избегайте генерации функций MEX, если встроенные функции MATLAB доминируют во времени выполнения

Функции MEX используются для ускорения кода MATLAB только в том случае, если во время выполнения доминирует созданный пользователем код.

Избегайте генерации функций MEX, если во время выполнения доминируют ресурсоемкие встроенные функции MATLAB. Эти функции предварительно скомпилированы и оптимизированы, поэтому код MATLAB значительно не ускоряется с помощью функции MEX. Примеры таких функций включают svd, eig ,fft, qr, lu.

Совет

Встроенные функции MATLAB можно вызвать из функции MEX. Объявить функцию MATLAB как внешнюю с помощью coder.extrinsic или обернуть его в feval заявление. Дополнительные сведения см. в разделе Использование механизма MATLAB для выполнения вызова функции в сгенерированном коде.

Минимизация вызовов функции MEX

Максимальное ускорение кода 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 сам.