如何将openmp线程堆栈设置为无限制?

时间:2013-11-28 02:12:47

标签: fortran openmp intel-fortran stack-size

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

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

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

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

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

非常感谢!

1 个答案:

答案 0 :(得分:4)

主线程和工作线程的堆栈如何实现之间存在很大差异。

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

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

  

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

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