MATLAB 的堆栈大小是多少?

Posted

技术标签:

【中文标题】MATLAB 的堆栈大小是多少?【英文标题】:What is the stack size of MATLAB? 【发布时间】:2019-10-20 19:19:53 【问题描述】:

MATLAB R2018a(64 位)的默认堆栈大小是多少?

堆栈大小似乎比 64 位 C# 程序大。

我为什么要问这个

我之所以问这个问题,是因为我正在调用英特尔 MKLs LAPACKE_dtrtri,这是高度递归的。

我在 .NET 应用程序中使用该函数,从 C# 调用它时出现堆栈溢出错误,请参阅 What is the stack size of a BackgroundWorker DoWork Thread? Is there way to change it?

另一方面,如果我从 MATLAB 调用我的 .NET 应用程序,我不会收到堆栈溢出错误。这就是我想知道 MATLAB 的堆栈大小的原因。

【问题讨论】:

是 42 岁。玩笑不谈:您能否进一步详细说明您的问题?至少对我来说,不清楚你到底想知道什么。 是否有可能重新打开这个问题,以便我可以回答我自己的问题。顺便说一句,MATLAB 的堆栈大小似乎是 64 MB,我想在我的回答中解释一下。 我问了以下问题:What is the stack limit when MATLAB calls function in DLL。我认为堆栈大小是 64MByte 【参考方案1】:

虽然我没有直接回答您的问题,但 MATLAB 的递归限制可以通过get(0,'RecursionLimit') 获得或通过set(0,'RecursionLimit',N) 设置。

我相信除此之外,MATLAB 会继续存储变量直到您的 RAM 用完,但不是 100% 确定。

【讨论】:

我猜这个 RecursionLimit 仅用于 MATLAB 函数(m 文件),但我从 MATLAB 调用了一个 .NET 方法,堆栈大小是相关的。 @Wollmich 我怀疑 question 比“MATLAB 的堆栈大小是多少”更难。可能是“从内部调用 MATLAB 为 .NET 应用程序提供的堆栈大小是多少” 如果 MATLAB 没有为 .NET 创建新线程,它的堆栈大小与 MATLAB 的相同。还是不行? @Wollmich 你是通过 mex 界面做的吗?我认为 matlab 在调用它时会创建一个锁定的新线程,但我不确定。 我正在通过 .NET 接口进行操作,请参阅 ch.mathworks.com/help/matlab/getting-started.html【参考方案2】:

使用kernel32.dll 中的GetCurrentThreadStackLimits 函数我可以获得MATLAB 的堆栈大小。

我在名为 IntelMKL.dll 的 .NET 程序集中创建了以下辅助方法:

static class _kernel

    [DllImport("kernel32.dll")]
    internal static extern void GetCurrentThreadStackLimits(out uint lowLimit, out uint highLimit);

public static class MKL

    public static uint GetStackSize()
    
        uint low, high;
        _kernel.GetCurrentThreadStackLimits(out low, out high);
        return high - low;
    

我可以使用以下代码从 MATLAB 调用 GetStackSize

NET.addAssembly('IntelMKL.dll')
IntelMKL.MKL.GetStackSize() % this return 67108864 Bytes which is 64 Mega Bytes

MATLAB 的堆栈大小为 64 MB。

堆栈大小似乎比 64 位 C# 程序大。

默认 C# 堆栈大小为 1 MB(32 位)和 4 MB(64 位),请参阅What is the stack size of a BackgroundWorker DoWork Thread? Is there way to change it?

【讨论】:

@Adriaan 默认 C# 堆栈大小为 1 MB(32 位)和 4 MB(64 位)。 作为附带信息。使用 PYTHONNET 的 Python 3.6.6(64 位)的堆栈大小为 1984 kB。【参考方案3】:

使用dumpbin 命令我可以查看MATLAB.exe 的标题。

dumpbin /headers "C:\Program Files\MATLAB\R2018a\bin\win64\MATLAB.exe"

返回

Dump of file C:\Program Files\MATLAB\R2018a\bin\win64\MATLAB.exe

PE signature found

File Type: EXECUTABLE IMAGE

FILE HEADER VALUES
            8664 machine (x64)
...

OPTIONAL HEADER VALUES
...
         4000000 size of stack reserve
            1000 size of stack commit
          100000 size of heap reserve
            1000 size of heap commit

size of stack reserve 是十六进制的堆栈大小。

所以 MATLAB 的堆栈大小是 67108864 字节,即 64 兆字节。

【讨论】:

以上是关于MATLAB 的堆栈大小是多少?的主要内容,如果未能解决你的问题,请参考以下文章

堆栈红色区域的实际大小是多少? [复制]

BackgroundWorker DoWork 线程的堆栈大小是多少?有没有办法改变它?

QThread 中的堆栈大小

堆栈的大小是多少 - java -xss16M分配16兆字节或16兆字节

学习堆栈大小限制

在 C# 中检查堆栈大小