GPUDevice from init()
'lower' to use the lower triangle, 'upper' to use the upper triangle
'no-transpose' to solve Ax=b, 'transpose' to solve A^Tx=b
'unit' to treat the diagonal as all-ones (A's diagonal is not read), 'non-unit' to read it
order of the matrix A (number of rows and columns)
Float32Array, row-major or column-major (see layout), at least (n-1)*lda+n elements
leading dimension of A (>= n either way — A is square)
Float32Array holding b on input, the solution on output; length at least (n-1)*incx+1
stride for x (must be a positive integer)
Optionallayout: "column-major" | "row-major"
storage layout of A (default: 'row-major'); column-major
flips both the stored triangle and the effective trans (the system
being solved stays what you asked for either way)
Solves the triangular system for $x$, in place: $$\mathrm{op}(A) x = b$$
x is kept resident on the GPU (mutated in place). A must be a GpuMatrix;
its own layout (set at GpuMatrix.from time) determines the operation —
there is no separate layout argument here.
import { init, cleanup } from "wgblas";
import { strsv } from "wgblas/strsv";
import { GpuVector } from "wgblas/classes/GpuVector";
import { GpuMatrix } from "wgblas/classes/GpuMatrix";
const device = await init();
// Solves A*x = b in place on the GPU: xGpu holds b going in, the solution out.
const n = 3;
const A = new Float32Array([2, 0, 0, 3, 4, 0, 5, 6, 8]);
const b = new Float32Array([2, 7, 19]);
const AGpu = GpuMatrix.from(A, n, n, n, "row-major");
const xGpu = GpuVector.from(b);
console.log("A (lower triangular) =");
console.table([A.slice(0, 3), A.slice(3, 6), A.slice(6, 9)]);
console.log("b =", b);
await strsv(
device,
"lower",
"no-transpose",
"non-unit",
n,
AGpu,
AGpu.lda,
xGpu,
1,
);
console.log("x (solves A*x = b) =", await xGpu.read()); // [1, 1, 1]
AGpu.destroy();
xGpu.destroy();
if (typeof process !== "undefined") cleanup();
GPUDevice from init()
'lower' to use the lower triangle, 'upper' to use the upper triangle
'no-transpose' to solve Ax=b, 'transpose' to solve A^Tx=b
'unit' to treat the diagonal as all-ones (A's diagonal is not read), 'non-unit' to read it
order of the matrix A
GpuMatrix, GPU-resident
leading dimension of A (must equal A.lda)
GpuVector holding b on input, the solution on output (mutated in place)
stride for x (must be a positive integer)
Solves the triangular system for $x$, in place — x holds b on input, the solution on output: $$\mathrm{op}(A) x = b$$
A is an n×n triangular matrix stored in row-major order. Only the triangle specified by
uplois referenced; the other triangle is not accessed.Browser (standalone HTML):