CPU: i7-9750 @2.6GHz (配备16G DDR4 内存); GPU: Nvidia Geforce GTX 1600 TI (6G); 操作系统: Windows 10-64位
我尝试比较GPU在基本矩阵运算中的速度与CPU的速度,并基本遵循了这个https://towardsdatascience.com/heres-how-to-use-cupy-to-make-numpy-700x-faster-4b920dda1f56。以下是我非常简单的代码
import numpy as npimport cupy as cpimport time### Numpy and CPUs = time.time()A = np.random.random([10000,10000]); B = np.random.random([10000,10000])CPU = np.matmul(A,B); CPU *= 5e = time.time()print(f'CPU time: {e - s: .2f}')### CuPy and GPUs = time.time()C= cp.random.random([10000,10000]); D = cp.random.random([10000,10000])GPU = cp.matmul(C,D); GPU *= 5cp.cuda.Stream.null.synchronize() # to let the code finish executing on the GPU before calculating the timee = time.time()print(f'GPU time: {e - s: .2f}')
讽刺的是,结果显示CPU 时间: 11.74GPU 时间: 12.56
这让我很困惑。为什么GPU在大规模矩阵运算中竟然比CPU还慢?请注意,我甚至还没有应用并行计算(我是一个初学者,我不确定系统是否会为我开启)。我确实查看了类似的问题,例如为什么我的CPU在矩阵运算中比GPU快?。但在这里我使用的是cupy 而不是mxnet(cupy更新并且专为GPU计算设计)。
能有人帮帮我吗?我将不胜感激!
回答:
numpy 的 random 默认生成的是32位浮点数。Cupy 的 random 默认生成的是64位(双精度)浮点数。为了进行公平的比较,可以这样更改GPU的随机数生成方式:
C= cp.random.random([10000,10000], dtype=cp.float32)D = cp.random.random([10000,10000], dtype=cp.float32)
我的硬件(CPU和GPU)与你不同,但一旦做出这个更改,GPU版本的速度大约是CPU版本的12倍。使用cupy生成两个随机数ndarray、进行矩阵乘法和标量乘法,总共不到一秒钟的时间