Я затрудняюсь объяснить (и избежать) различия в скорости между программой Matlab mex и соответствующей программой C без интерфейса Matlab. Я профилировал программу численного анализа:
int main(){
Well_optimized_code();
}
скомпилирован с gcc 4.4 против эквивалента Matlab-Mex (направленный на использование gcc44, который не является версией, поддерживаемой в настоящее время Matlab, но это требуется по другим причинам):
void mexFunction(int nlhs,mxArray* plhs[], int nrhs, const mxArray* prhs[]){
Well_optimized_code(); //literally the exact same code
}
Я выполнил тайминги как:
$ time ./C_version
против.
>> tic; mex_version(); toc
Разница во времени колеблется. Версия, запускаемая из командной строки, занимает в среднем 5,8 секунды. Версия в Matlab работает через 21 секунду. Для контекста файл mex заменяет алгоритм в инструментальной панели SimBiology, для выполнения которого требуется около 26 секунд.
По сравнению с алгоритмом Matlab, как версии C, так и mex линейно масштабируются до 27 потоков, используя вызовы openMP, но для целей профилирования этих вызовов были отключены и закомментированы.
Две версии были скомпилированы таким же образом, за исключением необходимых флагов для компиляции в виде mex файла: -fPIC -shared -lmex -DMATLAB_MEX_FILE применяется в компиляции/привязке mex. Я удалил все ссылки на левый и правый аргументы файла mex. То есть он не принимает никаких входов и не дает выходов, он предназначен исключительно для профилирования.
Великий и славный Google сообщил мне, что независимый от позиции код не должен быть источником замедления, и за его пределами я нахожусь в убытке.
Любая помощь будет оценена,
Эндрю