Skip to content

Proposal: Limit bomb-worker concurrency #125

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
668 changes: 341 additions & 327 deletions worker/bomb-subtests/3d-cube.js

Large diffs are not rendered by default.

81 changes: 48 additions & 33 deletions worker/bomb-subtests/3d-morph.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,44 +23,59 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

var loops = 15
var nx = 120
var nz = 120
function workload() {
var loops = 15
var nx = 120
var nz = 120

function morph(a, f) {
var PI2nx = Math.PI * 8/nx
var sin = Math.sin
var f30 = -(50 * sin(f*Math.PI*2))

for (var i = 0; i < nz; ++i) {
for (var j = 0; j < nx; ++j) {
a[3*(i*nx+j)+1] = sin((j-1) * PI2nx ) * -f30
function morph(a, f) {
var PI2nx = Math.PI * 8/nx
var sin = Math.sin
var f30 = -(50 * sin(f*Math.PI*2))

for (var i = 0; i < nz; ++i) {
for (var j = 0; j < nx; ++j) {
a[3*(i*nx+j)+1] = sin((j-1) * PI2nx ) * -f30
}
}
}
}


var a = Array()
for (var i=0; i < nx*nz*3; ++i)
a[i] = 0
var a = Array()
for (var i=0; i < nx*nz*3; ++i)
a[i] = 0

for (var i = 0; i < loops; ++i) {
morph(a, i/loops)
}
for (var i = 0; i < loops; ++i) {
morph(a, i/loops)
}

testOutput = 0;
for (var i = 0; i < nx; i++)
testOutput += a[3*(i*nx+i)+1];
a = null;

testOutput = 0;
for (var i = 0; i < nx; i++)
testOutput += a[3*(i*nx+i)+1];
a = null;
// This has to be an approximate test since ECMAscript doesn't formally specify
// what sin() returns. Even if it did specify something like for example what Java 7
// says - that sin() has to return a value within 1 ulp of exact - then we still
// would not be able to do an exact test here since that would allow for just enough
// low-bit slop to create possibly big errors due to testOutput being a sum.
var epsilon = 1e-13;
if (Math.abs(testOutput) >= epsilon)
throw "Error: bad test output: expected magnitude below " + epsilon + " but got " + testOutput;

// This has to be an approximate test since ECMAscript doesn't formally specify
// what sin() returns. Even if it did specify something like for example what Java 7
// says - that sin() has to return a value within 1 ulp of exact - then we still
// would not be able to do an exact test here since that would allow for just enough
// low-bit slop to create possibly big errors due to testOutput being a sum.
var epsilon = 1e-13;
if (Math.abs(testOutput) >= epsilon)
throw "Error: bad test output: expected magnitude below " + epsilon + " but got " + testOutput;
postMessage("done");
close();
}

globalThis.onmessage = (event) => {
switch(event.data) {
case "start": {
workload();
break;
}
default:
throw new Error(`Unknown worker message: ${event.data}`)
}
}
globalThis.postMessage("ready");

postMessage("done");
close();
27 changes: 21 additions & 6 deletions worker/bomb-subtests/3d-raytrace.js
Original file line number Diff line number Diff line change
Expand Up @@ -438,12 +438,27 @@ for (var y = 0; y < size; y++) {\n\
return s;
}

testOutput = arrayToCanvasCommands(raytraceScene());
function workload() {

var expectedLength = 20970;
testOutput = arrayToCanvasCommands(raytraceScene());

if (testOutput.length != expectedLength)
throw "Error: bad result: expected length " + expectedLength + " but got " + testOutput.length;
var expectedLength = 20970;

postMessage("done");
close();
if (testOutput.length != expectedLength)
throw "Error: bad result: expected length " + expectedLength + " but got " + testOutput.length;

postMessage("done");
close();
}

globalThis.onmessage = (event) => {
switch(event.data) {
case "start": {
workload();
break;
}
default:
throw new Error(`Unknown worker message: ${event.data}`)
}
}
globalThis.postMessage("ready");
106 changes: 60 additions & 46 deletions worker/bomb-subtests/access-binary-trees.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,56 +2,70 @@
http://shootout.alioth.debian.org/
contributed by Isaac Gouy */

function TreeNode(left,right,item){
this.left = left;
this.right = right;
this.item = item;
}
function workload() {
function TreeNode(left,right,item){
this.left = left;
this.right = right;
this.item = item;
}

TreeNode.prototype.itemCheck = function(){
if (this.left==null) return this.item;
else return this.item + this.left.itemCheck() - this.right.itemCheck();
}
TreeNode.prototype.itemCheck = function(){
if (this.left==null) return this.item;
else return this.item + this.left.itemCheck() - this.right.itemCheck();
}

function bottomUpTree(item,depth){
if (depth>0){
return new TreeNode(
bottomUpTree(2*item-1, depth-1)
,bottomUpTree(2*item, depth-1)
,item
);
function bottomUpTree(item,depth){
if (depth>0){
return new TreeNode(
bottomUpTree(2*item-1, depth-1)
,bottomUpTree(2*item, depth-1)
,item
);
}
else {
return new TreeNode(null,null,item);
}
}
else {
return new TreeNode(null,null,item);

var ret = 0;

for ( var n = 4; n <= 7; n += 1 ) {
var minDepth = 4;
var maxDepth = Math.max(minDepth + 2, n);
var stretchDepth = maxDepth + 1;

var check = bottomUpTree(0,stretchDepth).itemCheck();

var longLivedTree = bottomUpTree(0,maxDepth);
for (var depth=minDepth; depth<=maxDepth; depth+=2){
var iterations = 1 << (maxDepth - depth + minDepth);

check = 0;
for (var i=1; i<=iterations; i++){
check += bottomUpTree(i,depth).itemCheck();
check += bottomUpTree(-i,depth).itemCheck();
}
}

ret += longLivedTree.itemCheck();
}
}

var ret = 0;

for ( var n = 4; n <= 7; n += 1 ) {
var minDepth = 4;
var maxDepth = Math.max(minDepth + 2, n);
var stretchDepth = maxDepth + 1;

var check = bottomUpTree(0,stretchDepth).itemCheck();

var longLivedTree = bottomUpTree(0,maxDepth);
for (var depth=minDepth; depth<=maxDepth; depth+=2){
var iterations = 1 << (maxDepth - depth + minDepth);

check = 0;
for (var i=1; i<=iterations; i++){
check += bottomUpTree(i,depth).itemCheck();
check += bottomUpTree(-i,depth).itemCheck();
}
}

ret += longLivedTree.itemCheck();
}
var expected = -4;
if (ret != expected)
throw "ERROR: bad result: expected " + expected + " but got " + ret;

var expected = -4;
if (ret != expected)
throw "ERROR: bad result: expected " + expected + " but got " + ret;
postMessage("done");
close();
}

postMessage("done");
close();
globalThis.onmessage = (event) => {
switch(event.data) {
case "start": {
workload();
break;
}
default:
throw new Error(`Unknown worker message: ${event.data}`)
}
}
globalThis.postMessage("ready");
29 changes: 22 additions & 7 deletions worker/bomb-subtests/access-fannkuch.js
Original file line number Diff line number Diff line change
Expand Up @@ -61,12 +61,27 @@ function fannkuch(n) {
}
}

var n = 8;
var ret = fannkuch(n);
function workload() {
var n = 8;
var ret = fannkuch(n);

var expected = 22;
if (ret != expected)
throw "ERROR: bad result: expected " + expected + " but got " + ret;
var expected = 22;
if (ret != expected)
throw "ERROR: bad result: expected " + expected + " but got " + ret;

postMessage("done");
close();
}

globalThis.onmessage = (event) => {
switch(event.data) {
case "start": {
workload();
break;
}
default:
throw new Error(`Unknown worker message: ${event.data}`)
}
}
globalThis.postMessage("ready");

postMessage("done");
close();
55 changes: 35 additions & 20 deletions worker/bomb-subtests/access-nbody.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,26 +151,41 @@ NBodySystem.prototype.energy = function(){
return e;
}

var ret = 0;

for ( var n = 3; n <= 24; n *= 2 ) {
(function(){
var bodies = new NBodySystem( Array(
Sun(),Jupiter(),Saturn(),Uranus(),Neptune()
));
var max = n * 100;

ret += bodies.energy();
for (var i=0; i<max; i++){
bodies.advance(0.01);
}
ret += bodies.energy();
})();
function workload() {
var ret = 0;

for ( var n = 3; n <= 24; n *= 2 ) {
(function(){
var bodies = new NBodySystem( Array(
Sun(),Jupiter(),Saturn(),Uranus(),Neptune()
));
var max = n * 100;

ret += bodies.energy();
for (var i=0; i<max; i++){
bodies.advance(0.01);
}
ret += bodies.energy();
})();
}

var expected = -1.3524862408537381;
if (ret != expected)
throw "ERROR: bad result: expected " + expected + " but got " + ret;

postMessage("done");
close();
}

var expected = -1.3524862408537381;
if (ret != expected)
throw "ERROR: bad result: expected " + expected + " but got " + ret;
globalThis.onmessage = (event) => {
switch(event.data) {
case "start": {
workload();
break;
}
default:
throw new Error(`Unknown worker message: ${event.data}`)
}
}
globalThis.postMessage("ready");

postMessage("done");
close();
27 changes: 21 additions & 6 deletions worker/bomb-subtests/access-nsieve.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,26 @@ function sieve() {
return sum;
}

var result = sieve();
function workload() {
var result = sieve();

var expected = 14302;
if (result != expected)
throw "ERROR: bad result: expected " + expected + " but got " + result;
var expected = 14302;
if (result != expected)
throw "ERROR: bad result: expected " + expected + " but got " + result;

postMessage("done");
close();
}

globalThis.onmessage = (event) => {
switch(event.data) {
case "start": {
workload();
break;
}
default:
throw new Error(`Unknown worker message: ${event.data}`)
}
}
globalThis.postMessage("ready");

postMessage("done");
close();
Loading
Loading