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
- Add BlazePose heatmaps
- Update NanoDet
<br>

View File

@ -11,20 +11,21 @@ let records = 0;
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;
for (let i = 0; i < descriptor1.length; i++) {
const diff = (options.order === 2) ? (descriptor1[i] - view[index * descLength + i]) : (Math.abs(descriptor1[i] - view[index * descLength + i]));
for (let i = 0; i < descriptor.length; 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);
}
return sum;
}
function match(descriptor, options = { order: 2 }) {
function match(descBuffer, options = { order: 2 }) {
let best = Number.MAX_SAFE_INTEGER;
let index = -1;
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) {
best = res;
index = i;

View File

@ -125,8 +125,12 @@ async function workersStart(numWorkers) {
}
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
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');
};