Skip to content

Commit

Permalink
10.75s Minimising the overhead of the communication between primary a…
Browse files Browse the repository at this point in the history
…nd workers
  • Loading branch information
Jumbub committed Mar 27, 2022
1 parent bede89d commit 301c1fb
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 19 deletions.
37 changes: 19 additions & 18 deletions src/logic/next.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,32 +64,33 @@ const createSegments = (segments: number, width: number, height: number) => {

export const startNextBoardLoop = (generationsAndMax: Uint32Array, board: Board, workers: Worker[]) => {
const segments = createSegments(workers.length, board.width, board.height);
const startNextBoard = () => {
const segmentsCount = new Int32Array(new SharedArrayBuffer(4));
const segmentsDone = new Int32Array(new SharedArrayBuffer(4));

const nextBoardLoop = () => {
Atomics.store(segmentsCount, 0, 0);
Atomics.store(segmentsDone, 0, 0);

flipBoardIo(board);
board.skips[1 - board.skipsInput[0]].fill(SKIP);
workers.forEach((worker, i) => {
const message: StartMessage = { ...segments[i], board };
const message: StartMessage = {
...segments[i],
board,
segmentsCount,
segmentsTotal: segments.length,
segmentsDone,
};
worker.postMessage(message);
});
};

const onWorkersFinished = () => {
// Wait for segments to be completed
Atomics.wait(segmentsDone, 0, 0, Infinity);

assignBoardPadding(board);
generationsAndMax[0]++;
if (generationsAndMax[0] < generationsAndMax[1]) startNextBoard();
if (generationsAndMax[0] < generationsAndMax[1]) nextBoardLoop();
};

// Setup listeners
let completions = 0;
workers.forEach(worker => {
const onWorkerFinished = () => {
if (++completions === workers.length) {
completions = 0;
onWorkersFinished();
}
};
worker.addEventListener('message', onWorkerFinished);
});

startNextBoard();
nextBoardLoop();
};
13 changes: 12 additions & 1 deletion src/logic/segmentWorker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,28 @@ export type StartMessage = {
beginI: number;
endI: number;
board: Board;
segmentsCount: Int32Array;
segmentsTotal: number;
segmentsDone: Int32Array;
};

addEventListener('message', (event: MessageEvent<StartMessage>) => {
const {
board: { width },
beginI,
endI,
segmentsCount,
segmentsTotal,
segmentsDone,
} = event.data;
const { input, output, inSkips, outSkips } = getBoardIo(event.data.board);
nextBoardSection(beginI, endI, width, input, output, inSkips, outSkips);
postMessage(1);

const count = Atomics.add(segmentsCount, 0, 1);
if (count === segmentsTotal - 1) {
Atomics.store(segmentsDone, 0, 1);
Atomics.notify(segmentsDone, 0);
}
});

postMessage('ready');

0 comments on commit 301c1fb

Please sign in to comment.