我从事物理学工作,作为我工作的一部分,我必须做大量的数值计算(“numerics”),其中90%以上涉及到大型矩阵的对角化。特别是numpy.linalg.eigh,或者scipy. spars.linalg.eigsh,如果矩阵是稀疏的,我不需要所有的特征值/特征向量。我使用PyCharm和Anaconda,从来没有考虑过这些例程是如何实现的,以及它们是否有效。
然而,我刚买了一台新的MacBook,里面有M1 Pro芯片,我想这是一个很好的时机来确保我正在做的事情是真正优化的!不幸的是,我对这些计算的“幕后”所发生的事情知之甚少。
**因此,我的问题是:**我如何安装Python和NumPy/SciPy,确保我需要的矩阵例程得到优化,以充分利用我的计算机?具体来说,它们在Apple芯片上本地运行,并尽可能并行?
矩阵对角化效率的一个小提升将对我的工作产生巨大的累积影响!
1条答案
按热度按时间vof42yt11#
M1处理器是一个big-small处理器,大多数BLAS实现对这种体系结构的支持都很差,对于LAPACK实现更是如此,事实上,很难有效地支持大小处理器(这使得BLAS/LAPACK代码在它们已经太复杂的情况下甚至更加复杂),并且没有主流HPC处理器使用这样的架构。因此,某些方法的执行时间可能会不稳定,有时执行时间可能会非常糟糕。也就是说,M1内存具有非常高的吞吐量,可以使一些LAPACK方法更快。
至于性能,您可以通过计算1024 x1024矩阵上的BLAS gemm来检查FLOP效率,获得执行时间T最后检查效率
E = ((2*1024**3)/T)/K
。如果E〉0.75,则您的BLAS实现相当好。如果E在0.5-0.75范围内,则它不是很大。如果E〈0。25出现问题,您应该尝试另一个BLAS实现请注意,当前领先的BLAS/LAPACK实现是由英特尔实现的MKL,而M1/ARM处理器不支持AFAIK Numpy的默认BLAS后端通常是OpenBLAS,它没有针对M1的特定实现,导致执行效果非常差。Accelerate/vecLib(AFAIK由Apple制造/支持)在M1处理器上的性能明显优于OpenBLAS,因此使用它当然是一个很好的选择(AFAIK仅适用于M1)。
OpenBLAS有一个related open issue,以便检查实际使用的BLAS实现的性能。
简言之,测试Accelerate/vecLib并检查其结果是否与OpenBLAS期刊中提供的基准测试结果相似。您还可以测试其他BLAS实现,如BLIS,这些实现在各种架构上都能提供良好的性能。对于LAPACK,它有点复杂,因为只有很少的实现可以实际运行在M1上(在大多数系统上,默认情况下通常使用效率低下的NetLib实现)。