Fortran,Open MP,间接递归和有限的堆栈内存

时间:2018-11-27 05:02:48

标签: fortran openmp gfortran

关于其他文章,关于堆栈空间,OpenMP及其处理方法的回复很多。但是,我找不到真正理解OpenMP为何调整编译器选项的信息:​​

gfortran中的-fopenmp暗示-frecursive的背后原因是什么?

文档说:

  

通过强制在堆栈上分配所有本地数组来允许间接递归

但是,我没有上下文可以理解这一点。为什么并行化需要间接递归?

为什么并行化希望所有本地数组都在堆栈上?

我希望理解,以便知道使用-fmax-stack-var-size=n覆盖这些选项的后果,以避免堆栈溢出问题。

1 个答案:

答案 0 :(得分:2)

如果不使用-frecursive,则编译器会将超出限制-fmax-stack-var-size =的局部变量放入静态内存而不是堆栈中。也就是说,它们的行为就像它们具有SAVE属性,并且在所有线程之间共享。这些语义对于多线程程序是毫无意义的,因此-fopenmp意味着-frecursive。

由于多线程程序的日益普及,并且由于F2018指定默认情况下过程是递归的,因此此行为将在将来的GFortran版本中更改,最有可能是在超过堆栈的大小限制时切换到堆分配变量而不是使用静态内存。但是目前,这不是一个选择。