Labfans是一个针对大学生、工程师和科研工作者的技术社区。 论坛首页 | 联系我们(Contact Us)
MATLAB爱好者论坛-LabFans.com
返回   MATLAB爱好者论坛-LabFans.com > 其它 > 资料存档
资料存档 资料存档
回复
 
主题工具 显示模式
旧 2019-12-14, 20:13   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 Matlab mex文件比其等效的C语言慢

我不知所措地解释(并避免)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告诉我,职位无关代码不应成为放缓的根源,除此之外,我感到茫然。

任何帮助将不胜感激,

安德鲁



回答:

在与我在Mathworks的联系人发送电子邮件,玩弄自己的代码并以各种方式对代码进行性能分析之后,我有了一个答案。但是,这可能是我曾经遇到过的一个技术问题最令人不满意的答案:

简短版本是“升级到Matlab版本2011a(上周正式发布),此问题现已解决”。

较长的版本涉及与版本2010b及更早版本中的mex网关相关的开销问题。我能够提取的最好的解释是,这种开销不会被评估一次,而是每次函数调用链接库中的另一个函数时我们都需要付出一点。

尽管发生这种情况令我感到困惑,但这至少与我所做的SHARK分析一致。当我分析并比较本机应用程序与mex应用程序之间的差异时,会出现重复出现的模式。我为应用程序编写的源代码中的函数所花费的时间没有改变。在本机实现和mex实现之间进行比较时,花在库函数上的时间会增加一点。另一个用于构建该库的库中的函数增加了很多差异。随着我们越来越深入,直到达成BLAS实施,时间差继续增加。

罪魁祸首是几个频繁使用的BLAS功能。在本机应用程序中,占我计算时间约1%的函数在mex函数中的运行时间为30%。

在2010b和2011a之间,mex网关的实现似乎已更改。在我的Macbook上,本机应用大约需要6秒钟,而混合版本需要6.5秒钟。这是我可以处理的开销。

至于根本原因,我只能推测。 Matlab起源于解释性编码。由于mex函数是动态库,因此我猜测每个mex库在运行时都没有意识到它所链接的对象。由于Matlab建议用户很少使用mex,然后仅用于较小的计算密集型块,因此我认为很少执行大型程序(例如ODE求解器)。这些程序,像我的一样,是受害最大的程序。

我已经介绍了一些Matlab函数,这些函数我知道可以在C中实现,然后使用mex编译(尤其是在动力学模型上调用sbioaccelerate之后进行sbiosimulate,这是SimBiology工具箱的一部分),并且似乎有一些明显的提速。因此,2011a更新似乎比通常的半年更新更广泛地受益。

祝其他遇到类似问题的编码人员好运。感谢您提供的所有有用建议,帮助我朝正确的方向入手。

- 安德鲁



更多&回答...
poster 当前离线   回复时引用此帖
回复


发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子

启用 BB 代码
论坛禁用 表情符号
论坛启用 [IMG] 代码
论坛启用 HTML 代码



所有时间均为北京时间。现在的时间是 22:58


Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.