从Matlab调用Mex函数和数值差异

时间:2014-10-16 20:12:22

标签: c++ matlab floating-point precision mex

我有一个Matlab科学代码,我想精确比较包含调用反转函数pinv()(原生Matlab)的Matlab代码输出到同一个Matlab代码的输出,现在调用pinv()的C ++实现

我使用Matlab代码来调用C ++ pinv而不是Matlab pinv():我使用相关的API将C ++ pinv编译为mex文件。

对编译为mex文件的函数的调用是否可以在Matlab和C ++ pinv()之间的实现差异之上引入一些数值差异?

1 个答案:

答案 0 :(得分:1)

MATLAB执行的所有矩阵运算都是由LAPACK库实现的,是的,实现可能会产生差异。如果您要问的是" LAPACK库是否使用与C ++编译代码不同的硬件浮点功能" ,这是非常不可能的 - 除非指示C ++编译器生成针对特定硬件平台的代码,该平台对可用的硬件平台进行子集化。

但是,即使代码在源代码级别相似,LAPACK也是从FORTRAN源代码编译的,而自定义例程是由C ++编写的。不同编译器所做的优化是不同的。因此,即使使用惊人的类似的源代码,也很有可能产生可执行代码。这可能导致不同的结果。

注意:数据操作(即传递给函数的方式)不会改变数据的内容;这可能是执行时间问题,而不是数字偏差问题。 MEX基本上是关于如何将本机MATLAB数据结构呈现给它们的任何例程进程的约定;访问数据的例程的效率再次是实施的问题。

进一步评论必须要说的是,2D数据的FORTRAN内存布局是第一列的,而2D数据的C系列内存布局是第一行(I&#) 39;我在谈论索引)。这也可能导致执行时间的差异(如同在exec代码中一样),这取决于实现算法accesses the data的方式,因为现代硬件架构'性能高度依赖于,例如,发生了多少缓存未命中。