Компиляция 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, тогда вы должны определить это. Один из способов сделать это - раскомментировать строки, которые его определяют. Или повторно загрузите оригинальные источники, так как ваши не совпадают с официальными.

Другие вопросы по тегам