我无法解释(并避免)Matlab mex 程序和没有 Matlab 接口的相应 C 程序之间的速度差异。我一直在分析一个数值分析程序:
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 版本都使用对 openMP 的调用线性扩展至 27 个线程,但出于分析这些调用的目的,这些调用已被禁用并被注释掉。
除了编译为 mex 文件的必要标志外,这两个版本已以相同的方式编译: -fPIC --shared -lmex -DMATLAB_MEX_FILE 应用于 mex 编译/链接。我已经删除了对 mex 文件左右参数的所有引用。也就是说,它不接受任何输入,也不提供输出,它仅用于分析。
伟大而光荣的谷歌告诉我,与位置无关的代码不应该是减速的根源,除此之外我不知所措。
任何帮助将不胜感激,
安德鲁