Ошибка Accellera SystemC с большим количеством SC_THREAD

В контексте моделирования SystemC со многими процессами SC_THREAD (> 32000) я столкнулся со следующей ошибкой с реализацией Accellera 2.3.1 на платформе Intel X86 под управлением Ubuntu 15.04:

sc_cor_qt.cpp:114: virtual void sc_core::sc_cor_qt::stack_protect(bool) 
Assertion `ret == 0' failed

Реализация ядра SystemC по умолчанию использует потоки пользовательского уровня (также называемые сопрограммами) для реализации процессов SystemC. Статические процессы (SC_THREAD и SC_CTHREAD) инициализируются в строке sc_simcontext.cpp 759 thread_p->prepare_for_simulation() Эта функция создаст объект потока пользовательского уровня, а затем включит защиту стека.

Стек пользовательского потока выделяется в куче процесса имитации SystemC следующей строкой cor->m_stack = new char[cor->m_stack_size]

Проблема, с которой я столкнулся, возникает в функции защиты стека после создания, которая использует системный вызов mprotect для создания страницы сразу после стека потока пользовательского уровня (опять же, находясь в куче Linux процесс) вообще недоступен (PROT_NONE). Ошибка (ENOMEM), которую я получил от mprotect, говорит о том, что эта страница, которую мы хотим защитить, никогда не отображалась в процесс или, что ядро ​​не смогло выделить некоторые внутренние структуры во время выполнения вызова mprotect. К сожалению, я не могу знать, какая из этих двух ошибок происходит и как ее исправить.

Более того, я не вижу, где эта лишняя страница выделяется в куче линуксового процесса до того, как будет сделан вызов mprotect.

Кто-нибудь знает, что происходит и/или что я могу знать для дальнейшего отладки этой проблемы?


person Manuel Selva    schedule 16.03.2016    source источник
comment
Этот вопрос, я думаю, объясняет вашу проблему в Linux.   -  person StaceyGirl    schedule 15.04.2018


Ответы (2)


Проблема заключается в максимальном количестве сопоставлений памяти, разрешенных одним процессом. Каждый вызов mprotect приводит к одному отображению памяти, в результате чего общее количество отображений превышает лимит моей системы по умолчанию. Чтобы увеличить этот лимит, нужно использовать:

sudo sysctl vm/max_map_count=524240
person Manuel Selva    schedule 17.03.2016

Похоже, что большая часть вашего хранилища должна быть в куче, но попробуйте увеличить размер стека, если это ограничивает выделение некоторых объектов SC.

Проверить текущий размер стека: (из csh)

лимит (или от sh: ulimit -a)

Если еще не безлимит, увеличьте одним из них:

ограничение размера стека 1024 м (из sh: ulimit -s 1024000)

limit stacksize неограничен (от sh: ulimit -s неограниченно)

person Mr Bone    schedule 16.03.2016
comment
Спасибо за ответ, но проблема была в количестве отображений памяти. Смотри мой ответ - person Manuel Selva; 17.03.2016