1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/js/src/parjs-benchmarks/edges.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,82 @@ 1.4 +load(libdir + "util.js"); 1.5 + 1.6 +var SobelX = [[-1.0, 0.0, 1.0], 1.7 + [-2.0, 0.0, 2.0], 1.8 + [-1.0, 0.0, 1.0]]; 1.9 +var SobelY = [[ 1.0, 2.0, 1.0], 1.10 + [ 0.0, 0.0, 0.0], 1.11 + [-1.0, -2.0, -1.0]]; 1.12 + 1.13 +function stripedImage(w, h) { 1.14 + var resultArray = new Array(w * h); 1.15 + for (var y = 0; y < h; y++) { 1.16 + for (var x = 0; x < w; x++) { 1.17 + resultArray[y*w + x] = (Math.abs(x%100-y%100) < 10) ? 32 : 0; 1.18 + } 1.19 + } 1.20 + return resultArray; 1.21 +} 1.22 + 1.23 +function edgesSequentially(data, width, height) { 1.24 + var data1 = new Array(width * height); 1.25 + for (var y = 0; y < height; y++) { 1.26 + for (var x = 0; x < width; x++) { 1.27 + var total = compute(x, y); 1.28 + data1[y*width + x] = total | 0; 1.29 + } 1.30 + } 1.31 + return data1; 1.32 + 1.33 + function compute(x, y) { 1.34 + var totalX = 0; 1.35 + var totalY = 0; 1.36 + 1.37 + var offYMin = (y == 0 ? 0 : -1); 1.38 + var offYMax = (y == height - 1 ? 0 : 1); 1.39 + var offXMin = (x == 0 ? 0 : -1); 1.40 + var offXMax = (x == width - 1 ? 0 : 1); 1.41 + 1.42 + for (var offY = offYMin; offY <= offYMax; offY++) { 1.43 + for (var offX = offXMin; offX <= offXMax; offX++) { 1.44 + var e = data[(y + offY) * width + x + offX]; 1.45 + totalX += e * SobelX[offY + 1][offX + 1]; 1.46 + totalY += e * SobelY[offY + 1][offX + 1]; 1.47 + } 1.48 + } 1.49 + 1.50 + return (Math.abs(totalX) + Math.abs(totalY))/8.0 | 0; 1.51 + } 1.52 +} 1.53 + 1.54 +function edgesParallel(data) { 1.55 + var pa = new ParallelArray([Height, Width], function (y, x) { 1.56 + var totalX = 0; 1.57 + var totalY = 0; 1.58 + 1.59 + var offYMin = (y == 0 ? 0 : -1); 1.60 + var offYMax = (y == Height - 1 ? 0 : 1); 1.61 + var offXMin = (x == 0 ? 0 : -1); 1.62 + var offXMax = (x == Width - 1 ? 0 : 1); 1.63 + 1.64 + for (var offY = offYMin; offY <= offYMax; offY++) { 1.65 + for (var offX = offXMin; offX <= offXMax; offX++) { 1.66 + var e = data.get(y + offY, x + offX); 1.67 + totalX += e * SobelX[offY + 1][offX + 1]; 1.68 + totalY += e * SobelY[offY + 1][offX + 1]; 1.69 + } 1.70 + } 1.71 + 1.72 + return (Math.abs(totalX) + Math.abs(totalY))/8.0 | 0; 1.73 + }); 1.74 + return pa.flatten(); 1.75 +} 1.76 + 1.77 +var Width = 1024; 1.78 +var Height = 768; 1.79 +var ArrInput = stripedImage(Width, Height); 1.80 +var ParArrInput2D = new ParallelArray([Height, Width], 1.81 + function (y, x) ArrInput[y*Width + x]); 1.82 + 1.83 +benchmark("EDGES", 2, DEFAULT_MEASURE * 20, 1.84 + function() edgesSequentially(ArrInput, Width, Height), 1.85 + function() edgesParallel(ParArrInput2D));