我试图找出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。
答案 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可以处理的更多!
(只要它不会耗尽内存:)