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

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

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

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

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

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

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

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

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

  • Чтобы открыть Профилировщика из окна MATLAB Editor, под вкладкой Editor, нажимают Run и Time.

Для получения дополнительной информации об использовании Профилировщика, чтобы измерить время выполнения кода MATLAB, смотрите Профиль, чтобы Улучшить Производительность (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 (или 10 000 × 10000) времена.

Постарайтесь не генерировать MEX-функции от неподдерживаемых функций

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

Примечание

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

Постарайтесь не Генерировать MEX-функции, если Встроенные функции MATLAB Доминируют над Временем выполнения

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

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

Совет

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

Минимизируйте вызовы 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.

Была ли эта тема полезной?