Advertisement
Guest User

bench_luaji_view.lua

a guest
Sep 6th, 2015
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 3.50 KB | None | 0 0
  1.  
  2. -- Cases:
  3. -- 1:
  4. -- 2: row
  5. -- 3: row,ffi
  6. -- 4: row,ffi,gc
  7. -- 5: row,copy
  8. -- +: cases 1-5 + unroll
  9.  
  10. local ffi = require 'ffi'
  11. local type, setmetatable = type, setmetatable
  12.  
  13. local opt = arg[1] or ''
  14.  
  15. local row_mt
  16. row_mt = {
  17.   __index = function(self, k)
  18.     if type(k) == 'number' then
  19.       return self._o[self._r][k]
  20.     else
  21.       return row_mt[k]
  22.     end
  23.   end,
  24.   len = function(self) -- No __len for tables.
  25.     return self._m
  26.   end,
  27. }
  28.  
  29. local row_ffi_mt
  30. row_ffi_mt = {
  31.   __index = function(self, k)
  32.     if type(k) == 'number' then
  33.       return self._p[k-1]
  34.     else
  35.       return row_ffi_mt[k]
  36.     end
  37.   end,
  38.   len = function(self)
  39.     return self._m
  40.   end,
  41.   __gc = (opt:find('gc') and not opt:find('copy')) and function()
  42.     -- Not important.
  43.   end or nil,
  44. }
  45.  
  46. local row_ffi = ffi.metatype('struct { int32_t _m; double* _p; }', row_ffi_mt)
  47. local row_copy = ffi.metatype('struct { int32_t _m; double _p[?]; }', row_ffi_mt)
  48.  
  49. local mat_mt
  50. mat_mt = {
  51.   __new = function(ct, nrow, ncol)
  52.     local o = ffi.new(ct, nrow*ncol)
  53.     o._n, o._m = nrow, ncol
  54.     return o
  55.   end,
  56.   __index = function(self, k)
  57.     if type(k) == 'number' then
  58.       return self._p-1 + (k-1)*self._m
  59.     else
  60.       return mat_mt[k]
  61.     end
  62.   end,
  63.   nrow = function(self)
  64.     return self._n
  65.   end,
  66.   ncol = function(self)
  67.     return self._m
  68.   end,
  69. }
  70. if opt:find('ffi') then
  71.   mat_mt.row = function(self, r)
  72.     return row_ffi(self._m, self._p + (r-1)*self._m)
  73.   end
  74. elseif opt:find('copy') then
  75.   mat_mt.row = function(self, r)
  76.     local o = row_copy(self._m)
  77.     o._m = self._m
  78.     ffi.copy(o._p, self._p + (r-1)*self._m, 8*self._m)
  79.     return o
  80.   end
  81. else
  82.   mat_mt.row = function(self, r)
  83.     return setmetatable({ _o = self, _r = r, _m = self._m }, row_mt)
  84.   end
  85. end
  86.  
  87. local mat = ffi.metatype('struct { int32_t _n, _m; double _p[?]; }', mat_mt)
  88.  
  89. local NROW, NCOL = 5, 5
  90. local NSIM = 1e6
  91.  
  92. local A = mat(NROW, NCOL)
  93. for r=1,NROW do for c=1,NCOL do A[r][c] = r*10 + c end end
  94.  
  95. local min, max = math.min, math.max
  96. local function range(x)
  97.   local l, u = -1/0, 1/0
  98.   for i=1,x:len() do
  99.     l, u = max(l, x[i]), min(u, x[i])
  100.   end
  101.   return u - l
  102. end
  103. local function range_unroll(x)
  104.   local l, u = -1/0, 1/0
  105.   l, u = max(l, x[1]), min(u, x[1])
  106.   l, u = max(l, x[2]), min(u, x[2])
  107.   l, u = max(l, x[3]), min(u, x[3])
  108.   l, u = max(l, x[4]), min(u, x[4])
  109.   l, u = max(l, x[5]), min(u, x[5])
  110.   return u - l
  111. end
  112. if opt:find('unroll') then
  113.   assert(NROW == 5, 'being lazy!')
  114. end
  115. local algo = opt:find('unroll') and range_unroll or range
  116.  
  117. local clock_start = os.clock()
  118.  
  119. local range_sum = 0
  120.  
  121. if opt:find('row') then
  122.   -- Via rows access:
  123.   for _=1,NSIM do
  124.     for r=1,A:nrow() do
  125.       range_sum = range_sum + algo(A:row(r))
  126.     end
  127.   end
  128. else
  129.   -- Direct access:
  130.   if opt:find('unroll') then
  131.     for _=1,NSIM do
  132.       for r=1,A:nrow() do
  133.         local l, u = -1/0, 1/0
  134.         l, u = max(l, A[r][1]), min(u, A[r][1])
  135.         l, u = max(l, A[r][2]), min(u, A[r][2])
  136.         l, u = max(l, A[r][3]), min(u, A[r][3])
  137.         l, u = max(l, A[r][4]), min(u, A[r][4])
  138.         l, u = max(l, A[r][5]), min(u, A[r][5])
  139.         range_sum = range_sum + (u - l)
  140.       end
  141.     end
  142.   else
  143.     for _=1,NSIM do
  144.       for r=1,A:nrow() do
  145.         local l, u = -1/0, 1/0
  146.         for c = 1,A:ncol() do
  147.           l, u = max(l, A[r][c]), min(u, A[r][c])
  148.         end
  149.         range_sum = range_sum + (u - l)
  150.       end
  151.     end
  152.   end
  153. end
  154.  
  155. print(range_sum)
  156.  
  157. print(os.clock() - clock_start)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement