OpenMP вызывает segfault [duplicate]

Если соответствие шаблону, скопируйте следующую строку в буфер шаблона, удалите возврат, а затем выйдите из-за побочного эффекта.

sed '/pattern/ { N; s/.*\n//; q }; d'
11
задан xslittlegrass 7 November 2012 в 08:27
поделиться

2 ответа

Наиболее вероятной причиной такого поведения является то, что ваш размер размера стека слишком мал (по какой-либо причине). Поскольку e_in является приватным для каждого потока OpenMP, одна копия на поток распределяется по стеку потоков (даже если вы указали -heap-arrays!). 202000 элементы REAL(KIND=8) принимают 1616 kB (или 1579 KiB).

Предел размера стека может управляться несколькими механизмами:

  • В стандартных оболочках системы Unix размер стека контролируется с помощью ulimit -s <stacksize in KiB>. Это также ограничение размера стека для основного потока OpenMP. Значение этого предела также используется библиотекой потоков POSIX (pthreads) в качестве размера стека по умолчанию при создании новых потоков.
  • OpenMP поддерживает контроль над пределом размера стека для всех дополнительных через переменную среды OMP_STACKSIZE. Его значение представляет собой число с необязательным суффиксом k / K для KiB, m / M f для MiB или g / G для GiB. Это значение не влияет на размер стека основного потока .
  • Время выполнения GNU OpenMP (libgomp) распознает нестандартную переменную среды GOMP_STACKSIZE. Если установлено, это переопределяет значение OMP_STACKSIZE.
  • Время выполнения Intel OpenMP распознает нестандартную переменную среды KMP_STACKSIZE. Если он установлен, он переопределяет значение OMP_STACKSIZE, а также переопределяет значение GOMP_STACKSIZE, если используется совместимость с OpenMP во время выполнения (которая по умолчанию используется по умолчанию, поскольку в настоящее время единственной доступной библиотекой времени Intel OpenMP является compat ).
  • Если ни одна из переменных *_STACKSIZE не установлена, по умолчанию для времени выполнения Intel OpenMP является 2m для 32-разрядных архитектур и 4m для 64-разрядных.
  • В Windows размер стека основного потока является частью заголовка PE и встроен в него компоновщиком. Если для соединения используется Microsoft LINK, размер определяется с помощью /STACK:reserve[,commit]. Аргумент reserve указывает максимальный размер стека в байтах, в то время как дополнительный аргумент commit указывает начальный размер фиксации. Оба могут быть указаны как шестнадцатеричные значения с использованием префикса 0x. Если повторная привязка исполняемого файла не является опцией, размер стека может быть изменен путем редактирования заголовка PE с помощью EDITBIN . Он принимает тот же аргумент, связанный с стеком, что и компоновщик. Программы, скомпилированные с оптимизацией всей программы MSVC (/GL), не могут быть отредактированы.
  • Компонент GNU для целей Win32 поддерживает установку размера стека с помощью аргумента --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 библиотека времени выполнения не сможет создать новый поток и уведомит вас до того, как он прекратит завершение программы.

17
ответ дан Hristo Iliev 22 August 2018 в 00:55
поделиться
  • 1
    Я пропустил это, думал, что эти массивы всего 2 элемента. Во всяком случае, я часто использую -fstack-массивы с массивами, большими по порядку величины. Но не с Ifort. – Vladimir F 7 November 2012 в 11:50
  • 2
    Это немного запутывает то, что с gfortran и ifort частные копии статических массивов всегда автоматически и распределяются по стеку потоков, несмотря на любые параметры компилятора, которые могут повлиять на размещение регулярных массивов. – Hristo Iliev 7 November 2012 в 12:10
4
ответ дан Community 22 August 2018 в 00:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: