为什么设置 "export OPENBLAS_NUM_THREADS=1" 会影响性能?

Why would setting "export OPENBLAS_NUM_THREADS=1" impair the performance?

我尝试按照 this document 的建议设置 "export OPENBLAS_NUM_THREADS=1"。但是我发现了一个奇怪的现象,即设置此设置会显着损害我的 RL 算法的性能(我已经对 TD3 和 SAC 进行了一些测试,所有结果一致表明 "export OPENBLAS_NUM_THREADS=1" 会损害性能)。为什么会造成这么大的问题?

顺便说一句,算法是使用 Tensorflow1.13 实现的,数据通过 OpenAI 的 Gym tf.data.Dataset. all tests are done on BipedalWalker-v2 环境输入神经网络。

链接指南建议在使用 ray 时专门设置此变量,并非总是如此。

AFAICS,那是因为该框架本身产生了很多进程(一个用于每个演员或其他东西),因此使用多个线程的每个进程都不会带来加速。当只有一个或只有几个进程时,情况并非如此。


一般来说,OpenBLAS FAQ says that OpenBLAS' multithreading might "conflict" with the main program's multithreading and recommends setting OPENBLAS_NUM_THREADS=1 in such a case. The FAQ entry however fails to provide any details to verify its claim, so it can very well be obsolete! As per https://github.com/obspy/obspy/wiki/Notes-on-Parallel-Processing-with-Python-and-ObsPy,这种 "conflict" 的症状是猖獗的死锁和段错误。因此,如果您什么都没有,那您​​就没事了。主要 Python 库非常负责自己处理此类问题,而不是将它们转给用户,所以我很确定如果 OpenBLAS 有任何使用限制,numpyscipy 强制执行如果您通过它们使用 OpenBLAS,它们将在内部自动运行。