OpenMP编程:如何指定线程数作为命令行选项

时间:2015-12-21 21:53:30

标签: openmp

我正在运行本地blastx服务器。其中一个命令行选项是-num_threads。查看可执行文件blastx,认为它可能是设置OMP_NUM_THREADS的shell脚本,但事实证明它是在机器代码中。我假设(可能不正确)它是一个OpenMP应用程序,这让我思考。

问题:是否可以将OpenMP线程的数量更改为命令行选项,而不是使用环境变量OMP_NUM_THREADS?

2 个答案:

答案 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线程数,那么您需要的是:

  1. 要手动或使用omp_set_num_threads()之类的函数解析命令行,并将读取的值存储在变量中;和
  2. 在调用num_threads()或作为OMP_NUM_THREADS子句的参数时使用此值。两者中的任何一个都优先于为then设置的可能值。

答案 1 :(得分:0)

OMP_NUM_THREADS在运行时由程序解析,因此它已经完成了您想要的操作。

在编译时设置它没有任何效果(除非您专门设计构建系统以使用它)。

因为您导出了这个环境变量,所以它也会在运行时出现。这就是为什么你认为它在编译时正在做的事情。