我正在运行本地blastx服务器。其中一个命令行选项是-num_threads。查看可执行文件blastx,认为它可能是设置OMP_NUM_THREADS的shell脚本,但事实证明它是在机器代码中。我假设(可能不正确)它是一个OpenMP应用程序,这让我思考。
问题:是否可以将OpenMP线程的数量更改为命令行选项,而不是使用环境变量OMP_NUM_THREADS?
答案 0 :(得分:7)
使用OpenMP,您基本上有3种不同的方式来指定parallel
区域中要使用的线程数:
OMP_NUM_THREADS
,需要在运行它之前在代码的环境中设置才能生效; omp_set_num_threads()
,在到达并行区域之前调用;和num_threads()
指令的可选parallel
子句。这些优先级的相对优先级为defined in great details by the standard,但可以归结为num_threads()
优先于omp_set_num_threads()
,OMP_NUM_THREADS
优先于getopt
。
现在,如果您希望让代码定义要用作命令行选项的OpenMP线程数,那么您需要的是:
omp_set_num_threads()
之类的函数解析命令行,并将读取的值存储在变量中;和num_threads()
或作为OMP_NUM_THREADS
子句的参数时使用此值。两者中的任何一个都优先于为then
设置的可能值。答案 1 :(得分:0)
OMP_NUM_THREADS在运行时由程序解析,因此它已经完成了您想要的操作。
在编译时设置它没有任何效果(除非您专门设计构建系统以使用它)。
因为您导出了这个环境变量,所以它也会在运行时出现。这就是为什么你认为它在编译时正在做的事情。