Проблемы со стеком при копировании из массива в другой в Фортране? - PullRequest
2 голосов
/ 01 ноября 2019

Если я делаю следующую копию в Фортране

 arr(i1:i2) = u(1:n) 

, где SIZE(arr(i1:i2)) == SIZE(u(1:n)), а размер относительно большой, например, 2M элементов двойной точности.

Если переменная arr является псевдонимом указателя на другой размещаемый массив. Будет ли Фортран использовать стек или кучу памяти для обработки назначения копирования .?

Если он использует стек, есть ли какая-то конкретная причина для такого выбора .?

Как можно избежатькомпилятор, использующий стек, чтобы не получить переполнение стека, без необходимости запуска ulimit -s unlimited на терминале Linux .?

1 Ответ

5 голосов
/ 03 ноября 2019

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

Семантика Fortran заключается в том, что правая сторона назначения полностью вычисляется до того, как леваяизменилось. Если компилятор не докажет, что перекрытия нет (достаточно использования ALLOCATABLE), он, как правило, будет использовать временный стек для копии. Intel Fortran имеет опцию -heap-arrays, которая указывает ему распределять эти температуры в куче, избегая переполнения стека.

...