从Matlab调用的Mex函数和数值差分

Mex function called from Matlab and numerical difference

本文关键字:函数 Matlab 调用 Mex      更新时间:2023-10-16

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

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

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

MATLAB执行的所有矩阵运算都是由LAPACK库实现的,因此,是的,可能会因实现而产生差异。如果您的问题是"LAPACK库是否使用了与C++编译代码不同的硬件浮点功能",那是极不可能的—除非C++编译器被指示生成以特定HW平台为目标的代码,该特定硬件平台子集可用的HW平台。

然而,即使代码在源代码级别上相似,LAPACK也是从FORTRAN源代码编译的,而自定义例程是从C++编译的;不同编译器所做的优化是不同的。因此,即使有惊人的相似的源代码,结果可执行代码

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

进一步评论:必须说,FORTRAN在2D数据的内存布局中是列优先的,而C-and-family在2D数据内存布局中则是行优先的(我说的是索引)。这也可能导致执行时间的差异(同样在exec代码中),这取决于实现算法如何访问数据,因为现代硬件架构的性能高度依赖于发生了多少缓存未命中。