首页 > 解决方案 > 使用 Matlab 编码器动态和静态分配的正确方法是什么?

问题描述

我最近开始使用 Matlab 编码器来构建计算机视觉算法。我正在研究一个点云分类问题,这意味着我的算法输入是一组 3D 点 (x,y,z),而我的输出是一个具有分类 3D 点的变量数组。

对于这个项目,我决定使用 Matlab 编码器。Coder 要求开发人员指定内存分配的上限。那么问题来了——输入的 3D 点集可以达到 250k 点,每个类的输出约为 50k 点。除此之外,我的实现分配的 3D 网格大小最大为:600x600x120 (uint8) 和一些我使用的辅助内存。我的观点是我正在处理大量内存分配。

我尝试使用静态分配;但是感觉Matlab没有为每个内存分配约为1mb的情况建立静态内存分配。我将内存上限设置为较大的值,然后使用 Coder 生成 C++ 代码并编译它。第一次运行该算法时,我遇到了堆栈溢出,然后我不得不将堆栈大小扩大到 30mb(在 Visual Studio 中),这很荒谬。

另一方面,我可以使用动态内存分配。然而,在这种情况下,几乎所有内容都将被动态分配,这也是一个痛苦的脖子,因为大量的分配和取消分配非常耗时。我希望从 Matlab 编写一个代码,该代码将在其实现内部保存在算法的多次迭代之间不会改变的上限内存。(就像 C++ 类中的成员一样)

我会更具体地说:如果我的算法使用 600x600x120 的网格和几个大小为 600x600 的图像,我希望 Matlab Coder 将生成只分配这些内存一次的代码,并且我会在不同的算法迭代中使用它们。

我有几个问题:

  1. 如何在算法的不同迭代之间使用连续的内存分配。(如何避免每次迭代的分配和解除分配)

  2. 我应该为静态内存分配设置什么合适的堆栈大小(静态分配的 1mb 是一个合理的值吗?)

  3. 我考虑过在这种情况下使用全局内存。它会起作用吗?

  4. 任何建议如何解决问题?谢谢

标签: matlabmatlab-coder

解决方案


我最终使用了默认的堆栈限制,我将动态内存分配阈值(在编码器应用程序中:内存 --> 动态内存分配阈值)扩展到了一个很大的限制(~50MB)。然后我设置生成重入代码(在编码器应用程序中:内存->生成重入代码)

这是我从 Matlab 得到的答案:

有两种推荐的方法可以避免在算法的多次迭代中使用大量堆栈和动态分配。

对于两者,将Stack Space Usage设置得足够小,以防止局部变量适合堆栈。选项 A:使用堆栈空间设置。这将强制这些变量具有“静态”存储类。这些在程序启动时分配一次,并且在每次调用算法时重复使用相同的内存。

选项 B. 除了堆栈空间设置,打开MultiInstanceCode。这不是静态局部变量,而是创建一个包含所有对于堆栈来说太大的可能局部变量的类型。在调用算法之前,分配该空间一次,并在每次调用算法时将其传递给生成的 C++ 函数。


推荐阅读