Linux提供了很棒的并行化工具,如pthreads和openmp。它们使得平行计算变得相对容易。尽管我不是在汇编级别进行优化的专家,但并行处理大型数组上的元素操作似乎相当微不足道。算法用于矩阵乘法,求解线性系统等。
但是,如果我从apt-get
(sudo apt-get install python3 python3-dev python3-numpy ipython3
)安装numpy,则元素操作仅在一个核心上执行。这很不幸,因为由于GIL,python不提供并行化。在BLAS的较低级别进行并行化将允许我利用所有核心并获得显着的加速(对于我的i7有8个线程为6-8),更少等待和更多的实验,同时仍然使用舒适的语言(python)。 / p>
此
y = (lambda x: x ** x) ( numpy.arange(1e8) )
简单的元素x ** x
可以并行运行,但它只运行在我的默认ubuntu apt-get numpy安装的一个核心上。
theano同样如此。我认为theano也使用BLAS,因为它的一个依赖是numpy(反过来使用BLAS)。每当我训练keras或theano神经网络时,只使用一个核心。
据我所知,BLAS只是一个界面描述,而不是实际的实现。然而,在ubuntu中有一个libblas3
和libatlas3-base
包,它们似乎有所不同。
此外:从源代码编译图集并不是一个很大的成功:配置脚本一直抱怨我的CPU固有的限制,这似乎总是比最大频率低100MHz,并且最大也有2.4GHz。半分钟左右升频到3.4GHz的可能性 - 我认为这称为热量限制。
关于矩阵的numpy操作的多核使用,我有哪些选择?他们是开箱即用的吗?如果没有,为什么不呢?为什么如此难以为平行的numpy提供线性代数引擎?有了4个或8个cpu线程,我希望汇编级单线程优化不会超过它。
修改
我也尝试了以下命令:
OMP_NUM_THREADS=8 LD_PRELOAD=/usr/lib/atlas-base/libatlas.so python3 -c 'import numpy; x=numpy.arange(1e8); y=x**x'
OMP_NUM_THREADS=8 LD_PRELOAD=/usr/lib/libopenblas.so python3 -c 'import numpy; x=numpy.arange(1e8); y=x**x'
其中也只使用1个核心。