苹果芯片上高效/并行矩阵例程



我从事物理学工作,作为我工作的一部分,我必须做很多数值计算("numerics"),其中90%以上涉及大型矩阵的对角化。目前,我在Python中使用NumPy/SciPy;特别是numpy.linalg。如果矩阵是稀疏的我不需要所有的特征值/特征向量。我使用PyCharm和Anaconda,从来没有想过这些例程是如何实现的,以及它们是否有效。

然而,我刚买了一台带有M1 Pro芯片的新MacBook,我想这将是一个好时机,以确保我正在做的事情实际上是优化的!不幸的是,我对"幕后"发生的事情知之甚少。

因此,我的问题:我如何安装Python和NumPy/SciPy,以确保我需要的矩阵例程被优化以充分利用我的计算机?具体来说,它们是在苹果芯片上运行的,并且尽可能地并行?

对对角化矩阵的效率的小幅提高将对我的工作产生巨大的累积影响!

M1处理器是一个大大小小的处理器,大多数BLAS实现对这种架构的支持还很差。对于LAPACK实现来说更是如此。事实上,很难有效地支持大小处理器(它使BLAS/LAPACK代码更加复杂,而它们已经太复杂了),并且没有主流HPC处理器使用这种架构。正因为如此,某些方法的执行时间可能会不稳定有时执行时间会很糟糕。也就是说,M1内存具有相当高的吞吐量,可以使一些LAPACK方法更快。

对于性能,您可以通过在1024x1024矩阵上计算BLAS gem来检查FLOP效率,得到执行时间T和处理器K可以存档的FLOPS,最后检查效率E = ((2*1024**3)/T)/K。如果E =>0.75。那么你的BLAS实现是相当不错的。对于0.5-0.75范围内的E,它不是很大。对于E <有一个问题,你应该尝试另一个BLAS实现>

请注意,目前领先的BLAS/LAPACK实现是MKL,它由Intel和AFAIK实现,M1/ARM处理器不支持(AFAIK也没有计划支持它)。Numpy的默认BLAS后端通常是OpenBLAS,它没有针对M1的特定实现,因此执行起来相当糟糕。加速/vecLib(苹果制造/支持的AFAIK)在M1处理器上明显优于OpenBLAS,因此使用它当然是一个不错的选择(AFAIK仅适用于M1)。

OpenBLAS有一个相关的开放问题,所以要检查实际使用的BLAS实现的性能。

简而言之,测试Accelerate/vecLib并检查结果是否与OpenBLAS问题中提供的基准测试相似。您还可以测试其他BLAS实现,例如BLIS,它们在各种体系结构上提供良好的性能。对于LAPACK来说,它有点复杂,因为只有很少的实现可以在M1上实际运行(大多数系统默认使用的是效率低下的NetLib实现)。

最新更新