У меня есть проблема, о которой я пытался спросить ранее, но далеко не ушел, нашел новую информацию и надеюсь на большую помощь. Код представляет собой гибридный MPI
/ OPENMP
код, который дает сбой из-за ошибки сегментации при попытке запустить несколько узлов (хотя он работает, если он выполняется только на одном узле, из которого создается главный процесс). В этой задаче есть статические массивы, и я обнаружил, что если статические массивы «слишком большие», это вызывает ошибку сегмента, но если они «маленькие», все работает нормально. Я также преобразовал код в динамическое выделение памяти в качестве теста, и это решает проблему ... независимо от размера (даже больших, которые потерпели неудачу в статическом мире), код выполняется до конца просто отлично. Это решение не является долгосрочным, поскольку, поскольку тестовый код - это всего лишь ... тестовый код, существует гораздо больший код, который демонстрирует такое же поведение, и изменение его на динамическое не вариант. Мне нужно определить причину сбоя сегмента статического массива.
В принципе, в чем разница между тем, как статически и динамически выделяется память? Что (помимо того, что я пробовал) я должен попытаться преодолеть это? Я полагаю, что проблема связана с системной настройкой, которая, вероятно, нарушает только когда задания передаются через MPICH2, но не является проблемой при входе в узел (следовательно, почему он работает нормально на узлах, в которые я сейчас вошел).
В моем файле .bashrc
есть "ulimit -s unlimited
", "export OMP_STACKSIZE=4g
" и "export KMP_STACKSIZE=4G
", так как я использую компилятор ifort . Я считаю, что это должно быть относительно простым решением, но я не могу прийти к этому.
Если исходный код нарушающей программы желателен, я могу отправить его, но я думаю, что приведенное здесь описание охватывает проблему, просто дайте мне знать.