function inputYXOffset(mode) { const gpu = new GPU({ mode }); const kernel = gpu.createKernel(function(a) { return a[this.thread.x][this.thread.y]; }) .setOutput([8, 2]); const a = new Float32Array(16); a.set([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]); const result = kernel(input(a, [2, 8])); assert.deepEqual(result.map(function(v) { return Array.from(v); }), [[1,3,5,7,9,11,13,15],[2,4,6,8,10,12,14,16]]); gpu.destroy(); }
function inputZYXVariables(mode) { const gpu = new GPU({ mode }); const kernel = gpu.createKernel(function(a, x, y, z) { return a[z][y][x]; }) .setOutput([1]); const a = new Float32Array(32); a.set([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]); const aInput = input(a, [2, 4, 4]); assert.deepEqual(Array.from(kernel(aInput, 1, 2, 3)), [30]); assert.deepEqual(Array.from(kernel(aInput, 0, 2, 3)), [29]); assert.deepEqual(Array.from(kernel(aInput, 0, 2, 1)), [13]); assert.deepEqual(Array.from(kernel(aInput, 1, 2, 2)), [22]); assert.deepEqual(Array.from(kernel(aInput, 0, 2, 2)), [21]); gpu.destroy(); }
/** * Puts a nested 1d, 2d, or 3d array into a one-dimensional target array * @param {Float32Array|Uint16Array|Uint8Array} array * @param {Float32Array} target */ flattenTo(array, target) { if (utils.isArray(array[0])) { if (utils.isArray(array[0][0])) { if (utils.isArray(array[0][0][0])) { utils.flatten4dArrayTo(array, target); } else { utils.flatten3dArrayTo(array, target); } } else { utils.flatten2dArrayTo(array, target); } } else { target.set(array); } }
/** * Puts a nested 3d array into a one-dimensional target array * @param {Array|*} array * @param {Float32Array|Float64Array} target */ flatten3dArrayTo(array, target) { let offset = 0; for (let z = 0; z < array.length; z++) { for (let y = 0; y < array[z].length; y++) { target.set(array[z][y], offset); offset += array[z][y].length; } } }
function inputZYX(mode) { const gpu = new GPU({ mode }); const kernel = gpu.createKernel(function(a) { return a[this.thread.z][this.thread.y][this.thread.x]; }) .setOutput([2, 4, 4]); const a = new Float32Array(32); a.set([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]); const result = kernel(input(a, [2, 4, 4])); assert.deepEqual(result.map(function(v) { return v.map(function(v) { return Array.from(v); }); }), [[[1,2],[3,4],[5,6],[7,8]],[[9,10],[11,12],[13,14],[15,16]],[[17,18],[19,20],[21,22],[23,24]],[[25,26],[27,28],[29,30],[31,32]]]); gpu.destroy(); }
function inputX(mode) { const gpu = new GPU({ mode }); const kernel = gpu.createKernel(function(a) { return a[this.thread.x]; }) .setOutput([9]); const a = new Float32Array(9); a.set([1,2,3,4,5,6,7,8,9]); const result = kernel(input(a, [3, 3])); assert.deepEqual(Array.from(result), [1,2,3,4,5,6,7,8,9]); gpu.destroy(); }
/** * Puts a nested 4d array into a one-dimensional target array * @param {Array|*} array * @param {Float32Array|Float64Array} target */ flatten4dArrayTo(array, target) { let offset = 0; for (let l = 0; l < array.length; l++) { for (let z = 0; z < array[l].length; z++) { for (let y = 0; y < array[l][z].length; y++) { target.set(array[l][z][y], offset); offset += array[l][z][y].length; } } } }
function inputXY(mode) { const gpu = new GPU({ mode }); const kernel = gpu.createKernel(function(a) { return a[this.thread.y][this.thread.x]; }) .setOutput([9]); const a = new Float32Array(9); a.set([1,2,3,4,5,6,7,8,9]); const b = new Float32Array(9); b.set([1,2,3,4,5,6,7,8,9]); const result = kernel(input(a, [3, 3])); assert.deepEqual(Array.from(result), [1,2,3,4,5,6,7,8,9]); gpu.destroy(); }
function inputYX(mode) { const gpu = new GPU({ mode }); const kernel = gpu.createKernel(function(a) { return a[this.thread.y][this.thread.x]; }) .setOutput([3, 3]); const a = new Float32Array(9); a.set([1,2,3,4,5,6,7,8,9]); const result = kernel(input(a, [3, 3])); assert.deepEqual(result.map(function(v) { return Array.from(v); }), [[1,2,3],[4,5,6],[7,8,9]]); gpu.destroy(); }