Я знаю, что это не всегда так, но не функции MEX должны повысить эффективность кода, особенно при расчетах?
Я использовал набор инструментов кодера для MEX-функции expm
в MATLAB. Я ожидал хорошего повышения эффективности, поскольку эта функция выполняет множество матричных вычислений.
Тем не менее, я не вижу большого улучшения во времени, как показано на рисунке ниже:
X-Axis: Еще одна итерация функции expm
Y-ось: время выполнения для этой функции
Синяя линия: вызов expm
функции expm
Красная линия: expm
функции EXEX expm
Есть ли причина, по которой версия MEX настолько похожа на обычную версию? Есть ли способ увеличить скорость? Я использовал tic
и toc
для сбора данных о времени выполнения.
Здесь, как вызов expm(A)
ломается, где A = rand(500,500);
,
Время равномерно распределяется между матричным умножением (F = F*F;
) и вызовом дочерней функции PadeApproximantOfDegree
. Матричное умножение встроено с использованием очень быстрых функций LAPACK в mkl.dll (функции линейной алгебры MATLAB с использованием Intel MKL).
Здесь, где все время проводится в PadeApproximantOfDegree
:
Это не в цикле. Все вызовы встроенных математических математических функций. Если бы были итерации, я бы ожидал, что MATLAB будет немного медленнее, но это всего лишь несколько строк с 1 вызовом, каждый из которых занимает все время. Только матричное умножение в родительском (F*F
) называется более одного раза.
На самом деле, я не удивлюсь, если версия MEX будет медленнее, если Coder не сможет использовать оптимизированные многопоточные библиотеки, к которым имеет доступ MATLAB. По-видимому, Кодер управляет.
dgemm
, dtstrm
и т. Д.), dtstrm
конечном итоге должны быть скомпилированы с библиотекой Intel MKL, которая поставляется с MATLAB.
Большинство функций 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++), они будут компилировать эти функции перед отправкой, так что вы, как пользователь, получить лучшую производительность из них.
edit expm
? Функция не является нативной функцией. Тем не менее, это не особенно сложная функция - большая часть тяжелой работы выполняется с помощью вызова mldivide
.