GNU Fortran / OpenMP 程序如何设置和检索 stacksize-var ICV?
How can a GNU Fortran / OpenMP program set and retrieve the stacksize-var ICV?
我正在尝试使用 gfortran / libgomp 构建第三方 OpenMP 程序,但我 运行 遇到了它使用扩展来检索和设置 stacksize-var 的麻烦 智能汽车。源代码带有 Intel Fortran(kmp_get_stacksize()
和 kmp_set_stacksize()
)和 Portland Group 编译器(omp_get_stack_size()
和 omp_set_stack_size()
)的替代品,但是如何用GNU Fortran 和 libgomp?
我知道 OMP_STACKSIZE
和 GOMP_STACKSIZE
环境变量,但我的理解是实际的 ICV 是分开的,因此在程序启动后以编程方式设置其中之一不会影响ICV,并且读取报告仅报告该环境变量,而不报告 ICV。
在 Linux 上特定于 gfortran 和/或 libgomp 运行 的解决方案是可以接受的。
我正在使用 GCC 4.8.5 中的 gfortran 和 libgomp。
标准本身不提供修改或检索 stacksize-var ICV 的方法。所以你注定要使用特定于实现的解决方案。
现在 libgomp 转发值 specified by environment variables directly to pthread。
所以你可以说 libgomp 在 gomp_thread_attr
中存储了 stacksize-var。不幸的是,这似乎是 libgomp
中的本地符号,我认为您无法合理地访问它。
libgomp的initialize_env
在库初始化的时候就已经调用了,不是在第一个并行区,所以修改环境变量其实是没有效果的
对于非主线程,你至少可以读取实际值。尽管 pthread 可能使用对齐的堆栈大小,因此它可能与 libgomp 指定的值不同。
size_t stacksize;
pthread_attr_t attr;
// TODO check return values
pthread_getattr_np(pthread_self(), &attr);
pthread_attr_getstacksize(&attr, &stacksize);
我正在尝试使用 gfortran / libgomp 构建第三方 OpenMP 程序,但我 运行 遇到了它使用扩展来检索和设置 stacksize-var 的麻烦 智能汽车。源代码带有 Intel Fortran(kmp_get_stacksize()
和 kmp_set_stacksize()
)和 Portland Group 编译器(omp_get_stack_size()
和 omp_set_stack_size()
)的替代品,但是如何用GNU Fortran 和 libgomp?
我知道 OMP_STACKSIZE
和 GOMP_STACKSIZE
环境变量,但我的理解是实际的 ICV 是分开的,因此在程序启动后以编程方式设置其中之一不会影响ICV,并且读取报告仅报告该环境变量,而不报告 ICV。
在 Linux 上特定于 gfortran 和/或 libgomp 运行 的解决方案是可以接受的。
我正在使用 GCC 4.8.5 中的 gfortran 和 libgomp。
标准本身不提供修改或检索 stacksize-var ICV 的方法。所以你注定要使用特定于实现的解决方案。
现在 libgomp 转发值 specified by environment variables directly to pthread。
所以你可以说 libgomp 在 gomp_thread_attr
中存储了 stacksize-var。不幸的是,这似乎是 libgomp
中的本地符号,我认为您无法合理地访问它。
libgomp的initialize_env
在库初始化的时候就已经调用了,不是在第一个并行区,所以修改环境变量其实是没有效果的
对于非主线程,你至少可以读取实际值。尽管 pthread 可能使用对齐的堆栈大小,因此它可能与 libgomp 指定的值不同。
size_t stacksize;
pthread_attr_t attr;
// TODO check return values
pthread_getattr_np(pthread_self(), &attr);
pthread_attr_getstacksize(&attr, &stacksize);