#!/usr/bin/env luajit
+--[[
+
+ Written by Francois Fleuret (francois@fleuret.org)
+
+ This is free and unencumbered software released into the public
+ domain.
+
+ Anyone is free to copy, modify, publish, use, compile, sell, or
+ distribute this software, either in source code form or as a
+ compiled binary, for any purpose, commercial or non-commercial, and
+ by any means.
+
+ In jurisdictions that recognize copyright laws, the author or
+ authors of this software dedicate any and all copyright interest in
+ the software to the public domain. We make this dedication for the
+ benefit of the public at large and to the detriment of our heirs
+ and successors. We intend this dedication to be an overt act of
+ relinquishment in perpetuity of all present and future rights to
+ this software under copyright law.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+ CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+ For more information, please refer to <http://unlicense.org/>
+
+]]--
+
require 'torch'
require 'nn'
require 'profiler'
+-- Create a model
+
local model = nn.Sequential()
-model:add(nn.Linear(1000, 1000))
-model:add(nn.ReLU())
-model:add(nn.Linear(1000, 100))
+ :add(nn.Sequential()
+ :add(nn.Linear(1000, 1000))
+ :add(nn.ReLU())
+ )
+ :add(nn.Linear(1000, 100))
+
+-- Decor it for profiling
profiler.decor(model)
-for k = 1, 10 do
- local input = torch.Tensor(1000, 1000):uniform(-1, 1)
- local target = torch.Tensor(input:size(1), 100):uniform()
- local criterion = nn.MSECriterion()
+-- Create the data and criterion
+
+local input = torch.Tensor(1000, 1000)
+local target = torch.Tensor(input:size(1), 100)
+local criterion = nn.MSECriterion()
+
+local nbSamples = 0
+local modelTime = 0
+local dataTime = 0
+
+-- Loop five times through the data forward and backward
+
+for k = 1, 5 do
+ local t1 = sys.clock()
+
+ input:uniform(-1, 1)
+ target:uniform()
+
+ local t2 = sys.clock()
+
local output = model:forward(input)
local loss = criterion:forward(output, target)
local dloss = criterion:backward(output, target)
model:backward(input, dloss)
+
+ local t3 = sys.clock()
+
+ dataTime = dataTime + (t2 - t1)
+ modelTime = modelTime + (t3 - t2)
+
+ nbSamples = nbSamples + input:size(1)
end
-profiler.print(model)
+-- Print the accumulated timings
+
+profiler.print(model, nbSamples)
+
+print('----------------------------------------------------------------------')
+print(string.format('Total model time %.02fs', modelTime))
+print(string.format('Total data time %.02fs', dataTime))