Skip to content

Latest commit

 

History

History
291 lines (186 loc) · 8.71 KB

File metadata and controls

291 lines (186 loc) · 8.71 KB

snansumkbn

Calculate the sum of single-precision floating-point strided array elements, ignoring NaN values and using an improved Kahan–Babuška algorithm.

Usage

var snansumkbn = require( '@stdlib/blas/ext/base/wasm/snansumkbn' );

snansumkbn.main( N, x, strideX )

Computes the sum of single-precision floating-point strided array elements, ignoring NaN values and using an improved Kahan–Babuška algorithm.

var Float32Array = require( '@stdlib/array/float32' );

var x = new Float32Array( [ 1.0, -2.0, NaN, 2.0 ] );

var v = snansumkbn.main( x.length, x, 1 );
// returns 1.0

The function has the following parameters:

  • N: number of indexed elements.
  • x: input Float32Array.
  • strideX: stride length for x.

The N and stride parameters determine which elements in the strided arrays are accessed at runtime. For example, to compute the sum of every other element in x,

var Float32Array = require( '@stdlib/array/float32' );

var x = new Float32Array( [ 1.0, 2.0, NaN, -7.0, NaN, 3.0, 4.0, 2.0 ] );

var sum = snansumkbn.main( 4, x, 2 );
// returns 5.0

Note that indexing is relative to the first index. To introduce an offset, use typed array views.

var Float32Array = require( '@stdlib/array/float32' );

var x0 = new Float32Array( [ 2.0, 1.0, NaN, -2.0, -2.0, 2.0, 3.0, 4.0 ] );
var x1 = new Float32Array( x0.buffer, x0.BYTES_PER_ELEMENT*1 ); // start at 2nd element

var v = snansumkbn.main( 4, x1, 2 );
// returns 5.0

snansumkbn.ndarray( N, x, strideX, offsetX )

Computes the sum of single-precision floating-point strided array elements, ignoring NaN values and using an improved Kahan–Babuška algorithm indexing semantics.

var Float32Array = require( '@stdlib/array/float32' );

var x = new Float32Array( [ 1.0, -2.0, NaN, 2.0 ] );

var v = snansumkbn.ndarray( x.length, x, 1, 0 );
// returns 1.0

The function has the following additional parameters:

  • offsetX: starting index for x.

While typed array views mandate a view offset based on the underlying buffer, the offset parameter supports indexing semantics based on a starting index. For example, to calculate the sum of every other element starting from the second element:

var Float32Array = require( '@stdlib/array/float32' );

var x = new Float32Array( [ 2.0, 1.0, NaN, -2.0, -2.0, 2.0, 3.0, 4.0 ] );

var v = snansumkbn.ndarray( 4, x, 2, 1 );
// returns 5.0

Module

snansumkbn.Module( memory )

Returns a new WebAssembly module wrapper instance which uses the provided WebAssembly memory instance as its underlying memory.

var Memory = require( '@stdlib/wasm/memory' );

// Create a new memory instance with an initial size of 10 pages (640KiB) and a maximum size of 100 pages (6.4MiB):
var mem = new Memory({
    'initial': 10,
    'maximum': 100
});

// Create a BLAS routine:
var mod = new snansumkbn.Module( mem );
// returns <Module>

// Initialize the routine:
mod.initializeSync();

snansumkbn.Module.prototype.main( N, xp, sx )

Computes the sum of single-precision floating-point strided array elements, ignoring NaN values and using an improved Kahan–Babuška algorithm.

var Memory = require( '@stdlib/wasm/memory' );
var oneTo = require( '@stdlib/array/one-to' );
var zeros = require( '@stdlib/array/zeros' );

// Create a new memory instance with an initial size of 10 pages (640KiB) and a maximum size of 100 pages (6.4MiB):
var mem = new Memory({
    'initial': 10,
    'maximum': 100
});

// Create a BLAS routine:
var mod = new snansumkbn.Module( mem );
// returns <Module>

// Initialize the routine:
mod.initializeSync();

// Define a vector data type:
var dtype = 'float32';

// Specify a vector length:
var N = 3;

// Define a pointer (i.e., byte offset) for storing the input vector:
var xptr = 0;

// Write vector values to module memory:
mod.write( xptr, oneTo( N, dtype ) );

// Perform computation:
var v = mod.main( N, xptr, 1 );
// returns 6.0

The function has the following parameters:

  • N: number of indexed elements.
  • xp: input Float32Array pointer (i.e., byte offset).
  • sx: stride length for x.

snansumkbn.Module.prototype.ndarray( N, xp, sx, ox )

Computes the sum of single-precision floating-point strided array elements, ignoring NaN values and using an improved Kahan–Babuška algorithm and alternative indexing semantics.

var Memory = require( '@stdlib/wasm/memory' );
var oneTo = require( '@stdlib/array/one-to' );
var zeros = require( '@stdlib/array/zeros' );

// Create a new memory instance with an initial size of 10 pages (640KiB) and a maximum size of 100 pages (6.4MiB):
var mem = new Memory({
    'initial': 10,
    'maximum': 100
});

// Create a BLAS routine:
var mod = new snansumkbn.Module( mem );
// returns <Module>

// Initialize the routine:
mod.initializeSync();

// Define a vector data type:
var dtype = 'float32';

// Specify a vector length:
var N = 3;

// Define a pointer (i.e., byte offset) for storing the input vector:
var xptr = 0;

// Write vector values to module memory:
mod.write( xptr, oneTo( N, dtype ) );

// Perform computation:
var sum = mod.ndarray( N, xptr, 1, 0 );
// returns 6.0

The function has the following additional parameters:

  • ox: starting index for x.

Notes

  • If N <= 0, both main and ndarray methods return 0.0.
  • This package implements routines using WebAssembly. When provided arrays which are not allocated on a snansumkbn module memory instance, data must be explicitly copied to module memory prior to computation. Data movement may entail a performance cost, and, thus, if you are using arrays external to module memory, you should prefer using @stdlib/blas/ext/base/snansumkbn. However, if working with arrays which are allocated and explicitly managed on module memory, you can achieve better performance when compared to the pure JavaScript implementations found in @stdlib/blas/ext/base/snansumkbn. Beware that such performance gains may come at the cost of additional complexity when having to perform manual memory management. Choosing between implementations depends heavily on the particular needs and constraints of your application, with no one choice universally better than the other.

Examples

var discreteUniform = require( '@stdlib/random/array/discrete-uniform' );
var snansumkbn = require( '@stdlib/blas/ext/base/wasm/snansumkbn' );

var opts = {
    'dtype': 'float32'
};
var x = discreteUniform( 10, 0, 100, opts );
console.log( x );

var v = snansumkbn.ndarray( x.length, x, 1, 0 );
console.log( v );