Fortran, Open MP, косвенная рекурсия и ограниченная память стека - PullRequest
0 голосов
/ 27 ноября 2018

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

Какова причина, по которой -fopenmp в gfortran подразумевает -frecursive?

В документации сказано:

Разрешить косвенную рекурсию путем принудительного размещения всех локальных массивов в стеке

Однако у меня нет контекста, чтобы это понять.Почему для распараллеливания требуется косвенная рекурсия?

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

Я хочу понять, чтобы я знал о последствиях переопределения этих опций, скажем, с помощью -fmax-stack-var-size=n, чтобы избежать проблем с переполнением стека.

1 Ответ

0 голосов
/ 27 ноября 2018

Без -frecursive компилятор поместит локальные переменные, превышающие предел -fmax-stack-var-size = в статическую память вместо стека.То есть они будут вести себя так, как будто они имеют атрибут SAVE, и они являются общими для всех потоков.Эта семантика бессмысленна для многопоточной программы, поэтому -fopenmp подразумевает -frecursive.

Из-за растущей распространенности многопоточных программ, а также из-за того, что F2018 указывает, что процедуры являются рекурсивными по умолчанию, это поведениеизменится в будущем выпуске GFortran, скорее всего, переключившись на выделение кучи при превышении предельного размера для переменных стека вместо использования статической памяти.Но пока это не вариант.

...