从 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 的输出?

Mex 编译函数,用于计算集合交集和差异,不断崩溃

Matlab mex 文件比它的直接 C 等效文件慢

matlab多次调用mex函数后没有响应

使用带有 MEX Wrapper 的辅助 C 文件从 MATLAB 2016 调用 C++ 代码时遇到问题

如何从 GTK+2 C 代码中调用 matlab/octave 函数