|
<!doctype html> |
|
<html lang="en-us"> |
|
<head> |
|
<meta charset="utf-8"> |
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> |
|
<title>Emscripten-Generated Code</title> |
|
|
|
<script type="text/javascript" src="arrayFunction.js"></script> |
|
</head> |
|
<body> |
|
|
|
|
|
<script> |
|
|
|
|
|
function arrayFunctionCpp(w, h, ncpp){ |
|
var length = w * h * ncpp; |
|
|
|
// Create example data to test float_multiply_array |
|
var data = new Float32Array(length); |
|
data[5] = 10; |
|
|
|
var t0 = performance.now(); |
|
|
|
// Import function from Emscripten generated file |
|
float_multiply_array = Module.cwrap( |
|
'float_multiply_array', null, ['number', 'number', 'number'] |
|
); |
|
|
|
// Get data byte size, allocate memory on Emscripten heap, and get pointer |
|
var nDataBytes = data.length * data.BYTES_PER_ELEMENT; |
|
//Module.TOTAL_MEMORY = nDataBytes; // added by jo |
|
var dataPtr = Module._malloc(nDataBytes); |
|
|
|
// Copy data to Emscripten heap (directly accessed from Module.HEAPU8) |
|
var dataHeap = new Uint8Array(Module.HEAPU8.buffer, dataPtr, nDataBytes); |
|
dataHeap.set(new Uint8Array(data.buffer)); |
|
|
|
var t0bis = performance.now(); |
|
// Call function and get result |
|
float_multiply_array(dataHeap.byteOffset, w, h, ncpp); |
|
var t1bis = performance.now(); |
|
var result = new Float32Array(dataHeap.buffer, dataHeap.byteOffset, data.length); |
|
|
|
// Free memory |
|
Module._free(dataHeap.byteOffset); |
|
|
|
var t1 = performance.now(); |
|
console.log("C++ took " + (t1 - t0) + " milliseconds. (including memory transfer)"); |
|
console.log("C++ took " + (t1bis - t0bis) + " milliseconds. (just function runtime)"); |
|
console.log( result ); |
|
} |
|
|
|
|
|
|
|
function arrayFunctionJs(w, h, ncpp){ |
|
var length = w * h * ncpp; |
|
|
|
|
|
|
|
|
|
|
|
// Create example data to test float_multiply_array |
|
var data = new Float32Array( length ); |
|
data[5] = 10; |
|
|
|
var t0 = performance.now(); |
|
var currentPixelIndex = 0; |
|
var currentPixelIndexUnderFilter = 0; |
|
|
|
/* |
|
var filter = [ |
|
[1/9, 1/9, 1/9], |
|
[1/9, 1/9, 1/9], |
|
[1/9, 1/9, 1/9] |
|
]; |
|
*/ |
|
|
|
var filter = [ |
|
[0.00000067, 0.00002292, 0.00019117, 0.00038771, 0.00019117, 0.00002292, 0.00000067], |
|
[0.00002292, 0.00078634, 0.00655965, 0.01330373, 0.00655965, 0.00078633, 0.00002292], |
|
[0.00019117, 0.00655965, 0.05472157, 0.11098164, 0.05472157, 0.00655965, 0.00019117], |
|
[0.00038771, 0.01330373, 0.11098164, 0.22508352, 0.11098164, 0.01330373, 0.00038771], |
|
[0.00019117, 0.00655965, 0.05472157, 0.11098164, 0.05472157, 0.00655965, 0.00019117], |
|
[0.00002292, 0.00078633, 0.00655965, 0.01330373, 0.00655965, 0.00078633, 0.00002292], |
|
[0.00000067, 0.00002292, 0.00019117, 0.00038771, 0.00019117, 0.00002292, 0.00000067] |
|
]; |
|
|
|
// one side size |
|
var filterSize = filter.length; |
|
var filterHalfSize = Math.floor( filterSize / 2 ); |
|
var startX = filterHalfSize; |
|
var startY = startX; |
|
var endX = w - filterHalfSize; |
|
var endY = h - filterHalfSize; |
|
|
|
var tempColor = 0; |
|
|
|
for(var i=startX; i<endX; i++){ |
|
for(var j=startY; j<endY; j++){ |
|
currentPixelIndex = j * w + i; |
|
|
|
tempColor = 0; |
|
|
|
// along filter width |
|
for(var iFilter=0; iFilter<filterSize; iFilter++){ |
|
// along filter height |
|
for(var jFilter=0; jFilter<filterSize; jFilter++){ |
|
|
|
var iUnderFilter = i + iFilter - filterHalfSize; |
|
var jUnderFilter = j + jFilter - filterHalfSize; |
|
currentPixelIndexUnderFilter = jUnderFilter * w + iUnderFilter; |
|
tempColor += data[currentPixelIndexUnderFilter]*filter[iFilter][jFilter]; |
|
} |
|
} |
|
|
|
data[currentPixelIndex] = tempColor; |
|
|
|
} |
|
} |
|
|
|
var t1 = performance.now(); |
|
console.log("JS took " + (t1 - t0) + " milliseconds."); |
|
console.log(data); |
|
|
|
} |
|
|
|
|
|
var w = 10000; |
|
var h = 10000; |
|
var ncpp = 1; |
|
|
|
arrayFunctionCpp( w, h, ncpp ); |
|
arrayFunctionJs( w, h, ncpp ); |
|
|
|
//------------------------------ |
|
|
|
|
|
|
|
|
|
</script> |
|
</body> |
|
</html> |