Pytorch速度比较-GPU比CPU慢

时间:2018-11-15 18:01:52

标签: python pytorch

我试图找出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 个答案:

答案 0 :(得分:10)

GPU加速通过大量并行计算实现。在GPU上,您有大量的内核,每个内核都不是很强大,但是这里的大量内核很重要。

像PyTorch这样的框架尽其所能使尽可能多的并行计算成为可能。通常,矩阵运算非常适合并行化,但并非总是可以并行化计算!

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

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

您有 1000000 个操作,但是由于代码的结构,不可能并行化许多这些计算。如果考虑一下,要计算 next b,您需要知道 previous (或 current )的值{ {1}}。

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

b

因此,您每次迭代只能并行化 16 个操作(添加项)。 由于CPU的数量很少,而功能强大的内核却更多,因此对于给定的示例来说,速度要快得多!

但是如果您改变张量的大小,事情就会改变,然后PyTorch能够并行化更多的整体计算。我将迭代次数更改为 1000 (因为我不想等待这么长时间:),但是您可以输入任意值,CPU和GPU之间的关系应保持不变。

这是不同张量大小的结果:

torch.ones(4,4)

因此,如您所见,在可以并行化内容(此处为张量元素的添加)的地方,GPU变得非常强大。
对于给定的计算,GPU时间根本没有改变,GPU可以处理的更多!
(只要它不会耗尽内存:)