0

有人能告诉我如何将 OpenMP 堆栈大小设置为无限制吗?
像这个链接:为什么在这个openmp代码中发生分段错误?

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

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

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

我正在使用 RHEL 6.1 和英特尔编译器。

非常感谢!

4

1 回答 1

5

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

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

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

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

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

于 2013-11-29T09:04:52.633 回答