多核硬件上的numpy
关于如何让 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
1 个回答
7
你可以先检查一下你正在使用的numpy所依赖的Atlas版本是否支持多线程。你可以运行下面的代码来查看Atlas的配置(这个信息直接来自Atlas的常见问题解答):
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例程是不支持多线程的(这也是有原因的,因为在真正巨大的问题规模下,才会有性能上的优势)。