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