4

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

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

为什么我这么问

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

我在 .NET 应用程序中使用该函数,从 C# 调用它时出现堆栈溢出错误,请参阅BackgroundWorker DoWork 线程的堆栈大小是多少?有没有办法改变它?

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

4

3 回答 3

4

使用GetCurrentThreadStackLimits来自kernel32.dllI 的函数可以获得 MATLAB 的堆栈大小。

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

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;
    }
}

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

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 线程的堆栈大小是多少?有没有办法改变它?

于 2019-06-05T13:15:10.637 回答
1

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

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

于 2019-06-05T09:54:15.337 回答
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 兆字节。

于 2019-06-05T14:56:34.653 回答