火炬:GPU / CPU响应的差异

  • 本文关键字:响应 CPU GPU 火炬 torch
  • 更新时间 :
  • 英文 :


我有一个简单的问题。我试图理解为什么 gpu(cuda( 和 CPU 给出的网络响应存在很大差异。下面是一个最小示例:

require 'torch'
require 'nn'
require 'cunn'
require 'paths'
-- a small convnet
net = nn.Sequential()
net:add(nn.SpatialConvolution(3,16, 3,3))
net:add(nn.SpatialConvolution(16,8, 3,3))
net:add(nn.SpatialConvolution(8,1, 3,3))
-- randomize weights
local w = net:getParameters()
w:copy(torch.Tensor(w:nElement()):uniform(-1000,1000))
-- random input
x = torch.Tensor(3, 10, 10):uniform(-1,1)
-- network on gpu
net:cuda()
y = net:forward(x:cuda())
print(y)
-- network on cpu
y2 = net:clone():double():forward(x)
print(y2)
-- check difference (typically ~10000)
print("Mean Abs. Diff:")
print(torch.abs(y2-y:double()):sum()/y2:nElement())

我在这里做错了什么,还是 CPU/GPU 计算之间存在一些预期差异?

事实证明,即使平均绝对差异可能很大,百分比差异也很小(大约 1e-5%(:

print("Mean Abs. % Diff:")
print(torch.abs(y2-y:double()):cdiv(torch.abs(y2)):sum() / y2:nElement())

由于 cuda 处理浮点精度的方式与 CPU 相比存在一些差异,平均绝对差值是否很大?

最新更新