Как установить неограниченный стек потоков openmp?

Может ли кто-нибудь сказать мне, как установить неограниченный размер стека OpenMP?
Как эта ссылка: Почему в этом коде openmp возникает ошибка сегментации?

У меня тоже есть проект написанный на Фортране (сложный код заказчика), если поставить OMP_STACKSIZE проект работает нормально. Если я отключу его, проект потерпит неудачу.

Но разные входные данные имеют разные OMP_STACKSIZE, поэтому я должен попробовать это для каждых входных данных (потому что я должен экономить память).

Могу ли я установить стек OpenMP как pthread (ulimit -s unlimited)? Или есть способ динамически установить размер стека omp?

Я использую RHEL 6.1 и компилятор Intel.

Большое спасибо!


person user3044046    schedule 28.11.2013    source источник
comment
Я помню, как раньше видел трюк с ulimit -s где-то в документации Intel Fortran или в FAQ (который я не могу найти снова), поэтому я считаю, что это должно сработать для вас. Я почти уверен, что это ограничение ОС, поэтому оно одинаково независимо от вашего компилятора, есть ли у вас OpenMP или pthreads или любые другие подобные детали.   -  person DaveP    schedule 28.11.2013
comment
У вас не может быть неограниченного размера стека, потому что у вас нет неограниченной памяти. Операционная система должна куда-то поместить стек вашего потока. ulimit -s unlimited просто означает, что ОС позволит вам использовать любой размер стека, который вы пожелаете.   -  person pburka    schedule 29.11.2013


Ответы (1)


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

«Неограниченный» стек основного потока начинается с наивысшего виртуального адреса, доступного в пользовательском режиме, и растет вниз, пока не встретит прерывание программы (конец сегмента данных) или не достигнет другого выделения памяти (либо именованного, либо анонимного отображения), в котором точка программа вылетает.

Любые дополнительные стеки должны быть размещены где-то в памяти между прерыванием программы и нижней частью основного стека. Они не могут иметь произвольной расширяемой длины, поскольку их начальное размещение (т. е. расстояние между их началами) определяет их максимальные размеры (и наоборот — заданные максимальные размеры определяют их начальное размещение). По этой причине реализация pthread_create(3) для Linux (используется практически всеми средами выполнения OpenMP для создания новых потоков) гласит:

В Linux/x86-32 размер стека по умолчанию для нового потока составляет 2 мегабайта. В реализации многопоточности NPTL, если RLIMIT_STACK ограничение мягких ресурсов во время запуска программы имеет любое значение, кроме "неограниченно", то оно определяет размер стека по умолчанию для новых потоков. Используя pthread_attr_setstacksize(3), атрибут размера стека можно явно установить в аргументе attr, используемом для создания потока, чтобы получить размер стека, отличный от значения по умолчанию.

Другими словами, ответ отрицательный — нельзя указать неограниченный размер стека для потоков, отличных от основного.

person Hristo Iliev    schedule 29.11.2013