【问题标题】:How to set openmp thread stack to unlimited?如何将openmp线程堆栈设置为无限?
【发布时间】:2013-12-13 22:11:15
【问题描述】:

谁能告诉我如何将 OpenMP 堆栈大小设置为无限制?
喜欢这个链接:Why Segmentation fault is happening in this openmp code?

我也有一个Fortran写的项目(客户的复杂代码),如果我设置OMP_STACKSIZE,项目运行正常。如果我取消设置,项目将失败。

但是,不同的输入数据有不同的OMP_STACKSIZE,所以我必须为每个输入数据尝试一下,(因为我必须节省内存)。

我可以像 pthread (ulimit -s unlimited) 一样设置 OpenMP 堆栈吗?或者有一些方法可以动态设置 omp 堆栈大小?

我使用的是 RHEL 6.1 和英特尔编译器。

非常感谢!

【问题讨论】:

  • 我记得之前在 intel fortran 文档或常见问题解答中的某处看到了 ulimit -s 技巧(我再也找不到了),所以我相信这对你有用。我很确定这是一个操作系统限制,所以无论你的编译器是什么,无论你有 OpenMP 还是 pthreads,或者任何其他类似的细节,它都是一样的。
  • 您不能拥有无限的堆栈大小,因为您没有无限的内存。操作系统必须把你的线程堆栈放在某个地方。 ulimit -s unlimited 只是意味着操作系统将允许您使用您希望使用的任何堆栈大小。

标签: fortran openmp intel-fortran stack-size


【解决方案1】:

主线程栈和工作线程栈的实现方式有很大区别。

主线程的“无限”堆栈从用户模式下可用的最高虚拟地址开始向下增长,直到遇到程序中断(数据段的末尾)或遇到另一个内存分配(命名或匿名映射) 此时程序崩溃。

任何额外的堆栈都必须放置在程序中断和主堆栈底部之间的内存中。它们不能具有任意可扩展长度,因为它们的初始位置(即它们的起点之间的距离)决定了它们的最大尺寸(反之亦然 - 指定的最大尺寸决定了它们的初始位置)。这就是为什么pthread_create(3)(几乎所有 OpenMP 运行时都使用它来创建新线程)的 Linux 实现声明的原因:

在 Linux/x86-32 上,新线程的默认堆栈大小为 2 兆字节。在 NPTL 线程实现下,如果RLIMIT_STACK 软资源限制在程序启动时具有除“unlimited”以外的任何值,则它确定新线程的默认堆栈大小。使用pthread_attr_setstacksize(3),可以在用于创建线程的attr 参数中显式设置堆栈大小属性,以获得非默认堆栈大小。

换句话说,答案是否定的——你不能为除主线程之外的线程指定无限的堆栈大小。

【讨论】:

    猜你喜欢
    • 2012-10-15
    • 2015-11-11
    • 2019-02-09
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2019-06-15
    相关资源
    最近更新 更多