C++如何正确设置环境变量使OpenBLAS以多线程模式运行
OpenBLAS 多线程配置不生效修复方案
现有操作的问题说明
- 在
main.cpp中直接写入export OPENBLAS_NUM_THREADS=16触发编译报错:export是Shell环境的内置命令,不属于C++标准语法,编译器无法识别该语句,报错属于正常现象。 - 在CMakeLists.txt中添加
set($ENV{OPENBLAS_NUM_THREADS} 16)不生效:CMake的set(ENV{...})语法仅对CMake构建阶段的进程生效,不会将环境变量嵌入到最终编译产出的可执行文件中,程序运行时无法读取到该配置,因此不会触发多线程。
官方线程配置规则
OpenBLAS 线程相关环境变量优先级如下:
OPENBLAS_NUM_THREADS>GOTO_NUM_THREADS>OMP_NUM_THREADS
注意:如果编译OpenBLAS时开启了USE_OPENMP=1编译选项,前两个环境变量会被OpenBLAS忽略,仅OMP_NUM_THREADS配置生效。
可用配置方案(按适用场景选择)
方案1:启动前通过Shell设置环境变量(无代码侵入,最通用)
直接在运行程序的终端执行环境变量导出命令,再启动程序即可:
# 未开启USE_OPENMP=1编译的版本使用 export OPENBLAS_NUM_THREADS=16 ./your_executable_file
如果是开启了OpenMP支持的编译版本,替换为对应环境变量即可:
export OMP_NUM_THREADS=16 ./your_executable_file
需要永久生效的话,把对应export语句写入当前用户的Shell配置文件(bash用户对应~/.bashrc,zsh用户对应~/.zshrc),执行source对应配置文件即可。
方案2:代码内调用接口动态设置(最灵活,不依赖运行环境)
不要在C++代码中写Shell命令,直接调用OpenBLAS官方提供的线程设置接口即可,必须在第一次调用OpenBLAS计算函数之前执行该设置,否则配置不生效:
// 引入OpenBLAS头文件,根据自己的头文件安装路径调整 #include <cblas.h> int main() { // 设置OpenBLAS使用16个线程 openblas_set_num_threads(16); // 后续写业务逻辑、OpenBLAS计算逻辑 return 0; }
如果是开启USE_OPENMP=1编译的版本,也可以直接调用OpenMP提供的接口设置线程数:
#include <omp.h> int main() { omp_set_num_threads(16); // 后续业务逻辑 return 0; }
方案3:CMake配置运行环境(适配IDE一键运行、CTest自动化测试场景)
如果需要在IDE点击运行、CTest执行用例时自动加载线程配置,不要用之前错误的set(ENV{...})写法,使用以下配置,注意将your_target替换为你自己项目中add_executable定义的目标名:
# 适配CTest测试场景 set_tests_properties(your_target PROPERTIES ENVIRONMENT "OPENBLAS_NUM_THREADS=16") # 适配IDE可视化运行场景 set_target_properties(your_target PROPERTIES VS_DEBUGGER_ENVIRONMENT "OPENBLAS_NUM_THREADS=16" # Visual Studio 环境 XCODE_SCHEME_ENVIRONMENT "OPENBLAS_NUM_THREADS=16" # Xcode 环境 )
如果是开启USE_OPENMP=1的编译版本,将上述配置中的OPENBLAS_NUM_THREADS替换为OMP_NUM_THREADS即可。
内容的提问来源于stack exchange,提问作者noobquestionsonly
相关产品推荐
相关产品推荐

