从 Matlab 调用的 Mex 函数和数值差异
Posted
技术标签:
【中文标题】从 Matlab 调用的 Mex 函数和数值差异【英文标题】:Mex function called from Matlab and numerical difference 【发布时间】:2014-10-16 20:12:22 【问题描述】:我有一个 Matlab 科学代码,我想将包含对反转函数 pinv()(本机 Matlab)的调用的 Matlab 代码的输出与现在调用 pinv() 的 C++ 实现的相同 Matlab 代码的输出进行精确比较.
我使用 Matlab 代码调用 C++ pinv 而不是 Matlab pinv():我使用相关 API 将 C++ pinv 编译为 mex 文件。
对编译为 mex 文件的函数的调用能否在 Matlab 和 C++ pinv() 之间的实现差异之上引入一些数值差异?
【问题讨论】:
我可能没有正确理解这个问题,但你不能运行代码并检查输出吗?除此之外,我愿意相信,只要这两个代码在同一台机器上运行,除了 C++ 和 Matlab 中已经存在的差异之外,就不应该有差异添加。 不,MEX 的东西没有副作用。它只是另一个 C++ 包装器。mxArray
内部只有一个缓冲区。它是一种不透明的类型,但它将普通的旧数据存储在某个地方。除非您通过在 MATLAB 中转换输入或输出来修改数据。
【参考方案1】:
MATLAB 执行的所有矩阵运算均由 LAPACK 库实现,因此,是的,实现可能会导致差异。如果您要问的是“LAPACK 库是否使用与 C++ 编译的代码不同的硬件浮点功能”,那么这不太可能——除非 C++ 编译器被指示生成针对特定目标的代码子集可用的硬件平台。
但是,即使代码在源代码级别相似,LAPACK 也是从 FORTRAN 源代码编译而来,而自定义例程则来自 C++;不同编译器所做的优化是不同的。所以很有可能——即使有惊人的相似的源代码——得到的可执行代码也会不同。这可能会导致不同的结果。
注意:对数据的操作(即传递给函数的方式)不会改变数据的内容;这可能是执行时间的问题,而不是数字偏差。 MEX 基本上是关于如何将原生 MATLAB 数据结构呈现给任何处理它们的例程的约定;例程访问数据的效率又是一个实现问题。
进一步评论: 必须说 FORTRAN 的 2D 数据内存布局是列优先的,而 C 和系列 2D 数据的内存布局是行优先的(I'我谈论索引)。这也可能导致执行时间的差异(就像在 exec 代码中一样),这取决于实现算法accesses the data 的方式,因为现代硬件架构的性能高度依赖于,例如发生了多少缓存未命中。
【讨论】:
我更想问墨西哥的东西带来的开销以上是关于从 Matlab 调用的 Mex 函数和数值差异的主要内容,如果未能解决你的问题,请参考以下文章
如何查看从 Matlab 中 Mex 函数使用的 DLL 调用的 printf 的输出?