首页 > 解决方案 > 当输入变量大小超过限制时,MEX 函数崩溃

问题描述

我使用 MATLAB 编码器将瓶颈函数写入并行化的 MEX 函数,到目前为止它工作正常。

但是在某些时候,函数崩溃了,Unexpected unknown exception from MEX file. 我在函数中标记了一些点,它们将显示像“a”这样的字母,以便查看 MEX 函数中错误发生的位置,因为我不能再将断点放在里面了。它甚至没有出现在第一个字母中,因此在初始化函数时一定会发生错误。

我认识到当输入变量大小超过某个限制时,总是会发生错误。与一些双 1x1 值一起的主要输入变量是 3 个 nx1 双精度数组和一个 nxn 逻辑矩阵。n 的大小可以变化,并且会在迭代过程中改变大小,所以我声明了 as:Inf:1:Inf:Inf:in coder。

当 n 超过大约 45000 的值时会出现问题。我不知道确切的值,因为在一次迭代中,当它低于该值时,一切都很好,而在下一次迭代中,当它高于该值时,它会崩溃。

在进一步分析时,我发现当 nxn 矩阵超过 2^31 字节的大小时似乎会发生这种情况。

当我想使用未加载到 MEX 函数中的矩阵将我的代码转换为 MEX 时,我收到一个错误,例如“intmax() 的错误......不支持”

所以我猜编码器为 32 位系统编写 MEX 函数,当加载一个大于该矩阵的矩阵时,由于 32 位系统,没有指向矩阵中正确元素的指针?

我如何绕过这个问题?由于矩阵是一个布尔矩阵,我现在发现 MATLAB 支持稀疏矩阵,这将节省大量内存,因为我的元素中只有 1/10^4 为 1,但我仍然想知道上述问题是否会导致来自 32 位 MEX 函数,如果是,如何解决这个问题?

标签: matlabmex32-bit

解决方案


是的,这个问题是由 MEX 文件被限制为 32 位索引引起的。这是 Coder 中的一个限制:

对于使用动态内存分配的可变大小数组,最大元素数是以下两者中的较小者:

  • intmax('int32').
  • 适合目标硬件上的 C int 数据类型的 2 的最大幂。

这些限制甚至适用于 64 位平台。

请参阅此文档页面


据我所知,唯一的解决方法是让 Coder 为您生成 C 或 C++ 代码,然后您手动编辑代码以使用size_t而不是int用于索引(当然删除对数组大小的任何检查)。我从未使用过 Coder 生成的代码,所以不确定这有多难。不过,我已经用 C 和 C++ 编写了许多 MEX 文件,这些 MEX 文件在 64 位索引和大于 2 Gb 的数组中工作得非常好。


推荐阅读