2017-03-15 53 views
0

我有一個簡單的問題。我想了解爲什麼gpu(cuda)和cpu給出的網絡響應有很大差異。這裏有一個小例子:火炬:GPU/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計算之間的一些預期差值?

回答

0

事實證明,即使平均絕對差可能很大,比例相差很小(1E中,5%左右):

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

是平均絕對差異。由於cuda與cpu相比處理浮點精度的方式有些不同,這是大的嗎?