Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
Classes | Enumerations | Functions
uni20::linalg::blas Namespace Reference

Classes

struct  BlasReadableMatrix
 Readable matrix shape plus transform as seen by a BLAS provider. More...
 
struct  BlasReadableVector
 Readable vector shape as seen by a BLAS provider. More...
 
struct  BlasWritableMatrix
 Writable matrix shape as seen by a BLAS/LAPACK provider. More...
 
struct  BlasWritableVector
 Writable vector shape as seen by a BLAS provider. More...
 
struct  MdspanMatrixMetadata
 Handle-independent matrix metadata used for BLAS eligibility checks. More...
 
struct  MdspanMatrixStage
 Logical mdspan matrix layout before provider-specific BLAS lowering. More...
 
struct  MdspanVectorStage
 Logical rank-one mdspan layout before provider-specific BLAS lowering. More...
 

Enumerations

enum class  MatrixTransform : unsigned { normal = 0U , transpose = 1U , conjugate = 2U , conjugate_transpose = 3U }
 Logical matrix transform independent of a provider-specific opcode, although it happens to coincide with the OpenBLAS cblas ordering. More...
 

Functions

template<class Scalar , class Handle >
constexpr auto blas_readable_matrix (MdspanMatrixStage< Scalar, Handle > const &stage) -> BlasReadableMatrix< Scalar, Handle >
 Return the provider-ready readable operand for a staged mdspan matrix.
 
template<class Scalar , class Handle >
constexpr auto blas_readable_vector (MdspanVectorStage< Scalar, Handle > const &stage) -> BlasReadableVector< Scalar, Handle >
 Return the provider-ready readable storage operand for a staged mdspan vector.
 
template<uni20::BlasScalar Scalar>
constexpr char blas_trans_char (MatrixTransform transform)
 Lower a transform to the BLAS transpose character spelling used by selected providers.
 
template<uni20::BlasScalar Scalar>
constexpr bool blas_trans_char_is_supported (MatrixTransform transform)
 Return whether the current baseline provider path accepts a transform directly.
 
template<class Scalar , class Handle >
constexpr auto blas_writable_matrix (MdspanMatrixStage< Scalar, Handle > const &stage) -> BlasWritableMatrix< Scalar, Handle >
 Return the provider-ready writable operand for a staged mdspan matrix.
 
template<class Scalar , class Handle >
constexpr auto blas_writable_vector (MdspanVectorStage< Scalar, Handle > const &stage) -> BlasWritableVector< Scalar, Handle >
 Return the provider-ready writable operand for a staged mdspan vector.
 
template<uni20::BlasScalar Scalar>
constexpr MatrixTransform canonical_transform_for_scalar (MatrixTransform transform)
 Collapse conjugation-only distinctions for real scalar types.
 
constexpr MatrixTransform compose (MatrixTransform outer, MatrixTransform inner)
 Compose two matrix transforms as outer(inner(A)).
 
constexpr bool conjugates_values (MatrixTransform transform)
 Return whether a matrix transform applies element-wise conjugation.
 
template<uni20::BlasScalar Scalar, class OutputMdspan , class LhsMdspan , class RhsMdspan >
requires detail::writable_blas_mdspan_for<std::remove_cvref_t<OutputMdspan>, Scalar> && detail::readable_blas_mdspan_for<std::remove_cvref_t<LhsMdspan>, Scalar> && detail::readable_blas_mdspan_for<std::remove_cvref_t<RhsMdspan>, Scalar>
void gemm (OutputMdspan &&output, Scalar alpha, LhsMdspan &&lhs, RhsMdspan &&rhs, Scalar beta)
 Direct no-copy BLAS GEMM from mdspan-like operands.
 
template<uni20::BlasScalar Scalar, class OutputMdspan , class MatrixMdspan , class InputMdspan >
requires detail::writable_gemv_vector_for<std::remove_cvref_t<OutputMdspan>, Scalar> && detail::readable_gemv_mdspan_for<std::remove_cvref_t<MatrixMdspan>, Scalar, 2> && detail::readable_gemv_mdspan_for<std::remove_cvref_t<InputMdspan>, Scalar, 1>
void gemv (OutputMdspan &&output, Scalar alpha, MatrixMdspan &&matrix, InputMdspan &&input, Scalar beta)
 Direct no-copy BLAS GEMV from mdspan-like operands.
 
template<uni20::BlasScalar Scalar, class OutputMdspan , class LhsMdspan , class RhsMdspan >
requires detail::writable_blas_mdspec_for<std::remove_cvref_t<OutputMdspan>, Scalar> && detail::readable_blas_mdspec_for<std::remove_cvref_t<LhsMdspan>, Scalar> && detail::readable_blas_mdspec_for<std::remove_cvref_t<RhsMdspan>, Scalar>
KernelAttempt probe_gemm (OutputMdspan &&output, LhsMdspan &&lhs, RhsMdspan &&rhs)
 Probe direct no-copy BLAS GEMM without invoking the provider.
 
constexpr MatrixTransform storage_transform (MdspanMatrixMetadata const &metadata)
 Transform from the provider matrix shape to the logical mdspan shape.
 
template<class Scalar , class Handle >
constexpr MatrixTransform storage_transform (MdspanMatrixStage< Scalar, Handle > const &stage)
 Transform from the provider matrix shape to the logical mdspan shape.
 
constexpr bool swaps_axes (MatrixTransform transform)
 Return whether a matrix transform swaps the logical axes.
 
constexpr blas_int transformed_cols (blas_int rows, blas_int cols, MatrixTransform transform)
 Columns produced by applying transform to an untransformed matrix.
 
constexpr blas_int transformed_rows (blas_int rows, blas_int cols, MatrixTransform transform)
 Rows produced by applying transform to an untransformed matrix.
 
constexpr MatrixTransform transpose_result_transform (MatrixTransform transform)
 Transform induced on each GEMM operand by transposing the result.
 
template<class Mdspan >
requires detail::blas_readable_mdspan<Mdspan, 2>
auto try_blas_readable_matrix (Mdspan const &span) -> std::optional< BlasReadableMatrix< std::remove_cv_t< typename Mdspan::element_type >, typename Mdspan::data_handle_type > >
 Try to lower an mdspan directly to a readable provider operand.
 
template<class Mdspan >
requires detail::blas_readable_mdspan<Mdspan, 1>
auto try_blas_readable_vector (Mdspan const &span) -> std::optional< BlasReadableVector< std::remove_cv_t< typename Mdspan::element_type >, typename Mdspan::data_handle_type > >
 Try to lower a readable rank-one mdspan directly to a provider operand.
 
template<class Mdspan >
requires detail::blas_writable_mdspan<Mdspan, 2>
auto try_blas_writable_matrix (Mdspan const &span) -> std::optional< BlasWritableMatrix< std::remove_cv_t< typename Mdspan::element_type >, typename Mdspan::data_handle_type > >
 Try to lower a mutable mdspan directly to a writable provider operand.
 
template<class Mdspan >
requires detail::blas_writable_mdspan<Mdspan, 1>
auto try_blas_writable_vector (Mdspan const &span) -> std::optional< BlasWritableVector< std::remove_cv_t< typename Mdspan::element_type >, typename Mdspan::data_handle_type > >
 Try to lower a mutable rank-one mdspan directly to a writable provider operand.
 
template<uni20::BlasScalar Scalar, class OutputMdspan , class LhsMdspan , class RhsMdspan >
requires detail::writable_blas_mdspan_for<std::remove_cvref_t<OutputMdspan>, Scalar> && detail::readable_blas_mdspan_for<std::remove_cvref_t<LhsMdspan>, Scalar> && detail::readable_blas_mdspan_for<std::remove_cvref_t<RhsMdspan>, Scalar>
KernelAttempt try_gemm (OutputMdspan &&output, Scalar alpha, LhsMdspan &&lhs, RhsMdspan &&rhs, Scalar beta)
 Try a direct no-copy BLAS GEMM from mdspan-like operands.
 
template<uni20::BlasScalar Scalar, class OutputMdspan , class MatrixMdspan , class InputMdspan >
requires detail::writable_gemv_vector_for<std::remove_cvref_t<OutputMdspan>, Scalar> && detail::readable_gemv_mdspan_for<std::remove_cvref_t<MatrixMdspan>, Scalar, 2> && detail::readable_gemv_mdspan_for<std::remove_cvref_t<InputMdspan>, Scalar, 1>
KernelAttempt try_gemv (OutputMdspan &&output, Scalar alpha, MatrixMdspan &&matrix, InputMdspan &&input, Scalar beta)
 Try a direct no-copy BLAS GEMV from mdspan-like operands.
 
template<detail::lapack_writable_mdspan Mdspan>
auto try_lapack_writable_matrix (Mdspan const &span) -> std::optional< BlasWritableMatrix< std::remove_cv_t< typename Mdspan::element_type >, typename Mdspan::data_handle_type > >
 Try to lower an mdspan to the strict column-major shape expected by LAPACK.
 
template<detail::lapack_writable_vector_mdspan Mdspan>
auto try_lapack_writable_vector (Mdspan const &span) -> std::optional< BlasWritableVector< std::remove_cv_t< typename Mdspan::element_type >, typename Mdspan::data_handle_type > >
 Try to lower an mdspan to the contiguous writable vector shape expected by LAPACK.
 
template<uni20::RankedStridedMdspecLike< 2 > Mdspan>
auto try_mdspan_matrix_metadata (Mdspan const &span) -> std::optional< MdspanMatrixMetadata >
 Inspect matrix layout and accessor semantics without resolving a data handle.
 
template<uni20::RankedStridedMdspecLike< 2 > Mdspan>
auto try_mdspan_matrix_stage (Mdspan const &span) -> std::optional< MdspanMatrixStage< std::remove_cv_t< typename Mdspan::element_type >, detail::span_data_t< Mdspan > > >
 Build a matrix staging descriptor when direct provider lowering is possible.
 
template<uni20::RankedStridedMdspanLike< 1 > Mdspan>
auto try_mdspan_vector_stage (Mdspan const &span) -> std::optional< MdspanVectorStage< std::remove_cv_t< typename Mdspan::element_type >, typename Mdspan::data_handle_type > >
 Build an mdspan vector staging descriptor when direct BLAS lowering is possible.
 

Enumeration Type Documentation

◆ MatrixTransform

enum class uni20::linalg::blas::MatrixTransform : unsigned
strong

Logical matrix transform independent of a provider-specific opcode, although it happens to coincide with the OpenBLAS cblas ordering.

The underlying values are the two-bit transpose/conjugate mask in N, T, R, C order.

Enumerator
normal 
transpose 
conjugate 
conjugate_transpose 

Function Documentation

◆ blas_readable_matrix()

template<class Scalar , class Handle >
constexpr auto uni20::linalg::blas::blas_readable_matrix ( MdspanMatrixStage< Scalar, Handle > const &  stage) -> BlasReadableMatrix<Scalar, Handle>
constexpr

Return the provider-ready readable operand for a staged mdspan matrix.

◆ blas_readable_vector()

template<class Scalar , class Handle >
constexpr auto uni20::linalg::blas::blas_readable_vector ( MdspanVectorStage< Scalar, Handle > const &  stage) -> BlasReadableVector<Scalar, Handle>
constexpr

Return the provider-ready readable storage operand for a staged mdspan vector.

Precondition
The staged accessor does not apply conjugation, which portable BLAS vector operands cannot represent.

◆ blas_trans_char()

template<uni20::BlasScalar Scalar>
constexpr char uni20::linalg::blas::blas_trans_char ( MatrixTransform  transform)
constexpr

Lower a transform to the BLAS transpose character spelling used by selected providers.

◆ blas_trans_char_is_supported()

template<uni20::BlasScalar Scalar>
constexpr bool uni20::linalg::blas::blas_trans_char_is_supported ( MatrixTransform  transform)
constexpr

Return whether the current baseline provider path accepts a transform directly.

◆ blas_writable_matrix()

template<class Scalar , class Handle >
constexpr auto uni20::linalg::blas::blas_writable_matrix ( MdspanMatrixStage< Scalar, Handle > const &  stage) -> BlasWritableMatrix<Scalar, Handle>
constexpr

Return the provider-ready writable operand for a staged mdspan matrix.

◆ blas_writable_vector()

template<class Scalar , class Handle >
constexpr auto uni20::linalg::blas::blas_writable_vector ( MdspanVectorStage< Scalar, Handle > const &  stage) -> BlasWritableVector<Scalar, Handle>
constexpr

Return the provider-ready writable operand for a staged mdspan vector.

Precondition
The staged accessor does not apply conjugation.

◆ canonical_transform_for_scalar()

template<uni20::BlasScalar Scalar>
constexpr MatrixTransform uni20::linalg::blas::canonical_transform_for_scalar ( MatrixTransform  transform)
constexpr

Collapse conjugation-only distinctions for real scalar types.

◆ compose()

constexpr MatrixTransform uni20::linalg::blas::compose ( MatrixTransform  outer,
MatrixTransform  inner 
)
constexpr

Compose two matrix transforms as outer(inner(A)).

◆ conjugates_values()

constexpr bool uni20::linalg::blas::conjugates_values ( MatrixTransform  transform)
constexpr

Return whether a matrix transform applies element-wise conjugation.

◆ gemm()

template<uni20::BlasScalar Scalar, class OutputMdspan , class LhsMdspan , class RhsMdspan >
requires detail::writable_blas_mdspan_for<std::remove_cvref_t<OutputMdspan>, Scalar> && detail::readable_blas_mdspan_for<std::remove_cvref_t<LhsMdspan>, Scalar> && detail::readable_blas_mdspan_for<std::remove_cvref_t<RhsMdspan>, Scalar>
void uni20::linalg::blas::gemm ( OutputMdspan &&  output,
Scalar  alpha,
LhsMdspan &&  lhs,
RhsMdspan &&  rhs,
Scalar  beta 
)

Direct no-copy BLAS GEMM from mdspan-like operands.

◆ gemv()

template<uni20::BlasScalar Scalar, class OutputMdspan , class MatrixMdspan , class InputMdspan >
requires detail::writable_gemv_vector_for<std::remove_cvref_t<OutputMdspan>, Scalar> && detail::readable_gemv_mdspan_for<std::remove_cvref_t<MatrixMdspan>, Scalar, 2> && detail::readable_gemv_mdspan_for<std::remove_cvref_t<InputMdspan>, Scalar, 1>
void uni20::linalg::blas::gemv ( OutputMdspan &&  output,
Scalar  alpha,
MatrixMdspan &&  matrix,
InputMdspan &&  input,
Scalar  beta 
)

Direct no-copy BLAS GEMV from mdspan-like operands.

◆ probe_gemm()

template<uni20::BlasScalar Scalar, class OutputMdspan , class LhsMdspan , class RhsMdspan >
requires detail::writable_blas_mdspec_for<std::remove_cvref_t<OutputMdspan>, Scalar> && detail::readable_blas_mdspec_for<std::remove_cvref_t<LhsMdspan>, Scalar> && detail::readable_blas_mdspec_for<std::remove_cvref_t<RhsMdspan>, Scalar>
KernelAttempt uni20::linalg::blas::probe_gemm ( OutputMdspan &&  output,
LhsMdspan &&  lhs,
RhsMdspan &&  rhs 
)

Probe direct no-copy BLAS GEMM without invoking the provider.

This performs the same instance, layout, and transform checks as try_gemm using normalized descriptor metadata. It does not acquire data handles or read or write matrix elements.

Returns
success, unsupported_instance, unsupported_layout, or unsupported_transform.

◆ storage_transform() [1/2]

constexpr MatrixTransform uni20::linalg::blas::storage_transform ( MdspanMatrixMetadata const &  metadata)
constexpr

Transform from the provider matrix shape to the logical mdspan shape.

◆ storage_transform() [2/2]

template<class Scalar , class Handle >
constexpr MatrixTransform uni20::linalg::blas::storage_transform ( MdspanMatrixStage< Scalar, Handle > const &  stage)
constexpr

Transform from the provider matrix shape to the logical mdspan shape.

◆ swaps_axes()

constexpr bool uni20::linalg::blas::swaps_axes ( MatrixTransform  transform)
constexpr

Return whether a matrix transform swaps the logical axes.

◆ transformed_cols()

constexpr blas_int uni20::linalg::blas::transformed_cols ( blas_int  rows,
blas_int  cols,
MatrixTransform  transform 
)
constexpr

Columns produced by applying transform to an untransformed matrix.

◆ transformed_rows()

constexpr blas_int uni20::linalg::blas::transformed_rows ( blas_int  rows,
blas_int  cols,
MatrixTransform  transform 
)
constexpr

Rows produced by applying transform to an untransformed matrix.

◆ transpose_result_transform()

constexpr MatrixTransform uni20::linalg::blas::transpose_result_transform ( MatrixTransform  transform)
constexpr

Transform induced on each GEMM operand by transposing the result.

◆ try_blas_readable_matrix()

template<class Mdspan >
requires detail::blas_readable_mdspan<Mdspan, 2>
auto uni20::linalg::blas::try_blas_readable_matrix ( Mdspan const &  span) -> std::optional< BlasReadableMatrix<std::remove_cv_t<typename Mdspan::element_type>, typename Mdspan::data_handle_type>>

Try to lower an mdspan directly to a readable provider operand.

◆ try_blas_readable_vector()

template<class Mdspan >
requires detail::blas_readable_mdspan<Mdspan, 1>
auto uni20::linalg::blas::try_blas_readable_vector ( Mdspan const &  span) -> std::optional< BlasReadableVector<std::remove_cv_t<typename Mdspan::element_type>, typename Mdspan::data_handle_type>>

Try to lower a readable rank-one mdspan directly to a provider operand.

◆ try_blas_writable_matrix()

template<class Mdspan >
requires detail::blas_writable_mdspan<Mdspan, 2>
auto uni20::linalg::blas::try_blas_writable_matrix ( Mdspan const &  span) -> std::optional< BlasWritableMatrix<std::remove_cv_t<typename Mdspan::element_type>, typename Mdspan::data_handle_type>>

Try to lower a mutable mdspan directly to a writable provider operand.

◆ try_blas_writable_vector()

template<class Mdspan >
requires detail::blas_writable_mdspan<Mdspan, 1>
auto uni20::linalg::blas::try_blas_writable_vector ( Mdspan const &  span) -> std::optional< BlasWritableVector<std::remove_cv_t<typename Mdspan::element_type>, typename Mdspan::data_handle_type>>

Try to lower a mutable rank-one mdspan directly to a writable provider operand.

◆ try_gemm()

template<uni20::BlasScalar Scalar, class OutputMdspan , class LhsMdspan , class RhsMdspan >
requires detail::writable_blas_mdspan_for<std::remove_cvref_t<OutputMdspan>, Scalar> && detail::readable_blas_mdspan_for<std::remove_cvref_t<LhsMdspan>, Scalar> && detail::readable_blas_mdspan_for<std::remove_cvref_t<RhsMdspan>, Scalar>
KernelAttempt uni20::linalg::blas::try_gemm ( OutputMdspan &&  output,
Scalar  alpha,
LhsMdspan &&  lhs,
RhsMdspan &&  rhs,
Scalar  beta 
)

Try a direct no-copy BLAS GEMM from mdspan-like operands.

Returns
success, unsupported_instance, unsupported_layout, or unsupported_transform.

◆ try_gemv()

template<uni20::BlasScalar Scalar, class OutputMdspan , class MatrixMdspan , class InputMdspan >
requires detail::writable_gemv_vector_for<std::remove_cvref_t<OutputMdspan>, Scalar> && detail::readable_gemv_mdspan_for<std::remove_cvref_t<MatrixMdspan>, Scalar, 2> && detail::readable_gemv_mdspan_for<std::remove_cvref_t<InputMdspan>, Scalar, 1>
KernelAttempt uni20::linalg::blas::try_gemv ( OutputMdspan &&  output,
Scalar  alpha,
MatrixMdspan &&  matrix,
InputMdspan &&  input,
Scalar  beta 
)

Try a direct no-copy BLAS GEMV from mdspan-like operands.

Returns
success, unsupported_layout, or unsupported_transform.

◆ try_lapack_writable_matrix()

template<detail::lapack_writable_mdspan Mdspan>
auto uni20::linalg::blas::try_lapack_writable_matrix ( Mdspan const &  span) -> std::optional< BlasWritableMatrix<std::remove_cv_t<typename Mdspan::element_type>, typename Mdspan::data_handle_type>>

Try to lower an mdspan to the strict column-major shape expected by LAPACK.

◆ try_lapack_writable_vector()

template<detail::lapack_writable_vector_mdspan Mdspan>
auto uni20::linalg::blas::try_lapack_writable_vector ( Mdspan const &  span) -> std::optional< BlasWritableVector<std::remove_cv_t<typename Mdspan::element_type>, typename Mdspan::data_handle_type>>

Try to lower an mdspan to the contiguous writable vector shape expected by LAPACK.

◆ try_mdspan_matrix_metadata()

template<uni20::RankedStridedMdspecLike< 2 > Mdspan>
auto uni20::linalg::blas::try_mdspan_matrix_metadata ( Mdspan const &  span) -> std::optional<MdspanMatrixMetadata>

Inspect matrix layout and accessor semantics without resolving a data handle.

◆ try_mdspan_matrix_stage()

template<uni20::RankedStridedMdspecLike< 2 > Mdspan>
auto uni20::linalg::blas::try_mdspan_matrix_stage ( Mdspan const &  span) -> std::optional<MdspanMatrixStage<std::remove_cv_t<typename Mdspan::element_type>, detail::span_data_t<Mdspan>>>

Build a matrix staging descriptor when direct provider lowering is possible.

◆ try_mdspan_vector_stage()

template<uni20::RankedStridedMdspanLike< 1 > Mdspan>
auto uni20::linalg::blas::try_mdspan_vector_stage ( Mdspan const &  span) -> std::optional< MdspanVectorStage<std::remove_cv_t<typename Mdspan::element_type>, typename Mdspan::data_handle_type>>

Build an mdspan vector staging descriptor when direct BLAS lowering is possible.