多核硬件上的numpy

17 投票
1 回答
6133 浏览
提问于 2025-04-16 17:34

关于如何让 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例程是不支持多线程的(这也是有原因的,因为在真正巨大的问题规模下,才会有性能上的优势)。

撰写回答