【发布时间】:2019-08-05 02:47:30
【问题描述】:
所以基本上我试图在我的 C++ 代码中设置一个环境变量来强制线程数为 1。我正在使用多个机器学习库,默认情况下使用 OpenMP 并且可以强制在单线程中运行通过设置以下环境变量模式:OMP_NUM_THREADS=1
这是我的问题。我想在我正在构建的库中设置这个环境变量。
当我从我的主函数设置环境变量(针对我正在构建的库的可执行链接)时,它会按预期工作(在程序执行期间仅使用 1 个线程):
auto implPtr = FRVT_11::Interface::getImplementation();
implPtr->initialize(CONFIG_DIR);
char ompEnv[]="OMP_NUM_THREADS=1";
putenv( ompEnv );
// More code
但是,如果我尝试从我正在构建的库中设置环境变量(例如从 getImplementation 函数中),那么使用的线程数是 4 而不是 1:
// This does not work
std::shared_ptr<FRVT_11::Interface> FRVT_11::Interface::getImplementation() {
char ompEnv[]="OMP_NUM_THREADS=1";
putenv( ompEnv );
return std::make_shared<MyImplementation>();
}
任何想法为什么会这样?我正在构建和运送库,所以我需要从库中设置线程数。
【问题讨论】:
-
我觉得这里的关键词是“环境”。程序运行时通过设置变量影响的环境是……什么?
-
对不起,我觉得我不太明白。他们不应该都指的是同一个环境吗?对不起,我有点初学者。
-
你的程序对自身环境影响不大,但可以完全控制子进程等
-
请仔细查看副本。即使您成功地一致更改了环境变量 - 在运行时更改 OpenMP 线程数仍然不是正确的方法。
标签: c++ multithreading environment-variables openmp