我正在运行一个使用Python和NumPy实现的算法。该算法中计算量最大的部分涉及解决一组线性系统(即调用numpy.linalg.solve()
)。我设计了这个小型基准测试:
import numpy as np
import time
# Create two large random matrices
a = np.random.randn(5000, 5000)
b = np.random.randn(5000, 5000)
t1 = time.time()
# That's the expensive call:
np.linalg.solve(a, b)
print time.time() - t1
我已经在以下平台上运行过:
- 我的笔记本电脑,一台2013年底的MacBook Pro 15寸,拥有4个2GHz的内核(
sysctl -n machdep.cpu.brand_string
输出为Intel(R) Core(TM) i7-4750HQ CPU @ 2.00GHz) - 一个Amazon EC2
c3.xlarge
实例,有4个虚拟CPU。亚马逊将它们推广为“高频率Intel Xeon E5-2680 v2 (Ivy Bridge)处理器”
总结:
- 在Mac上运行需要大约4.5秒
- 在EC2实例上运行需要大约19.5秒
我还尝试在其他基于OpenBLAS / Intel MKL的设置上运行它,运行时间总是与我在EC2实例上获得的运行时间相当(除了硬件配置)。
有人能解释为什么Mac上的表现(使用Accelerate Framework)比其他环境要好4倍以上吗?下面提供了有关每个NumPy / BLAS设置的详细信息。
笔记本电脑设置
numpy.show_config()
输出:
atlas_threads_info:
NOT AVAILABLE
blas_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3', '-I/System/Library/Frameworks/vecLib.framework/Headers']
define_macros = [('NO_ATLAS_INFO', 3)]
atlas_blas_threads_info:
NOT AVAILABLE
openblas_info:
NOT AVAILABLE
lapack_opt_info:
extra_link_args = ['-Wl,-framework', '-Wl,Accelerate']
extra_compile_args = ['-msse3']
define_macros = [('NO_ATLAS_INFO', 3)]
atlas_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
atlas_blas_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE
EC2实例设置:
在Ubuntu 14.04上,我使用以下命令安装了OpenBLAS:
sudo apt-get install libopenblas-base libopenblas-dev
安装NumPy时,我创建了一个名为site.cfg
的文件,并将以下内容添加到其中:[default]
library_dirs= /usr/lib/openblas-base
[atlas]
atlas_libs = openblas
numpy.show_config()
给出:
atlas_threads_info:
libraries = ['lapack', 'openblas']
library_dirs = ['/usr/lib']
define_macros = [('ATLAS_INFO', '"\\"None\\""')]
language = f77
include_dirs = ['/usr/include/atlas']
blas_opt_info:
libraries = ['openblas']
library_dirs = ['/usr/lib']
language = f77
openblas_info:
libraries = ['openblas']
library_dirs = ['/usr/lib']
language = f77
lapack_opt_info:
libraries = ['lapack', 'openblas']
library_dirs = ['/usr/lib']
define_macros = [('ATLAS_INFO', '"\\"None\\""')]
language = f77
include_dirs = ['/usr/include/atlas']
openblas_lapack_info:
NOT AVAILABLE
lapack_mkl_info:
NOT AVAILABLE
blas_mkl_info:
NOT AVAILABLE
mkl_info:
NOT AVAILABLE