sgemm
Perform the matrix-matrix operation
C = α*op(A)*op(B) + β*C
whereop(X)
is one of theop(X) = X
, orop(X) = X^T
.
Usage
var sgemm = require( '@stdlib/blas/base/sgemm' );
sgemm( ord, ta, tb, M, N, K, α, A, lda, B, ldb, β, C, ldc )
Performs the matrix-matrix operation C = α*op(A)*op(B) + β*C
where op(X)
is either op(X) = X
or op(X) = X^T
, α
and β
are scalars, A
, B
, and C
are matrices, with op(A)
an M
by K
matrix, op(B)
a K
by N
matrix, and C
an M
by N
matrix.
var Float32Array = require( '@stdlib/array/float32' );
var A = new Float32Array( [ 1.0, 2.0, 3.0, 4.0 ] );
var B = new Float32Array( [ 1.0, 1.0, 0.0, 1.0 ] );
var C = new Float32Array( [ 1.0, 2.0, 3.0, 4.0 ] );
sgemm( 'row-major', 'no-transpose', 'no-transpose', 2, 2, 2, 1.0, A, 2, B, 2, 1.0, C, 2 );
// C => <Float32Array>[ 2.0, 5.0, 6.0, 11.0 ]
The function has the following parameters:
- ord: storage layout.
- ta: specifies whether
A
should be transposed, conjugate-transposed, or not transposed. - tb: specifies whether
B
should be transposed, conjugate-transposed, or not transposed. - M: number of rows in the matrix
op(A)
and in the matrixC
. - N: number of columns in the matrix
op(B)
and in the matrixC
. - K: number of columns in the matrix
op(A)
and number of rows in the matrixop(B)
. - α: scalar constant.
- A: first input matrix stored in linear memory as a
Float32Array
. - lda: stride of the first dimension of
A
(leading dimension ofA
). - B: second input matrix stored in linear memory as a
Float32Array
. - ldb: stride of the first dimension of
B
(leading dimension ofB
). - β: scalar constant
- C: third input matrix stored in linear memory as a
Float32Array
. - ldc: stride of the first dimension of
C
(leading dimension ofC
).
The stride parameters determine how elements in the input arrays are accessed at runtime. For example, to perform matrix multiplication of two subarrays
var Float32Array = require( '@stdlib/array/float32' );
var A = new Float32Array( [ 1.0, 2.0, 0.0, 0.0, 3.0, 4.0, 0.0, 0.0 ] );
var B = new Float32Array( [ 1.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0 ] );
var C = new Float32Array( [ 1.0, 2.0, 3.0, 4.0 ] );
sgemm( 'row-major', 'no-transpose', 'no-transpose', 2, 2, 2, 1.0, A, 4, B, 4, 1.0, C, 2 );
// C => <Float32Array>[ 2.0, 5.0, 6.0, 11.0 ]
sgemm.ndarray( ta, tb, M, N, K, α, A, sa1, sa2, oa, B, sb1, sb2, ob, β, C, sc1, sc2, oc )
Performs the matrix-matrix operation C = α*op(A)*op(B) + β*C
, using alternative indexing semantics and where op(X)
is either op(X) = X
or op(X) = X^T
, α
and β
are scalars, A
, B
, and C
are matrices, with op(A)
an M
by K
matrix, op(B)
a K
by N
matrix, and C
an M
by N
matrix.
var Float32Array = require( '@stdlib/array/float32' );
var A = new Float32Array( [ 1.0, 2.0, 3.0, 4.0 ] );
var B = new Float32Array( [ 1.0, 1.0, 0.0, 1.0 ] );
var C = new Float32Array( [ 1.0, 2.0, 3.0, 4.0 ] );
sgemm.ndarray( 'no-transpose', 'no-transpose', 2, 2, 2, 1.0, A, 2, 1, 0, B, 2, 1, 0, 1.0, C, 2, 1, 0 );
// C => <Float32Array>[ 2.0, 5.0, 6.0, 11.0 ]
The function has the following additional parameters:
- sa1: stride of the first dimension of
A
. - sa2: stride of the second dimension of
A
. - oa: starting index for
A
. - sb1: stride of the first dimension of
B
. - sb2: stride of the second dimension of
B
. - ob: starting index for
B
. - sc1: stride of the first dimension of
C
. - sc2: stride of the second dimension of
C
. - oc: starting index for
C
.
While typed array
views mandate a view offset based on the underlying buffer, the offset parameters support indexing semantics based on starting indices. For example,
var Float32Array = require( '@stdlib/array/float32' );
var A = new Float32Array( [ 0.0, 0.0, 1.0, 3.0, 2.0, 4.0 ] );
var B = new Float32Array( [ 0.0, 1.0, 0.0, 1.0, 1.0 ] );
var C = new Float32Array( [ 0.0, 0.0, 0.0, 1.0, 3.0, 2.0, 4.0 ] );
sgemm.ndarray( 'no-transpose', 'no-transpose', 2, 2, 2, 1.0, A, 1, 2, 2, B, 1, 2, 1, 1.0, C, 1, 2, 3 );
// C => <Float32Array>[ 0.0, 0.0, 0.0, 2.0, 6.0, 5.0, 11.0 ]
Notes
Examples
var discreteUniform = require( '@stdlib/random/array/discrete-uniform' );
var sgemm = require( '@stdlib/blas/base/sgemm' );
var opts = {
'dtype': 'float32'
};
var M = 3;
var N = 4;
var K = 2;
var A = discreteUniform( M*K, 0, 10, opts ); // 3x2
var B = discreteUniform( K*N, 0, 10, opts ); // 2x4
var C = discreteUniform( M*N, 0, 10, opts ); // 3x4
sgemm( 'row-major', 'no-transpose', 'no-transpose', M, N, K, 1.0, A, K, B, N, 1.0, C, N );
console.log( C );
sgemm.ndarray( 'no-transpose', 'no-transpose', M, N, K, 1.0, A, K, 1, 0, B, N, 1, 0, 1.0, C, N, 1, 0 );
console.log( C );
C APIs
Usage
#include "stdlib/blas/base/sgemm.h"
TODO
TODO.
TODO
TODO
TODO
Examples
TODO