【问题标题】:Anaconda Accelerate dot product is 2x slower than plain NumPyAnaconda Accelerate 点积比普通 NumPy 慢 2 倍
【发布时间】:2017-10-28 11:53:15
【问题描述】:

为什么 Anaconda Accelerate 在 Python 3 上计算点积的速度比普通的 NumPy 慢?我正在使用安装了 acceleration_cudalib 2.0 的加速版本 2.3.1,Python 3.5.2 Windows 10 64 位。

import numpy as np
from accelerate.cuda.blas import dot as gpu_dot
import time

def numpydot():
    start= time.time()
    for i in range(100):
        np.dot(np.arange(1000000, dtype=np.float64), np.arange(1000000, dtype=np.float64))
    elapsedtime = time.time()-start
    return elapsedtime

def acceleratedot():
    start= time.time()
    for i in range(100):
        gpu_dot(np.arange(1000000, dtype=np.float64), np.arange(1000000, dtype=np.float64))
    elapsedtime = time.time()-start
    return elapsedtime


numpydot()
0.6446375846862793
acceleratedot()
1.33168363571167

【问题讨论】:

  • Anaconda Accelerate 是否声称它比 BLAS 点积(NumPy 中使用的那个)更好?
  • Anaconda Accelerate 据说使用的是 cuBLAS,它使用 GPU。 NumPy 只使用 CPU(NumPy 的开发者维护 Accelerate)
  • 1) 使用 timeittime 不够准确,无法获得合理的计时。 2) 在循环之外创建数组,否则您将在计时中包含数组创建时间 3) 尝试使用 2D 或 ND 数组,矢量点积可能不是 GPU 处理的最佳选择。 4) 你确定“NumPy 的开发者维护 Accelerate”吗? 5) GPU 通常在float32 下表现最好,这可能不适用于所有 GPU,但您可以尝试一下。
  • 标量 (dot) 产品是一个内存绑定问题,并且您正在多次将数据从主机传输到设备,因此这些结果是完全合理的。此外,除非你有一个最近的 Tesla GPU,否则float64 将在大多数 GPU 上提供 float32 的 1/3-1/8 性能。
  • @JosephValles 1) timeit 执行多次重复并禁用垃圾收集。这样您就可以获得准确 计时(测量函数执行时间而不是垃圾收集或后台进程的计时),尤其是在代码需要预热的情况下。 time 只是测量执行时间的错误工具。 2) 确切地说,如果你包含一些那么慢 的东西,分析性能会很复杂 3) 好的,不知道 5) 没有数组创建和timeit?否则,它只是在 dot 性能上进行卷积以制作 cmets。

标签: python numpy gpu anaconda accelerate


【解决方案1】:

我发现共享数组是使用 Numba 创建的,它是一个单独的库。他们的网站上有文档。

【讨论】:

    猜你喜欢
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 2016-02-13
    • 1970-01-01
    • 2014-05-29
    • 2014-03-13
    • 2020-07-13
    • 2018-01-16
    相关资源
    最近更新 更多