Функция MATLAB Mex не быстрее обычной

0

Я знаю, что это не всегда так, но не функции MEX должны повысить эффективность кода, особенно при расчетах?

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

Тем не менее, я не вижу большого улучшения во времени, как показано на рисунке ниже:

Изображение 174551

X-Axis: Еще одна итерация функции expm

Y-ось: время выполнения для этой функции

Синяя линия: вызов expm функции expm

Красная линия: expm функции EXEX expm

Есть ли причина, по которой версия MEX настолько похожа на обычную версию? Есть ли способ увеличить скорость? Я использовал tic и toc для сбора данных о времени выполнения.

  • 1
    1) Не могли бы вы сообщить средние / средние значения или построить гистограмму их различий? 2) Насколько велики матрицы, которые вы использовали для проверки скорости? Что, если вы увеличите размер матриц?
  • 0
    Вы обнаружите, что в большинстве случаев алгоритм является наиболее важным фактором. Вполне вероятно, что в ваших тестах накладные расходы на загрузку / использование mex эквивалентны накладным расходам на функцию в Matlab, но я не могу сказать без а) рабочей копии matlab и б) дополнительной информации о том, какими были ваши тесты. Мой опыт показывает, что функции Matlab в целом довольно хорошо оптимизированы, и что некоторые функции Matlab не переводятся в эффективный C / Cpp без некоторой ручной оптимизации.
Показать ещё 3 комментария
Теги:
performance
mex

2 ответа

2

Здесь, как вызов expm(A) ломается, где A = rand(500,500); ,

Изображение 174551

Время равномерно распределяется между матричным умножением (F = F*F;) и вызовом дочерней функции PadeApproximantOfDegree. Матричное умножение встроено с использованием очень быстрых функций LAPACK в mkl.dll (функции линейной алгебры MATLAB с использованием Intel MKL).

Здесь, где все время проводится в PadeApproximantOfDegree:

Изображение 174551

Это не в цикле. Все вызовы встроенных математических математических функций. Если бы были итерации, я бы ожидал, что MATLAB будет немного медленнее, но это всего лишь несколько строк с 1 вызовом, каждый из которых занимает все время. Только матричное умножение в родительском (F*F) называется более одного раза.

На самом деле, я не удивлюсь, если версия MEX будет медленнее, если Coder не сможет использовать оптимизированные многопоточные библиотеки, к которым имеет доступ MATLAB. По-видимому, Кодер управляет.

  • 1
    в последнем вопросе OP было подтверждено , что и MATLAB, и MATLAB Coder реализуют один и тот же алгоритм (приближение Паде с масштабированием и возведением в квадрат) для вычисления экспоненциальной матрицы (хотя небольшое изменение в последних версиях, по-видимому, еще не было перенесено в MATLAB Coder). Фактически, когда я попробовал это в прошлый раз, MATLAB Coder сгенерировал код C, который вызывает функции BLAS / LAPACK ( dgemm , dtstrm и т. Д.), dtstrm конечном итоге должны быть скомпилированы с библиотекой Intel MKL, которая поставляется с MATLAB.
  • 1
    .. Так что я ожидаю, что они будут иметь одинаковую производительность, так как они в конечном итоге будут вызывать те же вычислительные подпрограммы из MKL (также с JIT-компиляцией в MATLAB это должно ускорить базовые циклы в M-коде, чтобы приблизиться к собственной производительности). Если бы MEX был немного медленнее в тестах OP, я бы отнес это просто к накладным расходам, связанным с вызовом MEX-функций.
Показать ещё 1 комментарий
2

Большинство функций Matlab являются простыми оболочками, которые вызывают код библиотеки FORTRAN, большинство из которых поступают из LAPACK/EISPACK/LINPACK. Другими словами, встроенный вызов функции matlab уже вызывает скомпилированный код, а не интерпретируемый код matlab (.m sources). Таким образом, MX не может сделать, чтобы улучшить производительность этих вызовов функций.

Компиляция вашего кода в Matlab обеспечит только преимущества, когда вы выполняете большую работу в исходном коде Matlab напрямую. Если ваш код в основном вызывает кучу встроенных функций matlab, особенно матричных функций (которые являются всеми функциями LAPACK), то вы не увидите большого улучшения, только когда у вас есть "ручной" код, т.е. Если вы внедряли что-то вроде "expm" полностью в matlab-коде (в.m файле), тогда это было бы намного быстрее при компиляции с MEX. Вы будете видеть только преимущества компиляции кода matlab, если у вас есть значительное количество собственного кода Matlab, а не если вы просто выполняете несколько вызовов встроенных функций.

Подумайте об этом, почему Mathworks отправит Matlab со встроенными функциями, реализованными как интерпретируемый код matlab? Даже если они реализуют некоторые из своих встроенных функций в коде matlab (который является лишь небольшой долей, поскольку большинство из них - FORTRAN/C/C++), они будут компилировать эти функции перед отправкой, так что вы, как пользователь, получить лучшую производительность из них.

  • 2
    edit expm ? Функция не является нативной функцией. Тем не менее, это не особенно сложная функция - большая часть тяжелой работы выполняется с помощью вызова mldivide .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню