Использование памяти FORTRAN - статический или динамический - PullRequest
3 голосов
/ 24 декабря 2011

У меня есть проблема, о которой я пытался спросить ранее, но далеко не ушел, нашел новую информацию и надеюсь на большую помощь. Код представляет собой гибридный MPI / OPENMP код, который дает сбой из-за ошибки сегментации при попытке запустить несколько узлов (хотя он работает, если он выполняется только на одном узле, из которого создается главный процесс). В этой задаче есть статические массивы, и я обнаружил, что если статические массивы «слишком большие», это вызывает ошибку сегмента, но если они «маленькие», все работает нормально. Я также преобразовал код в динамическое выделение памяти в качестве теста, и это решает проблему ... независимо от размера (даже больших, которые потерпели неудачу в статическом мире), код выполняется до конца просто отлично. Это решение не является долгосрочным, поскольку, поскольку тестовый код - это всего лишь ... тестовый код, существует гораздо больший код, который демонстрирует такое же поведение, и изменение его на динамическое не вариант. Мне нужно определить причину сбоя сегмента статического массива.

В принципе, в чем разница между тем, как статически и динамически выделяется память? Что (помимо того, что я пробовал) я должен попытаться преодолеть это? Я полагаю, что проблема связана с системной настройкой, которая, вероятно, нарушает только когда задания передаются через MPICH2, но не является проблемой при входе в узел (следовательно, почему он работает нормально на узлах, в которые я сейчас вошел).

В моем файле .bashrc есть "ulimit -s unlimited", "export OMP_STACKSIZE=4g" и "export KMP_STACKSIZE=4G", так как я использую компилятор ifort . Я считаю, что это должно быть относительно простым решением, но я не могу прийти к этому.

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

1 Ответ

5 голосов
/ 24 декабря 2011

Статически размещенные объекты появляются в стеке, а динамические - в куче. Вот почему небольшие статические массивы работают хорошо, а большие - нет.

Поскольку вы используете компилятор ifort, вы можете попробовать скомпилировать с -heap-arrays, но это поместит только динамически размещенные массивы в кучу (ifort уникален тем, что «временные» выделяемые массивы могут попадать в стек, как те, что выделено в подпрограммах).

Другая вещь, которую нужно проверить, заключается в том, что задание MPI фактически позволяет вам устанавливать размер стека. Попробуйте запустить mpirun -n <numprocs> ulimit -s, и он должен показать все unlimited, в противном случае он не учитывает ваш bashrc.

Вы можете попробовать скрипт bash (myScript.sh), например:

#!/bin/bash
ulimit -s unlimited
./myProg

, который затем будет запускаться с:

mpiexec -n <numprocs> myScript.sh
...