【发布时间】:2019-04-28 19:15:27
【问题描述】:
关于堆栈空间问题、OpenMP 以及如何处理它的其他帖子有很多回复。但是,我找不到信息来真正理解 OpenMP 调整编译器选项的原因:
gfortran 中的-fopenmp 暗示-frecursive 背后的原因是什么?
文档说:
通过强制将所有本地数组分配到堆栈上来允许间接递归
但是,我没有上下文来理解这一点。为什么并行化需要间接递归?
为什么并行化希望所有本地数组都在堆栈上?
我希望了解,因此我知道覆盖这些选项的后果,例如使用 -fmax-stack-var-size=n,以避免堆栈溢出问题。
【问题讨论】:
-
"为什么并行化希望所有本地数组都在堆栈上?" 通过使用堆栈数组,它会自动使它们成为线程安全的,在每个线程都有的线程区域中它自己的堆栈,通常也足够分开以避免错误共享的锁。