Как установить неограниченный стек потоков openmp?
Может кто-нибудь сказать мне, как установить неограниченный размер стека OpenMP?
Как эта ссылка: Почему в этом коде openmp происходит ошибка сегментации?
У меня также есть проект, написанный Fortran (сложный код клиента), если я установлю OMP_STACKSIZE
Проект работает нормально. Если я сбросил его, проект потерпит неудачу.
Но разные входные данные имеют разные OMP_STACKSIZE
, поэтому я должен попробовать это для каждого ввода данных (потому что я должен сохранить память).
Можно ли установить стек OpenMP как pthread (ulimit -s unlimited
)? Или есть какой-то способ динамически устанавливать размер стека omp?
Я использую RHEL 6.1 и компилятор Intel.
Большое спасибо!
1 ответ
Существует большая разница между реализацией стеков основного потока и рабочих потоков.
"Неограниченный" стек основного потока начинается с самого высокого виртуального адреса, доступного в пользовательском режиме, и уменьшается до тех пор, пока не достигнет разрыва программы (конец сегмента данных) или не достигнет другого выделения памяти (именованного или анонимного сопоставления), при котором Дык программа вылетает.
Любые дополнительные стеки должны быть размещены где-то в памяти между разрывом программы и нижней частью основного стека. Они не могут иметь произвольную расширяемую длину, поскольку их начальные размещения (то есть расстояние между их началами) определяют их максимальные размеры (и наоборот - указанные максимальные размеры определяют их первоначальное размещение). По этой причине в Linux-реализации pthread_create (3) (используемой практически всеми средами выполнения OpenMP для создания новых потоков) говорится:
В Linux/x86-32 размер стека по умолчанию для нового потока составляет 2 мегабайта. В рамках реализации потоков NPTL, если
RLIMIT_STACK
Мягкий лимит ресурсов на момент запуска программы имеет любое значение, кроме "неограниченное", затем он определяет размер стека по умолчанию для новых потоков. С помощьюpthread_attr_setstacksize(3)
атрибут размера стека может быть явно установлен в аргументе attr, используемом для создания потока, чтобы получить размер стека, отличный от значения по умолчанию.
Другими словами, ответ - нет - вы не можете указать неограниченный размер стека для потоков, отличных от основного.