Компиляция Scilab "не может выделить это количество памяти"
Я сталкиваюсь с проблемами с выделением памяти в Scilab после компиляции.
Я собираю на Red Hat на ppc64 (POWER8). Пределы стека уже установлены на неограниченный (ulimit -s unlimited
). ./configure
скрипт (с несколькими опциями, которые я здесь не показываю) выполняется успешно, но make all
терпит неудачу и останавливается. Когда он останавливается, он застревает в командной строке Scilab с этим сообщением:
./bin/scilab-cli -ns -noatomsautoload -f modules/functions/scripts/buildmacros/buildmacros.sce
stacksize(5000000);
!--error 10001
stacksize: Cannot allocate memory.
%s: Cannot allocate this quantity of memory.
at line 27 of exec file called by :
exec('modules/functions/scripts/buildmacros/buildmacros.sce',-1)
-->
Я немного исследовал, и это сообщение об ошибке, кажется, вызывается, конечно, в строке 00027
в buildmatros.sce
где функция stacksize(5000000)
называется.
Эта функция определена в:
scilab-5.5.1/modules/core/sci_gateway/c/sci_stacksize.c
Я нашел версию файла на этой странице: http://doxygen.scilab.org/master_wg/d5/dfb/sci__stacksize_8c_source.html. Мне кажется, что условие FALSE, которое вызывает сообщение, появляется в строке 00295.
Внутри этого файла вы видите, что ошибка отображается всякий раз, когда stacksize
задано в качестве входных данных больше, чем то, что возвращается методом get_max_memory_for_scilab_stack()
из класса:
scilab-5.5.1/modules/core/src/c/stackinfo.c
Снова я нашел версию онлайн на следующей странице: http://doxygen.scilab.org/master_wg/dd/dfb/stackinfo_8h.html Метод объявлен из строки 109
,
Кажется, вызвать переменную с именем MAXLONG
что, однако, НИКОГДА не указывается явно! Как видите, он объявляется несколько раз (строка 00019
, 00035
, 00043
, 00050
), но все строки закомментированы! [исправление: строки НЕ комментируются, это было мое неверное понимание того, что # является знаком комментария, но это не так]
Так что мое предположение таково: MAXLONG
не объявлено, поэтому функция не возвращает значение (или возвращает 0) и, следовательно, сообщение об ошибке выдается, потому что stacksize
задано как входное значение выше 0 или NULL
или же N/A
,
Мои вопросы тогда:
- Почему все строки прокомментированы там, где определяется MAXLONG?
- Откуда исходит MAXLONG? Это что-то передается из ядра?
- Как я могу решить проблему?
Спасибо!
PS - я пытался раскомментировать строку в buildmacros
, и это скомпилировано и установлено без проблем. Тем не менее, когда я начал scilab-cli
, он снова отобразил то же сообщение.
Изменить после дальнейшего расследования:
После дальнейшего изучения я обнаружил, что то, что я считал комментариями, действительно является инструкцией для компилятора... но я сохранил свои ошибки, так что ответ на мой вопрос понятен.
Вот мои новые пункты.
В Scilab я заметил, что, давая входной размер стека за пределы, тот же метод get_max_memory_for_scilab_stack()
вызывается, чтобы получить верхнюю границу. Нижняя граница, которую я видел, определена по умолчанию.
-->stacksize(1)
!--error 1504
stacksize: Out of bounds value. Not in [180000,268435454].
Кроме того, размер стека кажется хорошим:
-->stacksize()
ans =
7999994. 332.
Тем не менее, при попытке дать такое значение между ними происходит сбой.
-->stacksize(1)
!--error 1504
stacksize: Out of bounds value. Not in [180000,268435454].
1 ответ
Кажется, вызвать переменную с именем MAXLONG
Это не переменная, а макрос препроцессора.
Почему все строки прокомментированы там, где определяется MAXLONG?
Вы должны спросить об этом у человека, который прокомментировал строки. Они не комментируются в scilab-5.5.1, который онлайн.
Откуда исходит MAXLONG? Это что-то передается из ядра?
Это определено в файле scilab-5.5.1/modules/core/src/c/stackinfo.c
, Он определен с тем же значением, что и LONG_MAX
который определяется стандартной библиотекой c (<limits.h>
заголовок). Если макрос не предоставляется стандартной библиотекой, то он определен для какого-то другого, специфичного для платформы значения.
Как я могу решить проблему?
Если ваша проблема возникает из-за отсутствия определения MAXLONG
, тогда вы должны определить это. Один из способов сделать это - раскомментировать строки, которые его определяют. Или повторно загрузите оригинальные источники, так как ваши не совпадают с официальными.