Sums of Squares

Benchmark created on


Description

This demonstrates how reducing data dependency bottlenecks can cause code to run faster by allowing for instruction-level parallelism.

Setup

function sumsSquaresBasic(array) {
	let total = 0;
	for (let i = 0; i < array.length; i++) {
		total += array[i] * array[i];
	}
	return total;
}


function sumsSquaresParallel2(array) {
	let total1 = 0;
	let total2 = 0;
	for (let i = 0; i < array.length; i += 2) {
		total1 += array[i] * array[i];
		total2 += array[i + 1] * array[i + 1];
	}
	return total1 + total2;
}

function sumsSquaresParallel4(array) {
	let total1 = 0;
	let total2 = 0;
	let total3 = 0;
	let total4 = 0;
	for (let i = 0; i < array.length; i += 4) {
		total1 += array[i] * array[i];
		total2 += array[i + 1] * array[i + 1];
		total3 += array[i + 2] * array[i + 2];
		total4 += array[i + 3] * array[i + 3];
	}
	return total1 + total2 + total3 + total4;
}

function sumsSquaresParallel8(array) {
	let total1 = 0;
	let total2 = 0;
	let total3 = 0;
	let total4 = 0;
	let total5 = 0;
	let total6 = 0;
	let total7 = 0;
	let total8 = 0;
	for (let i = 0; i < array.length; i += 8) {
		total1 += array[i] * array[i];
		total2 += array[i + 1] * array[i + 1];
		total3 += array[i + 2] * array[i + 2];
		total4 += array[i + 3] * array[i + 3];
		total5 += array[i + 4] * array[i + 4];
		total6 += array[i + 5] * array[i + 5];
		total7 += array[i + 6] * array[i + 6];
		total8 += array[i + 7] * array[i + 7];
	}
	return total1 + total2 + total3 + total4
		+ total5 + total6 + total7 + total8;
}


function generateArray(length) {
	let array = [];
	for (let i = 0; i < length; i++) {
		array.push(Math.random());
	}
	return array;
}


let testArray1 = generateArray(8 * 100);
let testArray2 = generateArray(8 * 1000);
let testArray3 = generateArray(8 * 10000);
let testArray4 = generateArray(8 * 100000);

Test runner

Ready to run.

Testing in
TestOps/sec
Basic
sumsSquaresBasic(testArray1);
sumsSquaresBasic(testArray2);
sumsSquaresBasic(testArray3);
sumsSquaresBasic(testArray4);
ready
2x Parallel
sumsSquaresParallel2(testArray1);
sumsSquaresParallel2(testArray2);
sumsSquaresParallel2(testArray3);
sumsSquaresParallel2(testArray4);
ready
4x Parallel
sumsSquaresParallel4(testArray1);
sumsSquaresParallel4(testArray2);
sumsSquaresParallel4(testArray3);
sumsSquaresParallel4(testArray4);
ready
8x Parallel
sumsSquaresParallel8(testArray1);
sumsSquaresParallel8(testArray2);
sumsSquaresParallel8(testArray3);
sumsSquaresParallel8(testArray4);
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.