Pytorch速度比较- GPU比CPU慢

13
我想知道GPU张量操作是否比CPU的更快。因此,我编写了以下代码来实现对CPU张量和GPU cuda张量的简单2D加法操作,以查看速度差异:

我试图找出GPU张量操作是否比CPU更快。所以,我编写了以下特定代码,依次实现对CPU张量和GPU cuda张量进行简单的2D加法,以查看速度差异:

import torch
import time

###CPU
start_time = time.time()
a = torch.ones(4,4)
for _ in range(1000000):
    a += a
elapsed_time = time.time() - start_time

print('CPU time = ',elapsed_time)

###GPU
start_time = time.time()
b = torch.ones(4,4).cuda()
for _ in range(1000000):
    b += b
elapsed_time = time.time() - start_time

print('GPU time = ',elapsed_time)

令我惊讶的是,CPU时间为0.93秒,而GPU时间高达63秒。我是否正确执行了cuda张量操作?或者说,cuda张量的概念只在非常复杂的操作(例如神经网络)中才能更快地工作吗?

注意:我的GPU是NVIDIA 940MX,torch.cuda.is_available()调用返回True。

1个回答

34

GPU加速通过大规模的计算并行化工作。在GPU上,您拥有大量核心,每个核心的功率不是很强大,但这里的大量核心很重要。

像PyTorch这样的框架尽力实现尽可能多的并行计算。通常,矩阵运算非常适合并行处理,但并不总是可能并行计算!

在您的例子中,您有一个循环:

b = torch.ones(4,4).cuda()
for _ in range(1000000):
    b += b

您有1000000个操作,但由于代码结构的限制,很难将这些计算并行化。如果您仔细想一下,要计算b下一个值,您需要知道b上一个(或当前的)值。

因此,您有1000000个操作,但每个操作都必须一个接一个地计算。可能的并行化仅限于张量的大小。不过,在您的示例中,该大小并不是非常大:

torch.ones(4,4)

因此,每次迭代只能并行执行 16 次操作(加法)。 由于 CPU 拥有较少但更加强大的核心,对于给定的示例来说,它的速度要快得多!

但如果您改变张量的大小,情况就会改变,此时PyTorch能够并行处理更多的整体计算。我将迭代次数更改为1000(因为我不想等待太久 :), 但您可以输入任何您喜欢的值,CPU和GPU之间的关系应该保持不变。

以下是不同张量大小的结果:

#torch.ones(4,4)       - the size you used
CPU time =  0.00926661491394043
GPU time =  0.0431208610534668

#torch.ones(40,40)     - CPU gets slower, but still faster than GPU
CPU time =  0.014729976654052734
GPU time =  0.04474186897277832

#torch.ones(400,400)   - CPU now much slower than GPU
CPU time =  0.9702610969543457
GPU time =  0.04415607452392578

#torch.ones(4000,4000) - GPU much faster then CPU 
CPU time =  38.088677167892456
GPU time =  0.044649362564086914

因此,正如你所看到的,在可能并行化的领域(例如张量元素的加法),GPU变得非常强大。
对于给定的计算,GPU时间根本不会改变,它可以处理更多的任务!
(只要它不用完内存 :)


5
你的GPU计时没有太多意义。它比CPU快得多,但不是快1000倍!我认为你需要在计时之前添加torch.cuda.synchronize(),否则你只是计时了将指令传输到GPU所需的时间,而不是实际执行本身的时间。 - Jaap Versteegh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接