Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 如何将openmp线程堆栈设置为无限?_Fortran_Openmp_Intel Fortran_Stack Size - Fatal编程技术网

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

Fortran 如何将openmp线程堆栈设置为无限?,fortran,openmp,intel-fortran,stack-size,Fortran,Openmp,Intel Fortran,Stack Size,有人能告诉我如何将OpenMP堆栈大小设置为无限制吗? 像这样的链接: 我还有一个用Fortran编写的项目(客户的复杂代码),如果我设置了OMP\u STACKSIZE,项目运行正常。如果我取消设置,项目将失败 但是,不同的输入数据具有不同的OMP\u STACKSIZE,因此我必须为每个inputdata尝试它(因为我必须节省内存) 我可以像pthread(ulimit-s unlimited)那样设置OpenMP堆栈吗?或者有办法动态设置omp堆栈大小 我正在使用RHEL 6.1和英特尔编

有人能告诉我如何将OpenMP堆栈大小设置为无限制吗?
像这样的链接:

我还有一个用Fortran编写的项目(客户的复杂代码),如果我设置了
OMP\u STACKSIZE
,项目运行正常。如果我取消设置,项目将失败

但是,不同的输入数据具有不同的
OMP\u STACKSIZE
,因此我必须为每个inputdata尝试它(因为我必须节省内存)

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

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


非常感谢

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

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

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

在Linux/x86-32上,新线程的默认堆栈大小为2 MB。在NPTL线程实现下,如果程序启动时的
RLIMIT_堆栈
soft resource limit具有“unlimited”以外的任何值,则它将确定新线程的默认堆栈大小。使用
pthread\u attr\u setstacksize(3)
,可以在用于创建线程的attr参数中显式设置堆栈大小属性,以获得默认值以外的堆栈大小


换句话说,答案是否定的-除了主线程之外,不能为线程指定不受限制的堆栈大小。

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

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

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

在Linux/x86-32上,新线程的默认堆栈大小为2 MB。在NPTL线程实现下,如果程序启动时的
RLIMIT_堆栈
soft resource limit具有“unlimited”以外的任何值,则它将确定新线程的默认堆栈大小。使用
pthread\u attr\u setstacksize(3)
,可以在用于创建线程的attr参数中显式设置堆栈大小属性,以获得默认值以外的堆栈大小


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

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