gpt4 book ai didi

python - 在简单的numpy操作中,CUDA GPU的速度比CPU慢

转载 作者:行者123 更新时间:2023-12-03 13:48:24 25 4
gpt4 key购买 nike

我正在使用基于this article的代码来查看GPU加速,但是我所看到的只是速度下降:

import numpy as np
from timeit import default_timer as timer
from numba import vectorize
import sys

if len(sys.argv) != 3:
exit("Usage: " + sys.argv[0] + " [cuda|cpu] N(100000-11500000)")


@vectorize(["float32(float32, float32)"], target=sys.argv[1])
def VectorAdd(a, b):
return a + b

def main():
N = int(sys.argv[2])
A = np.ones(N, dtype=np.float32)
B = np.ones(N, dtype=np.float32)

start = timer()
C = VectorAdd(A, B)
elapsed_time = timer() - start
#print("C[:5] = " + str(C[:5]))
#print("C[-5:] = " + str(C[-5:]))
print("Time: {}".format(elapsed_time))

main()

结果:
$ python speed.py cpu 100000
Time: 0.0001056949986377731
$ python speed.py cuda 100000
Time: 0.11871792199963238

$ python speed.py cpu 11500000
Time: 0.013704434997634962
$ python speed.py cuda 11500000
Time: 0.47120747699955245

我无法发送更大的向量,因为这将生成 numba.cuda.cudadrv.driver.CudaAPIError: Call to cuLaunchKernel results in CUDA_ERROR_INVALID_VALUE异常。
nvidia-smi的输出是
Fri Dec  8 10:36:19 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.98 Driver Version: 384.98 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Quadro 2000D Off | 00000000:01:00.0 On | N/A |
| 30% 36C P12 N/A / N/A | 184MiB / 959MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 933 G /usr/lib/xorg/Xorg 94MiB |
| 0 985 G /usr/bin/gnome-shell 86MiB |
+-----------------------------------------------------------------------------+

CPU的细节
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 58
Model name: Intel(R) Core(TM) i5-3550 CPU @ 3.30GHz
Stepping: 9
CPU MHz: 3300.135
CPU max MHz: 3700.0000
CPU min MHz: 1600.0000
BogoMIPS: 6600.27
Virtualization: VT-x
L1d cache: 32K
L1i cache: 32K
L2 cache: 256K
L3 cache: 6144K
NUMA node0 CPU(s): 0-3
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc cpuid aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm cpuid_fault epb tpr_shadow vnmi flexpriority ept vpid fsgsbase smep erms xsaveopt dtherm ida arat pln pts

GPU是具有192个CUDA内核和1Gb RAM的Nvidia Quadro 2000D。

更复杂的操作:
import numpy as np
from timeit import default_timer as timer
from numba import vectorize
import sys

if len(sys.argv) != 3:
exit("Usage: " + sys.argv[0] + " [cuda|cpu] N()")


@vectorize(["float32(float32, float32)"], target=sys.argv[1])
def VectorAdd(a, b):
return a * b

def main():
N = int(sys.argv[2])
A = np.zeros((N, N), dtype='f')
B = np.zeros((N, N), dtype='f')
A[:] = np.random.randn(*A.shape)
B[:] = np.random.randn(*B.shape)

start = timer()
C = VectorAdd(A, B)
elapsed_time = timer() - start
print("Time: {}".format(elapsed_time))

main()

结果:
$ python complex.py cpu 3000
Time: 0.010573603001830634
$ python complex.py cuda 3000
Time: 0.3956961739968392
$ python complex.py cpu 30
Time: 9.693001629784703e-06
$ python complex.py cuda 30
Time: 0.10848476299725007

知道为什么吗?

最佳答案

可能是您的阵列太小,操作太简单,无法抵消与GPU相关的数据传输成本。另一种看待它的方式是您的计时不公平,因为对于GPU而言,它还计时内存传输时间,而不仅仅是处理时间。

尝试一些更具挑战性的示例,也许首先是元素明智的大矩阵乘法,然后是矩阵乘法。

最后,GPU的功能是对同一数据执行许多操作,因此最终只需支付一次数据传输成本。

关于python - 在简单的numpy操作中,CUDA GPU的速度比CPU慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47710707/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com