OpenMP 编程:如何将线程数指定为命令行选项
OpenMP Programming : How to specify the number of threads as a command line option
我是 运行 本地 blastx 服务器。命令行选项之一是 -num_threads。查看可执行文件blastx,以为可能是设置OMP_NUM_THREADS的shell脚本,结果发现是机器码。我假设(可能不正确)它是一个 OpenMP 应用程序,这让我开始思考。
问题:是否可以通过命令行选项更改 OpenMP 线程数,而不是使用环境变量 OMP_NUM_THREADS?
OMP_NUM_THREADS 由程序在运行时解析,所以它已经做了你想要的。
在编译时设置它没有效果(除非你专门设计你的构建系统来使用它)。
因为您导出了这个环境变量,它在运行时也存在。这就是为什么您认为它在编译时正在做某事的原因。
使用 OpenMP,您基本上有 3 种不同的方法来指定要在 parallel
区域中使用的线程数:
- 最常用的是环境变量
OMP_NUM_THREADS
,需要先在代码的环境中设置运行才能生效;
- 函数
omp_set_num_threads()
,在到达并行区域之前调用;和
parallel
指令的可选 num_threads()
子句。
它们的相对优先级是 defined in great details by the standard,但几乎可以归结为 num_threads()
优先于 omp_set_num_threads()
,后者本身优先于 OMP_NUM_THREADS
。
所以现在,如果您想让代码定义 OpenMP 线程数以用作命令行选项,您需要的是:
- 手动或使用像
getopt
这样的函数解析命令行,并将读取的值存储在变量中;和
- 在调用
omp_set_num_threads()
或作为 num_threads()
子句的参数时使用此值。两者中的任何一个都将优先于为 OMP_NUM_THREADS
. 设置的可能值
我是 运行 本地 blastx 服务器。命令行选项之一是 -num_threads。查看可执行文件blastx,以为可能是设置OMP_NUM_THREADS的shell脚本,结果发现是机器码。我假设(可能不正确)它是一个 OpenMP 应用程序,这让我开始思考。
问题:是否可以通过命令行选项更改 OpenMP 线程数,而不是使用环境变量 OMP_NUM_THREADS?
OMP_NUM_THREADS 由程序在运行时解析,所以它已经做了你想要的。
在编译时设置它没有效果(除非你专门设计你的构建系统来使用它)。
因为您导出了这个环境变量,它在运行时也存在。这就是为什么您认为它在编译时正在做某事的原因。
使用 OpenMP,您基本上有 3 种不同的方法来指定要在 parallel
区域中使用的线程数:
- 最常用的是环境变量
OMP_NUM_THREADS
,需要先在代码的环境中设置运行才能生效; - 函数
omp_set_num_threads()
,在到达并行区域之前调用;和 parallel
指令的可选num_threads()
子句。
它们的相对优先级是 defined in great details by the standard,但几乎可以归结为 num_threads()
优先于 omp_set_num_threads()
,后者本身优先于 OMP_NUM_THREADS
。
所以现在,如果您想让代码定义 OpenMP 线程数以用作命令行选项,您需要的是:
- 手动或使用像
getopt
这样的函数解析命令行,并将读取的值存储在变量中;和 - 在调用
omp_set_num_threads()
或作为num_threads()
子句的参数时使用此值。两者中的任何一个都将优先于为OMP_NUM_THREADS
. 设置的可能值