GNU Octave是否支持多线程?使用nnet时多核占用解惑
GNU Octave用nnet包时多核占用的问题解析
问题背景
之前的Stack Overflow问答提到GNU Octave是单线程应用,但在Linux Mint 20、4核CPU、Octave 5.2.0 GUI环境下,仅仅加载nnet神经网络包,htop就显示CPU全核被占用。明明nnet本身没有并行实现,这到底是怎么回事?
原因说明
Octave的主程序逻辑确实是单线程,但它依赖的BLAS线性代数库默认开启了多线程并行。nnet包的底层运算会调用BLAS的接口,这些线性代数操作会自动利用所有CPU核心,所以才会出现全核占用的情况。
另外,多线程BLAS在某些计算场景下,线程调度的开销会抵消并行带来的收益,甚至拖慢运行速度——这就是为什么设置单线程后脚本速度反而翻倍的原因。
解决办法
通过设置环境变量限制BLAS的线程数即可:
export OMP_NUM_THREADS=1
设置后,BLAS只会使用1个线程,Octave运行时就只会占用1核,同时避免了多线程调度的额外开销,提升了运行效率。
内容的提问来源于stack exchange,提问作者umbe1987
相关产品推荐
相关产品推荐

