关于让numpy
使用多核(在英特尔硬件上)进行内部和外部向量乘积、向量矩阵乘法等的最新情况如何?
如有必要,我很乐意重建numpy
,但在这一点上,我正在寻找在不更改代码的情况下加快速度的方法。
作为参考,我的show_config()
如下,我从未观察到使用多个内核numpy
:
atlas_threads_info:
libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/local/atlas-3.9.16/lib']
language = f77
include_dirs = ['/usr/local/atlas-3.9.16/include']
blas_opt_info:
libraries = ['ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/local/atlas-3.9.16/lib']
define_macros = [('ATLAS_INFO', '"\"3.9.16\""')]
language = c
include_dirs = ['/usr/local/atlas-3.9.16/include']
atlas_blas_threads_info:
libraries = ['ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/local/atlas-3.9.16/lib']
language = c
include_dirs = ['/usr/local/atlas-3.9.16/include']
lapack_opt_info:
libraries = ['lapack', 'ptf77blas', 'ptcblas', 'atlas']
library_dirs = ['/usr/local/atlas-3.9.16/lib']
define_macros = [('ATLAS_INFO', '"\"3.9.16\""')]
language = f77
include_dirs = ['/usr/local/atlas-3.9.16/include']
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE
您可能应该首先检查 numpy 使用的 Atlas 构建是否是使用多线程构建的。您可以构建并运行以下命令来检查 Atlas 配置(直接来自 Atlas FAQ):
main()
/*
* Compile, link and run with something like:
* gcc -o xprint_buildinfo -L[ATLAS lib dir] -latlas ; ./xprint_buildinfo
* if link fails, you are using ATLAS version older than 3.3.6.
*/
{
void ATL_buildinfo(void);
ATL_buildinfo();
exit(0);
}
如果你没有多线程版本的Atlas:"有你的问题"。如果是多线程的,那么你需要使用一个适当的大矩阵-矩阵乘积来练习一个多线程的 BLAS3 例程(可能是 dgemm),并查看是否使用了线程。我认为我说得对,Atlas 中的 BLAS 2 和 BLAS 1 例程都不支持多线程(这是有充分理由的,因为除了真正巨大的问题大小之外,没有性能优势)。