Файл Matlab mex работает медленнее по сравнению с его прямым эквивалентом на языке C

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

Любая помощь будет принята с благодарностью,

Эндрю

22
задан wallyk 28 September 2011 в 20:12
поделиться