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

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

Ускорение кода, который доминирует во времени выполнения

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

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

  2. Из этой функции MATLAB сгенерируйте MEX-функцию.

  3. Из вашего оригинального кода MATLAB вызовите MEX-функцию.

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

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

  • Чтобы открыть Профилировщика из РЕДАКТОРА MATLAB окна, под вкладкой Editor, нажмите Run and 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, который вы ускоряете, не содержит многих функций и языковых функций, которые не поддерживаются MATLAB Coder™. Список поддерживаемых функций см. в разделе Функции и Объекты, поддерживаемые для генерации кода C/C + +.

Примечание

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

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

Используйте MEX-функции, чтобы ускорить код MATLAB, только если пользовательский код доминирует во времени запуска.

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

Совет

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

Минимизация вызовов 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 сам.