Если соответствие шаблону, скопируйте следующую строку в буфер шаблона, удалите возврат, а затем выйдите из-за побочного эффекта.
sed '/pattern/ { N; s/.*\n//; q }; d'
Наиболее вероятной причиной такого поведения является то, что ваш размер размера стека слишком мал (по какой-либо причине). Поскольку e_in
является приватным для каждого потока OpenMP, одна копия на поток распределяется по стеку потоков (даже если вы указали -heap-arrays
!). 202000
элементы REAL(KIND=8)
принимают 1616 kB (или 1579 KiB).
Предел размера стека может управляться несколькими механизмами:
ulimit -s <stacksize in KiB>
. Это также ограничение размера стека для основного потока OpenMP. Значение этого предела также используется библиотекой потоков POSIX (pthreads
) в качестве размера стека по умолчанию при создании новых потоков. OMP_STACKSIZE
. Его значение представляет собой число с необязательным суффиксом k
/ K
для KiB, m
/ M
f для MiB или g
/ G
для GiB. Это значение не влияет на размер стека основного потока . libgomp
) распознает нестандартную переменную среды GOMP_STACKSIZE
. Если установлено, это переопределяет значение OMP_STACKSIZE
. KMP_STACKSIZE
. Если он установлен, он переопределяет значение OMP_STACKSIZE
, а также переопределяет значение GOMP_STACKSIZE
, если используется совместимость с OpenMP во время выполнения (которая по умолчанию используется по умолчанию, поскольку в настоящее время единственной доступной библиотекой времени Intel OpenMP является compat
). *_STACKSIZE
не установлена, по умолчанию для времени выполнения Intel OpenMP является 2m
для 32-разрядных архитектур и 4m
для 64-разрядных. LINK
, размер определяется с помощью /STACK:reserve[,commit]
. Аргумент reserve
указывает максимальный размер стека в байтах, в то время как дополнительный аргумент commit
указывает начальный размер фиксации. Оба могут быть указаны как шестнадцатеричные значения с использованием префикса 0x
. Если повторная привязка исполняемого файла не является опцией, размер стека может быть изменен путем редактирования заголовка PE с помощью EDITBIN
. Он принимает тот же аргумент, связанный с стеком, что и компоновщик. Программы, скомпилированные с оптимизацией всей программы MSVC (/GL
), не могут быть отредактированы. --stack
. Для передачи опции непосредственно из GCC можно использовать -Wl,--stack,<size in bytes>
. Обратите внимание, что потоки потоков фактически выделены с размером, заданным *_STACKSIZE
( или значение по умолчанию), в отличие от стека основного потока, который начинается с малого, а затем растет по требованию до установленного предела. Поэтому не устанавливайте *_STACKSIZE
на произвольное большое значение, иначе вы можете поразить ограничение размера виртуальной памяти процесса.
Вот несколько примеров:
$ ifort -openmp my_module.f90 main.f90
Установите основной стек ограничение по размеру до 1 MiB (дополнительный поток OpenMP получит по умолчанию 4 MiB):
$ ulimit -s 1024
$ ./a.out
zsh: segmentation fault (core dumped) ./a.out
Установите ограничение на размер основного стека до 1700 KiB:
$ ulimit -s 1700
$ ./a.out
0.000000000000000E+000
(0.000000000000000E+000,0.000000000000000E+000)
0.000000000000000E+000
(0.000000000000000E+000,0.000000000000000E+000)
Установите ограничение максимального размера стека на 2 MiB и размер стека дополнительного потока на 1 MiB:
$ ulimit -s 2048
$ KMP_STACKSIZE=1m ./a.out
zsh: segmentation fault (core dumped) KMP_STACKSIZE=1m ./a.out
В большинстве систем Unix ограничение размера стека основного потока устанавливается с помощью PAM или другого механизма входа (см. /etc/security/limits.conf
). Значение по умолчанию для Scientific Linux 6.3 - 10 MiB.
Еще один возможный сценарий, который может привести к ошибке, - это ограничение предельного значения виртуального адресного пространства. Например, если предел виртуального адресного пространства равен 1 GiB, а ограничение размера стека потоков установлено на 512 MiB, то время выполнения OpenMP будет пытаться выделить 512 MiB для каждого дополнительного потока. С двумя потоками один будет иметь только 1 гигабайт только для стеков, и когда будет добавлено пространство для кода, разделяемые библиотеки, куча и т. Д., Размер виртуальной памяти будет превышать 1 гигабайт и произойдет ошибка:
Установите ограничение виртуального адресного пространства на 1 GiB и запустите с двумя дополнительными потоками с 512 ячейками MiB (я прокомментировал вызов omp_set_num_threads()
):
$ ulimit -v 1048576
$ KMP_STACKSIZE=512m OMP_NUM_THREADS=3 ./a.out
OMP: Error #34: System unable to allocate necessary resources for OMP thread:
OMP: System error #11: Resource temporarily unavailable
OMP: Hint: Try decreasing the value of OMP_NUM_THREADS.
forrtl: error (76): Abort trap signal
... trace omitted ...
zsh: abort (core dumped) OMP_NUM_THREADS=3 KMP_STACKSIZE=512m ./a.out
В этом случае OpenMP библиотека времени выполнения не сможет создать новый поток и уведомит вас до того, как он прекратит завершение программы.
gfortran
иifort
частные копии статических массивов всегда автоматически и распределяются по стеку потоков, несмотря на любые параметры компилятора, которые могут повлиять на размещение регулярных массивов. – Hristo Iliev 7 November 2012 в 12:10