MATLAB的堆栈大小是多少?

4
MATLAB R2018a(64位)的默认堆栈大小是多少?
似乎堆栈大小比64位C#程序大。
为什么我要问这个问题
我之所以问这个问题,是因为我调用了Intel MKLs LAPACKE_dtrtri,这是一个非常递归的函数。
我在.NET应用程序中使用该函数,并在从C#调用它时遇到堆栈溢出错误,请参见What is the stack size of a BackgroundWorker DoWork Thread? Is there way to change it? 另一方面,如果我从MATLAB调用我的.NET应用程序,则不会遇到堆栈溢出错误。这就是我想知道MATLAB堆栈大小的原因。

3
是42。开个玩笑:您能否进一步阐述您的问题?对我来说,不太清楚您想知道什么。 - HansHirse
这个问题是否可能重新开放,以便我可以回答自己的问题。顺便说一下,MATLAB的堆栈大小似乎为64 MB,我想在我的答案中解释一下。 - Wollmich
2
我问了以下问题:当MATLAB调用DLL函数时,堆栈限制是多少。我认为堆栈大小为64MByte。 - Rotem
3个回答

4
使用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位),请参见BackgroundWorker DoWork线程的堆栈大小是多少?有没有更改的方法?


@Adriaan 默认的 C# 堆栈大小为 1 MB(32 位)和 4 MB(64 位)。 - Wollmich
仅作为附加信息。使用PYTHONNET的Python 3.6.6(64位)的堆栈大小为1984 kB。 - Wollmich

1
虽然我没有直接回答你的问题,但是MATLAB的递归限制可以通过get(0,'RecursionLimit')获得或通过set(0,'RecursionLimit',N)设置。除此之外,我认为MATLAB会一直存储变量直到你的RAM用尽,但不确定。

我猜这个RecursionLimit只用于MATLAB函数(m文件),但如果我从MATLAB调用.NET方法,则堆栈大小是相关的。 - Wollmich
@Wollmich 我怀疑这个问题比“MATLAB的堆栈大小是多少”更难。可能是“当从内部调用时,MATLAB为.NET应用程序提供的堆栈大小是多少”。 - Ander Biguri
如果MATLAB没有为.NET创建一个新线程,那么它的堆栈大小与MATLAB相同。是这样吗? - Wollmich
@Wollmich 你是通过 mex 接口在做吗?我认为当matlab调用它时会创建一个锁定的新线程,但我不确定。 - Ander Biguri
我正在使用.NET接口进行操作,参见https://ch.mathworks.com/help/matlab/getting-started.html。 - Wollmich

1

使用 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 兆字节。

"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接