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

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

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

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

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

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

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

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

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

  • Открытому Профилировщику из окна MATLAB Editor, под вкладкой 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 (или 10 000 × 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 самостоятельно.

Для просмотра документации необходимо авторизоваться на сайте