有人能告诉我如何将OpenMP堆栈大小设置为无限制吗? 喜欢这个链接:Why Segmentation fault is happening in this openmp code?
我还有一个由Fortran编写的项目(客户的复杂代码),如果我设置OMP_STACKSIZE
,项目正常运行。如果我取消它,项目就会失败。
但是,不同的输入数据有不同的OMP_STACKSIZE
,所以我必须为每个输入数据尝试它(因为我必须节省内存)。
我可以像pthread(ulimit -s unlimited
)一样设置OpenMP堆栈吗?或者有一些方法动态设置omp堆栈大小?
我正在使用RHEL 6.1和英特尔编译器。
非常感谢!
答案 0 :(得分:4)
主线程和工作线程的堆栈如何实现之间存在很大差异。
主线程的“无限”堆栈从用户模式下可用的最高虚拟地址开始,向下增长直到遇到程序中断(数据段结束)或命中另一个内存分配(命名或匿名映射) )程序崩溃了。
任何额外的堆栈都必须放在程序中断和主堆栈底部之间的内存中。它们不能具有任意可伸长的长度,因为它们的初始放置(即它们的开始之间的距离)决定了它们的最大尺寸(反之亦然 - 指定的最大尺寸决定了它们的初始位置)。这就是为什么pthread_create(3)的Linux实现(几乎所有OpenMP运行时都用来创建新线程)的原因:
在Linux / x86-32上,新线程的默认堆栈大小为2兆字节。在NPTL线程实现下,如果程序启动时
RLIMIT_STACK
软资源限制 具有除“unlimited”之外的任何值,则它确定新线程的默认堆栈大小。使用pthread_attr_setstacksize(3)
,可以在用于创建线程的 attr 参数中显式设置堆栈大小属性,以获得不同于默认值的堆栈大小。
换句话说,答案是否定的 - 你不能为主要线程以外的线程指定无限的堆栈大小。