【发布时间】:2011-07-10 20:19:47
【问题描述】:
我无法解释(并避免)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 文件左右参数的所有引用。也就是说,它不接受任何输入,也不提供输出,它只是用于分析。
伟大而光荣的 Google 告诉我,与位置无关的代码不应该是减速的根源,除此之外我不知所措。
任何帮助将不胜感激,
安德鲁
【问题讨论】:
-
最初的猜测可能是应用于可执行文件的优化并未应用于共享库。如何让您的可执行文件调用 MEX 函数而不是包含代码本身?这可能有助于找出性能瓶颈所在。
-
@Pablo 我不确定你的意思。如何让可执行文件在不进入 Matlab 的情况下调用 mex 函数?
-
MEX 文件只是一个共享库(.dll 或 .so),它导出一个众所周知的函数,即 mexFunction。您可以这样做,以便您的可执行文件加载共享库并在其中调用 mexFunction。这样,您为 Well_optimized_code() 运行的代码应该是相同的。
-
matlab 下的内存分配器的行为与独立环境下的内存分配器的行为不同,这似乎是合理的。你能修改优化后的代码以不同的方式使用内存吗?此外,减速是在您使用该功能时发生,还是仅在第一次出现?
-
@Alex 它一直在发生。我报告的时间来自第一次之后的电话。虽然平均而言,第一次通话似乎较慢,但并非如此。谢谢你的想法。
标签: c optimization matlab mex