F64Kernels
The vector-vector routines as a backend half, alongside F64Blas and F64Decompositions. Implementations must agree with F64PlatformKernels to within rounding and read nothing outside the (offset, length) window.
To within rounding rather than exactly, because bit-for-bit is not a contract these routines can hold: F64PlatformKernels itself fuses its multiply-add above one lane width and does not below it, and reduces over lanes as a tree rather than in order. Two conforming implementations can differ in the last bits of a sum, and the reference routines are written not to depend on which one they got.
A length of zero is legal everywhere and does nothing: the triangular and Householder kernels reach the last row with an empty tail, so every routine here is called that way.
Inheritors
Properties
minDispatchLength
The run length from which this backend replaces the compiled-in kernels, or null for the platform default.
Whether this backend can do work on this host. koblas's own implementations always can, so the default is true; a binding reports whether the library it calls resolved.
Whether this is koblas's own implementation rather than a binding to a host library. The compiled-in SIMD kernels are portable however fast they are; only something calling out counts as accelerated.
Relative preference among the backends offered for one half (F64Blas, F64Decompositions, F64Kernels or a sparse counterpart). registerBackend picks the highest; the portable reference is 0.
Functions
asum
axpy
Adds alpha * x(xOff + i) into y(yOff + i) over the first len entries.
dot
Sum of a(aOff + i) * b(bOff + i) over the first len entries; 0 for an empty run.
dot4
Four dots against a shared right operand. For r in 0..3, out(outOff + r) is the dot of the run at aOff + r * stride with the run at bOff. Defaults to four dot calls, so an implementation that can read the shared operand once for all four should override it.
nrm2
scale
swap
Exchange the two runs (BLAS dswap). Two loads and two stores an element, so an implementation is bound by memory rather than by issue rate; the default is the plain loop for that reason.
symvColumn
Adds mult * a(k) into y and returns the dot of the same run with x, in one pass. A symmetric product needs both halves of every column, and one pass reads the column once rather than twice.
symvColumn4
Four symvColumn runs at aOff + r * stride, their dots landing in out(r). Defaults to four calls, so an implementation that can read x and y once for all four should override it.