Fixing one billion count with atomics
Now we know the reason for our garbage value, and, with atomics, it should be easy to fix the problem. Right? Wrong.
There is a massive performance penalty on using atomic locking a billion times. Let's look at our updated worker.js
code now:
// worker.js let sharedMem; addEventListener('message', ({data}) => { //console.log(data); if(data.message == 'sab') { sharedMem = data.memory; console.log('Memory ready'); } if(data.cmd == 'start') { console.log('Iterations ready'); startCounting(data.iterations); } }); function startCounting(limit) { const arr = new Uint32Array(sharedMem); for(let i=0;i<limit;i++) { Atomics.add(arr, 0, 1); } postMessage('done') }
This is similar to our previous implementation of the problem, with the change being that instead of adding it directly to the array, we are performing an atomic operation so that the value isn't changed by the other thread while...