为什么GPU上的乘法比CPU上慢?

3

这是我的代码(模拟前馈神经网络):

import torch
import time

print(torch.cuda.is_available())    # True
device = torch.device('cuda:0' )

a = torch.tensor([1,2,3,4,5,6]).float().reshape(-1,1)
w1 = torch.rand(120,6)
w2 = torch.rand(1,120)
b1 = torch.rand(120,1)
b2 = torch.rand(1,1).reshape(1,1)

start = time.time()
for _ in range(100000):
    ans = torch.mm(w2, torch.mm(w1,a)+b1)+b2
end = time.time()
print(end-start)                    # 1.2725720405578613 seconds

a = a.to(device)
w1 = w1.to(device)
w2 = w2.to(device)
b1 = b1.to(device)
b2 = b2.to(device)

start = time.time()
for _ in range(100000):
    ans = torch.mm(w2, torch.mm(w1,a)+b1)+b2
end = time.time()
print(end-start)                    # 5.6569812297821045 seconds

我不确定我是不是做错了什么,如何更改代码以显示GPU在矩阵乘法上CPU更快?


2
@KárolySzabó的答案完全正确。当您在GPU上创建张量时,需要同时创建cublas句柄以及进行一些其他内部分配,因此第一个操作将受到与此相关的开销的影响。尝试将维度从120增加到12000,看看差异。还有,您忘记了torch.cuda.synchronize() - Hossein
这个回答解决了你的问题吗?为什么在CUDA上使用PyTorch训练比在CPU上慢得多? - akshayk07
2个回答

8

可能的原因有很多:

  1. 您的模型过于简单。
  2. 对于GPU计算,需要将数据从主存储器传输到GPU内存中,以及从GPU内存再传输回主存储器中,这是一个成本。
  3. 您的计算基于小批量数据,使用更大的数据样本,您应该会看到GPU比CPU表现更好。
  4. 我们不应该忘记缓存,您在反复计算相同的操作,也许更好的方法是为每次运行生成随机的 a 张量。

这是pytorch论坛上的一篇帖子:https://discuss.pytorch.org/t/cpu-faster-than-gpu/25343

此外,您应该使用更好的性能分析工具,如本主题中所解释的:https://discuss.pytorch.org/t/how-to-measure-time-in-pytorch/26964


0

CPU到GPU的数据传输会带来一定的开销。你也可以观察到模型的第一层相比之前的层需要更多的时间。

这是因为张量首先从主机内存传输到GPU内存中。然后,CUDA核心在CUDA内存中对张量进行操作。


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