Linux 提供了出色的并行化工具,例如 pthreads 和 openmp。它们使并行计算变得相对容易。尽管我不是汇编级别的优化专家,但在大型数组上并行实现元素操作似乎相当简单。Idem 用于矩阵乘法、求解线性系统等。
apt-get
但是,如果我从( )安装 numpy sudo apt-get install python3 python3-dev python3-numpy ipython3
,则元素操作仅在一个核心上执行。这是不幸的,因为由于 GIL,python 不提供并行化。在 BLAS 的较低级别进行并行化将使我能够利用所有内核并获得显着的加速(对于具有 8 个线程的 i7 为 6-8),因此在仍然使用舒适的语言(python)工作的同时减少等待和更多的实验。
这个
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个核心。