michael@0: load(libdir + "util.js"); michael@0: michael@0: var SobelX = [[-1.0, 0.0, 1.0], michael@0: [-2.0, 0.0, 2.0], michael@0: [-1.0, 0.0, 1.0]]; michael@0: var SobelY = [[ 1.0, 2.0, 1.0], michael@0: [ 0.0, 0.0, 0.0], michael@0: [-1.0, -2.0, -1.0]]; michael@0: michael@0: function stripedImage(w, h) { michael@0: var resultArray = new Array(w * h); michael@0: for (var y = 0; y < h; y++) { michael@0: for (var x = 0; x < w; x++) { michael@0: resultArray[y*w + x] = (Math.abs(x%100-y%100) < 10) ? 32 : 0; michael@0: } michael@0: } michael@0: return resultArray; michael@0: } michael@0: michael@0: function edgesSequentially(data, width, height) { michael@0: var data1 = new Array(width * height); michael@0: for (var y = 0; y < height; y++) { michael@0: for (var x = 0; x < width; x++) { michael@0: var total = compute(x, y); michael@0: data1[y*width + x] = total | 0; michael@0: } michael@0: } michael@0: return data1; michael@0: michael@0: function compute(x, y) { michael@0: var totalX = 0; michael@0: var totalY = 0; michael@0: michael@0: var offYMin = (y == 0 ? 0 : -1); michael@0: var offYMax = (y == height - 1 ? 0 : 1); michael@0: var offXMin = (x == 0 ? 0 : -1); michael@0: var offXMax = (x == width - 1 ? 0 : 1); michael@0: michael@0: for (var offY = offYMin; offY <= offYMax; offY++) { michael@0: for (var offX = offXMin; offX <= offXMax; offX++) { michael@0: var e = data[(y + offY) * width + x + offX]; michael@0: totalX += e * SobelX[offY + 1][offX + 1]; michael@0: totalY += e * SobelY[offY + 1][offX + 1]; michael@0: } michael@0: } michael@0: michael@0: return (Math.abs(totalX) + Math.abs(totalY))/8.0 | 0; michael@0: } michael@0: } michael@0: michael@0: function edgesParallel(data) { michael@0: var pa = new ParallelArray([Height, Width], function (y, x) { michael@0: var totalX = 0; michael@0: var totalY = 0; michael@0: michael@0: var offYMin = (y == 0 ? 0 : -1); michael@0: var offYMax = (y == Height - 1 ? 0 : 1); michael@0: var offXMin = (x == 0 ? 0 : -1); michael@0: var offXMax = (x == Width - 1 ? 0 : 1); michael@0: michael@0: for (var offY = offYMin; offY <= offYMax; offY++) { michael@0: for (var offX = offXMin; offX <= offXMax; offX++) { michael@0: var e = data.get(y + offY, x + offX); michael@0: totalX += e * SobelX[offY + 1][offX + 1]; michael@0: totalY += e * SobelY[offY + 1][offX + 1]; michael@0: } michael@0: } michael@0: michael@0: return (Math.abs(totalX) + Math.abs(totalY))/8.0 | 0; michael@0: }); michael@0: return pa.flatten(); michael@0: } michael@0: michael@0: var Width = 1024; michael@0: var Height = 768; michael@0: var ArrInput = stripedImage(Width, Height); michael@0: var ParArrInput2D = new ParallelArray([Height, Width], michael@0: function (y, x) ArrInput[y*Width + x]); michael@0: michael@0: benchmark("EDGES", 2, DEFAULT_MEASURE * 20, michael@0: function() edgesSequentially(ArrInput, Width, Height), michael@0: function() edgesParallel(ParArrInput2D));