use transferrable buffer for worker messages

pull/193/head
Vladimir Mandic 2021-10-13 11:53:54 -04:00
parent 7c7e21b8dd
commit bdfe6fb85f
3 changed files with 11 additions and 7 deletions

View File

@ -8,7 +8,6 @@
- Optimize BlazePose - Optimize BlazePose
- Add BlazePose heatmaps - Add BlazePose heatmaps
- Update NanoDet
<br> <br>

View File

@ -11,20 +11,21 @@ let records = 0;
const descLength = 1024; // descriptor length in bytes const descLength = 1024; // descriptor length in bytes
function distance(descriptor1, index, options = { order: 2 }) { function distance(descBuffer, index, options = { order: 2 }) {
const descriptor = new Float32Array(descBuffer);
let sum = 0; let sum = 0;
for (let i = 0; i < descriptor1.length; i++) { for (let i = 0; i < descriptor.length; i++) {
const diff = (options.order === 2) ? (descriptor1[i] - view[index * descLength + i]) : (Math.abs(descriptor1[i] - view[index * descLength + i])); const diff = (options.order === 2) ? (descriptor[i] - view[index * descLength + i]) : (Math.abs(descriptor[i] - view[index * descLength + i]));
sum += (options.order === 2) ? (diff * diff) : (diff ** options.order); sum += (options.order === 2) ? (diff * diff) : (diff ** options.order);
} }
return sum; return sum;
} }
function match(descriptor, options = { order: 2 }) { function match(descBuffer, options = { order: 2 }) {
let best = Number.MAX_SAFE_INTEGER; let best = Number.MAX_SAFE_INTEGER;
let index = -1; let index = -1;
for (let i = 0; i < records; i++) { for (let i = 0; i < records; i++) {
const res = distance(descriptor, i, { order: options.order }); const res = distance(descBuffer, i, { order: options.order });
if (res < best) { if (res < best) {
best = res; best = res;
index = i; index = i;

View File

@ -125,8 +125,12 @@ async function workersStart(numWorkers) {
} }
const match = (descriptor) => { const match = (descriptor) => {
// const arr = Float32Array.from(descriptor);
const buffer = new ArrayBuffer(options.descLength * 4);
const view = new Float32Array(buffer);
view.set(descriptor);
const available = data.workers.filter((worker) => !!worker).length; // find number of available workers const available = data.workers.filter((worker) => !!worker).length; // find number of available workers
if (available > 0) data.workers[data.requestID % available].postMessage({ descriptor, request: data.requestID }); // round robin to first available worker if (available > 0) data.workers[data.requestID % available].postMessage({ descriptor: buffer, request: data.requestID }, [buffer]); // round robin to first available worker
else log.error('no available workers'); else log.error('no available workers');
}; };