首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Numpy中的矩阵求逆速度

Numpy中的矩阵求逆速度
EN

Stack Overflow用户
提问于 2022-07-27 20:35:15
回答 1查看 106关注 0票数 1

我一直在阅读“与Scikit- Learning和TensorFlow一起动手机器学习”一书。在第4章(第110页)中,它说:反演这样一个矩阵的计算复杂度通常是关于O(n^2.4)到O(n^3) (取决于实现)。换句话说,如果将功能的数量增加一倍,计算时间就会乘以大约2^2.4 = 5.3到2^3 = 8。

我在Python中测试了上面的内容:

代码语言:javascript
复制
import numpy as np
import timeit
nsize = 100
A = np.random.rand(nsize, nsize)
x = np.random.rand(nsize, 1)
b = A.dot(x)
# np.linalg.inv(A) or np.linalg.inv(A).dot(b) - not a big difference in time
timeit.timeit('np.linalg.inv(A)','import numpy as np\nfrom __main__ import A, b', number=10000)

nsize=100的时间为2.5秒,nsize=200为8.5秒。计算成本似乎增加了3.4倍(8.5/2.5),远远低于作者提到的范围。有人能解释一下是什么原因造成了这种“加速”吗?

P.S:我用5000和10000的nsize测试了代码。计算时间分别为3.2秒和25秒,这意味着与原来问题中较小的nsize相比,时间增加了7.8倍。这是缓存效应造成的吗?

EN

回答 1

Stack Overflow用户

发布于 2022-07-28 00:41:54

Numpy使用LAPACK的LU分解(正如@Murali在注释中指出的那样)。LU分解通常是由OpenBLAS在大多数平台上完成的(或者是运行类似的Intel )。OpenBLAS使用dgemm调用(矩阵乘法),从而使LU分解更快。dgemm是大矩阵最优化的BLAS原语之一。它利用多个线程和SIMD指令,所以非常快。尽管如此,在小型矩阵上,使用多线程会引入一个重要的开销(创建线程、分配工作和等待结果需要时间)。对于较大的矩阵,这种开销往往是可以忽略不计的。对于具有更小矩阵的SIMD指令也是如此: SIMD指令对于计算相对较大的数组来说是快速的,但与标量指令相比,它们具有较高的延迟时间(对于小型矩阵可以更好地流水线化)。循环展开也会产生同样的效果(对于非常小的矩阵)以及CPU缓存。在此基础上,Numpy完成了一些类型检查和内部工作(在其他情况下优化内部循环),这只需几微秒。所有这些因素的结合导致代码对于小矩阵的效率很低,对于较大的矩阵则更快。这种开销在测量的速度上产生了偏差.

在我的机器上,对于时间为100的矩阵,dgemm调用占19%,dtrsm调用占11%,dlaswp调用占7% (其他调用占用可忽略的时间,其余调用在等待或内核中丢失)。对于大小为200的矩阵,dgemm调用占29%,dtrsm占12%,dlaswp占7%。对于大小为1000的矩阵,dgemm调用占57%,dtrsm调用占5%,dlaswp占6%。正如我们所看到的,大部分时间都浪费在大小为100的矩阵上,而大部分时间则被BLAS操作用于1000大小的矩阵。

注意,LU分解很难并行化。这是一个活跃的研究领域(持续数十年)。此外,不幸的是,最好的并行化方法(通常是基于任务的方法)还没有在像OpenBLAS这样的库中使用。AFAIK,MKL使用他们一点。最先进的实现速度更快,特别是对于小矩阵,因为dgemm对大型矩阵进行了适当的优化。

可以在OpenBLAS中使用OMP_NUM_THREADS=1禁用多线程。这样,我得到了151个大小为100的矩阵和800个大小为200的矩阵。我们应该考虑Numpy开销的~4和其他非常量的开销,如页面错误、分配、SIMD指令的延迟、缓存效果、分支预测等,也就是说,因子达到5.44 (没有Numpy开销)。对于200比400,是5.67。对于400比800,它甚至是6.8。除其他开销外,该因子仍不接近8的主要原因是,OpenBLAS没有被优化以运行具有1个线程的LU因式分解:在这种情况下,内部参数的设置是次优化的,而算法不是最优的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73144333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档