Каков размер стека MATLAB? - PullRequest
4 голосов
/ 05 июня 2019

Каков размер стека по умолчанию для MATLAB R2018a (64-разрядная версия)?

Кажется, что размер стека больше, чем у 64-битной программы на C #.

Почему я спрашиваю, что

Я задаю этот вопрос, потому что я вызываю Intel MKL LAPACKE_dtrtri , который сильно рекурсивен.

Я использую эту функцию внутри приложения .NET и получаю ошибку переполнения стека при вызове ее из C #, см. Каков размер стека потока BackgroundWorker DoWork? Есть ли способ изменить это?

С другой стороны, если я вызываю свое приложение .NET из MATLAB, я не получаю ошибку переполнения стека. Вот почему я хотел узнать, какой размер стека у MATLAB.

Ответы [ 3 ]

4 голосов
/ 05 июня 2019

Используя функцию GetCurrentThreadStackLimits из kernel32.dll, я могу получить размер стека 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 МБ.

Кажется, что размер стека больше, чем у 64-битной программы на C #.

Размер стека по умолчанию на C # составляет 1 МБ (32-битная)) и 4 МБ (64-разрядная), см. Каков размер стека потока BackgroundWorker DoWork?Есть ли способ изменить это?

1 голос
/ 05 июня 2019

Используя команду 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 мегабайта.

0 голосов
/ 05 июня 2019

Хотя у меня нет прямого ответа на ваш вопрос, предел рекурсии MATLAB можно получить с помощью get(0,'RecursionLimit') или установить с помощью set(0,'RecursionLimit',N).

Полагаю, что кроме этого, MATLAB будет хранить переменные до тех пор, пока не исчерпается ваша RAM, но не уверен на 100%.

...