用Matlab编程器动态和静态分配的正确方法是什么?

14次浏览(最近30天)
TripleSSSS
TripleSSSS 2019年3月18日
评论道: TripleSSSS2019年3月20日
我最近开始使用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编码器将生成只分配这些内存一次的代码,我将在不同的算法迭代中使用它们。
我有几个问题:
  1. 如何使用不同迭代之间的连续内存分配算法。(如何避免在每次迭代中分配和取消分配)
  2. 我应该为静态内存分配设置一个合适的堆栈大小(1mb对于静态内存分配是一个合理的值吗?)
  3. 我想在这个例子中使用全局内存。它会工作吗?
  4. 有什么解决问题的建议吗?
谢谢

接受的答案

大卫·芬克
大卫·芬克 2019年3月19日
有两种推荐的方法可以避免在算法的多次迭代中使用大量堆栈和动态分配。
对于两者,设置 栈空间的使用 足够小,以防止局部变量适合堆栈。
选项A:使用堆栈空间设置。这将迫使这些变量具有“静态”存储类。这些内存在程序启动时分配一次,并且在每次调用算法时重用相同的内存。
选项b。除了堆栈空间设置外,打开 MultiInstanceCode .与静态局部变量不同,这创建了一个包含所有对堆栈来说太大的局部变量的类型。在调用算法之前,分配该空间一次,并在每次调用算法时将其传递给生成的c++函数。
1评论
TripleSSSS
TripleSSSS 2019年3月20日
非常感谢。
我最终使用了默认的堆栈限制,将动态内存分配阈值(在编码器应用程序:内存->动态内存分配阈值)扩展到一个很大的限制(~50MB)。
然后我设置生成的可重入代码(在编码器应用程序:内存->生成可重入代码)

登录评论。

更多的答案(0)

下载188bet金宝搏


释放

R2018b

社区寻宝

在MATLAB中心找到宝藏,并发现社区如何可以帮助你!

开始狩猎!