【问题标题】:What numpy workload would the yield the highest speed up? MMM? QR? SVD?什么 numpy 工作量会产生最高的速度?嗯?二维码? SVD?
【发布时间】:2021-07-22 11:33:46
【问题描述】:

安装 MKL、OPENBLAS 后,什么样的 numpy 工作负载会产生最高的速度?嗯?二维码? SVD?我已经尝试过使用 MMM,但我没有看到加速,相反它变得更糟。我的测试代码如下:

import numpy as np
import time
import gc

sizes = [2000, 20000]
samples = np.zeros(5)
for n in sizes:
   # allocate outside the benchmark
   X = np.random.normal(size=(n, n))
   Y = X
   
   for i in range(2):
       Z = X @ Y

   # run 5 times
   for r in range(5):
      start_time = time.process_time()
      Z = X @ Y
      samples[r] = time.process_time() - start_time

   X = Y = Z = None
   # remove unnecessary memory consumption 
   gc.collect()

   print(np.mean(samples))
   print(np.std(samples))

当我重新运行此程序时,可用线程数增加(此框中的最大内核数为 8),我看到响应时间增加而不是减少。

没有抓住任何机会,所以我每次都更改所有这些环境变量(这里是 1,但我改为 2、4、8):

export MKL_NUM_THREADS=1
export OMP_NUM_THREADS=1
export OPENBLAS_NUM_THREADS=1
export NUMEXPR_MAX_THREADS=1
export VECLIB_MAXIMUM_THREADS=1

【问题讨论】:

    标签: python numpy lapack intel-mkl


    【解决方案1】:

    您看到响应时间增加而不是减少,因为测量时间的方法可能不正确。您可能想要的是挂钟时间,而不是累积的并行时间。实际上,time.process_time() 返回“内核和用户空间 CPU 时间的总和”。您可以改用 time.time() 来解决此问题。

    请注意,由于使用多个线程的开销,并行时间会增加:N 个线程的工作速度不是 N 倍,而是比 N 倍少一点(请参阅Amdahl's law)。


    一般信息:

    默认情况下,Numpy 选择机器上可用的实现。在大多数 Linux 发行版上,这通常已经是使用的 OpenBLAS。所以显式使用 OpenBLAS 不会改变结果。

    线性代数库的运算性能会根据用例和输入类型发生变化:具有双精度复数的 MMM 的行为可能与具有简单精度实数的 MMM 不同。某些库针对某些特定情况和特定输入类型进行了更好的优化。更不用说非常重要的目标平台的影响了。 BLIS benchmark page 清楚地表明了这一点。我将重点介绍在 x86-64 Intel 平台上运行的双精度实数的通用原语。

    MMM 非常受计算限制,并且可以很好地扩展。它在大多数体面的 BLAS 实现上进行了非常优化。当 BLAS 实现不优化它时,通常意味着它不优化所有其他原语。 OpenBLAS 和 MKL 在主流 x86-64 平台上经常接近这个原语(MKL 经常比它好一点)。

    QR 主要受内存限制,更难优化。 AFAIK,OpenBLAS 中提供的那个几乎没有优化。它基于 LAPACK 的 Netlib 实现,也不是很优化。 MKL中的那个应该会好很多。这些结果可能会在不久的将来发生变化。但是,内存吞吐量可能会限制两种实现的性能,从而导致目标硬件的性能相似。

    与其他两个操作相比,SVD 是最难优化的操作。这也是最贵的。 SVD 是一种 LAPACK 操作,因此情况类似于 QR 操作。因此,我希望 MKL 在此操作上明显优于 OpenBLAS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 2021-02-16
      相关资源
      最近更新 更多