【发布时间】:2021-10-17 04:28:32
【问题描述】:
我正在 Win 10、Intel I7(3.4 GHz、16 MB RAM)、Nvidia GTX 760(计算级别 = 3.0)、最新安装的 numpy、numba、cuda 和相关工具上学习 GPU/Python。我有三个相关的问题。
下面给出的示例在 GPU 上的运行速度比在 CPU 上慢!我想知道为什么会这样。
import numpy as np
from numba import jit
@jit
def Add_GPU(a, b):
return a + b
def Add_CPU(a, b):
return a + b
def f3():
# Initialize arrays
N = 10000000
A = np.ones(N, dtype=np.float32)
B = np.ones(A.shape, dtype=A.dtype)
C = np.empty_like(A, dtype=A.dtype)
# Add arrays.
start = timer()
C = Add_GPU(A, B)
print("Time Add_GPU:", timer()-start)
start = timer()
C = Add_CPU(A, B)
print("Time Add_CPU:", timer()-start)
f3()
结果是:
WI - Python> test_GPU
Time Add_GPU: 0.3832171000000001
Time Add_CPU: 0.013704299999999892
在上面的代码中,如果我将@jit 替换为@vectorize(['float32(float32, float32)'], target='cuda'),编译器会说需要compute-level=3.5。请让我知道那里发生了什么。
是否有此类要求的表格?例如,PyTorch 或 TensorFlow 需要什么计算级别?
【问题讨论】:
-
您的(8 岁)GPU 太旧,无法支持任何当前版本的 CUDA 或任何可以使用最新版本 CUDA GPU 和工具包进行加速的 Python 框架。而且您的第一个代码 sn-p 根本不在 GPU 上运行,它是为您的 CPU 编译的。而且它更慢,因为您测量的时间包括编译它的时间。运行两次,测量第二次调用的执行时间
-
定时函数可能很有用,但前提是正确执行 - 查看标准库
timeit以获得易于使用和准确的实用函数。 -
在 Windows 上,时间粒度功能非常糟糕。在我的机器上,这会在忽略编译时间后给出这样的排序结果:0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0065, 0.0156, 0.0156, 0.0156, 0.0156, 0.0156, 0.0156, 0.0156, 6,015 6,0156, 5,01. 0.0156,0.0156。可以看到时序阈值使基准测试完全有缺陷(独立于调用
Add_CPU或Add_GPU(不使用GPU)。除此之外,使用GPU实现必然会因为PCI+内存传输而变慢,而CPU 实现只支付内存传输。 -
我也忘了提到“Intel i7”处理器,因为它是a brand。架构实际上更重要。事实上,i7 Bloomfield(13 岁)处理器肯定会比 i7 Rocket Lake(今年发布)慢得多,甚至可能比 i5 Rocket Lake 还要慢。确切的型号也很重要,因为所有 i7 Rocket Lake 处理器都不是严格等效的。这有点像说您使用 Nvidia GTX(或者说 GT)而不提及 760。
-
所有三个 cmets 都很有用且内容丰富。我学到了一些关于我的 GTX 卡、CUDA 和 Python 计时器的知识。谢谢大家。