import { Worker } from 'worker_threads'; import { isMainThread } from 'worker_threads'; import { parentPort } from 'worker_threads'; import { workerData } from 'worker_threads'; import { URL } from 'node:url'; import fs from 'fs/promises'; import { setupWebAssembly } from "./shared_pthread.js" const wasmBuffer = await fs.readFile('./binaries/wasm_add_pthread.wasm'); const __filename = new URL('', import.meta.url).pathname; const __dirname = new URL('.', import.meta.url).pathname; const NUM_THREADS = 12; const ARRAY_SIZE = 15000576; function getTime() { const ns = process.hrtime.bigint(); return Number( ns ) / 1e9; // Returns seconds } if( isMainThread ) { console.log("isMainThread"); let start; var end; start = getTime(); const sharedArrayBufferA = new SharedArrayBuffer(ARRAY_SIZE * 4); const sharedArrayBufferB = new SharedArrayBuffer(ARRAY_SIZE * 4); const sharedArrayBufferC = new SharedArrayBuffer(ARRAY_SIZE * 4); const a = new Float32Array(sharedArrayBufferA); const b = new Float32Array(sharedArrayBufferB); const c = new Float32Array(sharedArrayBufferC); end = getTime(); const allocTime = end - start; // Time array initialization (single-threaded, like original C) start = getTime(); for (let i = 0; i < ARRAY_SIZE; i++) { a[i] = i; b[i] = i * 2; } end = getTime(); const initTime = end - start; const chunkSize = Math.floor(ARRAY_SIZE / NUM_THREADS) const workerPromises = new Array(); for (let t = 0; t < NUM_THREADS; t++) { const workerStart = t * chunkSize; const workerEnd = (t === NUM_THREADS - 1) ? ARRAY_SIZE : (t + 1) * chunkSize; const workerData = { start: workerStart, end: workerEnd, sharedArrayBufferA, sharedArrayBufferB, sharedArrayBufferC }; const worker = new Worker( __filename, { workerData: workerData }); workerPromises.push(new Promise((resolve, reject) => { worker.on('exit', resolve); worker.on('error', reject); })); } } else { console.log("other Threads"); // here the ? setupWebAssembly( wasmBuffer, workerData, ARRAY_SIZE, NUM_THREADS ); }