Author: Carl Friedrich Bolz <[email protected]>
Branch: extradoc
Changeset: r4551:f9f6a63c7ad9
Date: 2012-08-13 21:11 +0200
http://bitbucket.org/pypy/extradoc/changeset/f9f6a63c7ad9/

Log:    have a first go at the convolution benchmarks

diff --git a/talk/iwtc11/benchmarks/convolution/convolution.lua 
b/talk/iwtc11/benchmarks/convolution/convolution.lua
new file mode 100644
--- /dev/null
+++ b/talk/iwtc11/benchmarks/convolution/convolution.lua
@@ -0,0 +1,178 @@
+local ffi = require("ffi")
+
+function array(length, initializer)
+    return ffi.new("double[?]", length, initializer)
+end
+
+-- _______________ conv3 _______________
+
+function _conv3(a, arraylength, k, n)
+    assert(#k == 3)
+    local b = array(arraylength - 2, 0)
+    while n > 0 do
+        n = n - 1
+        -- b needs zero-based indexing, k 1-based indexing
+        for i = 0, arraylength - 3 do
+            b[i] = k[3] * a[i] + k[2] * a[i + 1] + k[1] * a[i + 2]
+        end
+    end
+    return b
+end
+
+function conv3(n)
+    local arraylength = 100000000/n
+    _conv3(array(arraylength, 1), arraylength,
+           {-1, 0, 1}, n)
+    return string.format("conv3(array(1e%d))", math.log10(100000000/n))
+end
+
+-- _______________ conv5 _______________
+
+function _conv5(a, arraylength, k, n)
+    assert(#k == 5)
+    n = n or 1
+    local b = array(arraylength - 4, 0)
+    while n > 0 do
+        n = n - 1
+        -- b needs zero-based indexing, k 1-based indexing
+        for i = 0, arraylength - 5 do
+            b[i] = k[5]*a[i] + k[4]*a[i+1] + k[3]*a[i+2] + k[2]*a[i+3] + 
k[1]*a[i+4]
+        end
+    end
+    return b
+end
+
+function conv5(n)
+    local arraylength = 100000000/n
+    _conv5(array(arraylength, 1), arraylength,
+           {1, 4, 6, 4, 1}, n)
+    return string.format("conv5(array(1e%d))", math.log10(100000000/n))
+end
+
+-- _______________ conv3x3 _______________
+
+-- begin class Array2D
+
+Array2D = {
+
+    new = function(self, w, h, initializer)
+        initializer = initializer or 0
+        return setmetatable(
+            {width = w, height = h, data=array(w * h, initializer)}, self)
+    end,
+
+    __tostring = function(self)
+        return string.format("Array2D(%d, %d)", self.width, self.height)
+    end,
+
+    idx = function(self, x, y)
+        return y * self.width + x
+    end,
+
+    get = function(self, x, y)
+        return self.data[self:idx(x, y)]
+    end,
+
+    set = function(self, x, y, val)
+        self.data[self:idx(x, y)] = val
+    end,
+}
+
+Array2D.__index = Array2D
+
+-- end class Array2D
+
+function _conv3x3(a, b, k)
+    assert(k.width == 3 and k.height == 3)
+    for y = 1, a.height - 2     do
+        for x = 1, a.width - 2 do
+            b:set(x, y, k:get(2, 2) * a:get(x - 1, y - 1) + k:get(1, 2) * 
a:get(x, y - 1) + k:get(0, 2) * a:get(x + 1, y - 1) +
+                        k:get(2, 1) * a:get(x - 1, y) + k:get(1, 1) * a:get(x, 
y) + k:get(0, 1) * a:get(x + 1, y) +
+                        k:get(2, 0) * a:get(x - 1, y + 1) + k:get(1, 0) * 
a:get(x, y + 1) + k:get(0, 0) * a:get(x + 1, y + 1))
+        end
+    end
+    return b
+end
+
+function conv3x3(x, y)
+    local a = Array2D:new(x, y)
+    local b = Array2D:new(x, y)
+    for i = 1, 10 do
+        _conv3x3(a, b, Array2D:new(3, 3))
+    end
+    return string.format("conv3x3(Array2D(%dx%d))", x, y)
+end
+
+
+function morphology3x3(a, b, k, func)
+    assert(k.width == 3 and k.height == 3)
+    for y = 1, a.height - 2 do
+        for x = 1, a.width - 2 do
+            b:set(x, y, func(k:get(2, 2) * a:get(x - 1, y - 1), k:get(1, 2) * 
a:get(x, y - 1), k:get(0, 2) * a:get(x + 1, y - 1),
+                             k:get(2, 1) * a:get(x - 1, y), k:get(1, 1) * 
a:get(x, y), k:get(0, 1) * a:get(x + 1, y),
+                             k:get(2, 0) * a:get(x - 1, y + 1), k:get(1, 0) * 
a:get(x, y + 1), k:get(0, 0) * a:get(x + 1, y + 1)))
+        end
+    end
+    return b
+end
+
+function _dilate3x3(a, b, k)
+    return morphology3x3(a, b, k, math.max)
+end
+
+function dilate3x3(x, y)
+    local a = Array2D:new(x, y)
+    local b = Array2D:new(x, y)
+    for i = 1, 10 do
+        _dilate3x3(a, b, Array2D:new(3, 3))
+    end
+    return string.format("dilate3x3(Array2D(%dx%d))", x, y)
+end
+
+function _sobel_magnitude(a)
+    b = Array2D:new(a.width, a.height)
+    for y = 1, a.height - 2 do
+        for x = 1, a.width - 2 do
+            local dx = -1 * a:get(x - 1, y - 1) + 1 * a:get(x + 1, y - 1) +
+                       -2 * a:get(x - 1, y) + 2 * a:get(x + 1, y) +
+                       -1 * a:get(x - 1, y + 1) + 1 * a:get(x + 1, y + 1)
+            local dy = -1 * a:get(x - 1, y - 1) - 2 * a:get(x, y - 1) - 1 * 
a:get(x + 1, y - 1) +
+                        1 * a:get(x - 1, y + 1) + 2 * a:get(x, y + 1) + 1 * 
a:get(x + 1, y + 1)
+            b:set(x, y, math.sqrt(dx * dx + dy * dy) / 4)
+        end
+    end
+    return b
+end
+
+
+function sobel_magnitude(x, y)
+    for i = 1, 10 do
+        _sobel_magnitude(Array2D:new(x, y))
+    end
+    return string.format('sobel(Array2D(%sx%s))', x, y)
+end
+
+
+-- entry point
+function main(args)
+    arg = args[1]
+    num = tonumber(args[2])
+    if arg == "conv3" then
+        conv3(num)
+    elseif arg == "conv5" then
+        conv5(num)
+    elseif arg == "conv3x3" then
+        num2 = tonumber(args[3])
+        conv3x3(num, num2)
+    elseif arg == "dilate3x3" then
+        num2 = tonumber(args[3])
+        dilate3x3(num, num2)
+    elseif arg == "sobel_magnitude" then
+        num2 = tonumber(args[3])
+        sobel_magnitude(num, num2)
+    end
+    return string.format("%s", arg)
+end
+
+main(arg)
+
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to