numpy 为什么linalg.solve不使用所有可用的线程

您所在的位置:网站首页 numpy无穷 numpy 为什么linalg.solve不使用所有可用的线程

numpy 为什么linalg.solve不使用所有可用的线程

2023-04-14 19:54| 来源: 网络整理| 查看: 265

你使用4D/5D矩阵,在最后一个维度中有相当少量的项目。问题是Numpy的当前实现在这种情况下效率很低。实际上,linalg.solve在内部调用solve(以及与用例类似的solve1),它将ND数组线性化,以便在顺序循环中多次调用dgesv。您使用OpenBLAS实现,它能够使用多个线程并行计算dgesv。然而,dgesv是一个LAPACK原语,而不是真正的BLAS原语。OpenBLAS主要是一个BLAS实现,尽管它实现了一些LAPACK原语。它并不意味着非常有效地计算LAPACK原语。事实上,只有少数库可以这样做(这实际上很难做到)。尽管如此,这里问题是Numpy进行了大量LAPACK调用,每个dgesv调用只持续很短的时间。因此OpenBLAS不能完全受益于多核处理器,因为它需要大量的时间(即至少几微秒)来与其他核心共享工作,等待它们来完成工作,实际上核心数量越多并行开销越高毕竟如果你想组织一个有100个朋友的聚会一般来说,组织聚会比和一个朋友一起做要花更多的时间,如果聚会持续10分钟,组织聚会的时间就会比聚会的时间大得多。使用n = 40和N = 30,以下是我的i5- 9600 KF内核上OpenBLAS线程的调度(只有一部分持续0.5 ms,所以我们可以看到发生了什么):

每个彩色切片代表OpenBLAS线程的执行。黑色切片是空闲时间。大部分时间是空闲的,位于核心1上的主线程比其他线程做更多的工作,因为计算工作没有很好地平衡。如果你想让这个计算在你的用例中更快,这是最好只使用1个OpenBLAS线程和在多个线程上运行不同的dgesv调用,而不是像OpenBLAS默认那样尝试并行化dgesv。虽然Numpy理论上可以做到这一点,Numpy还不打算使用多线程。唯一的并行函数主要是BLAS/LAPACK库之一,而不是直接使用Numpy。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3