Я затрудняюсь объяснить (и избежать) различия в скорости между программой 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
vs.
>> 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 сообщил мне, что код, не зависящий от позиции, не должен быть источником замедления и, кроме того, я в растерянности.
Любая помощь будет принята с благодарностью,
Эндрю