26template <
class OutputMdspan,
class LhsMdspan,
class RhsMdspan>
30template <
class OutputMdspan,
class Scalar,
class LhsMdspan,
class RhsMdspan>
31consteval bool cpu_gemm_mdspan_types_compatible()
39template <
class OutputTensor,
class LhsMdspan,
class RhsMdspan>
40concept HostAssignProductAccess =
41 HostGemmMdspanAccess<std::remove_cvref_t<decltype(uni20::mdspec_of(std::declval<OutputTensor&>()))>, LhsMdspan,
44template <
class OutputTensor,
class Scalar,
class LhsMdspan,
class RhsMdspan>
45consteval bool cpu_assign_product_types_compatible()
47 using output_span = std::remove_cvref_t<decltype(uni20::mdspec_of(std::declval<OutputTensor&>()))>;
48 return cpu_gemm_mdspan_types_compatible<output_span, Scalar, LhsMdspan, RhsMdspan>();
51template <uni20::MutableRankedMdspecLike<2> OutputMdspan, uni20::Scalar Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
52 uni20::RankedMdspecLike<2> RhsMdspan>
53 requires HostGemmMdspanAccess<OutputMdspan, LhsMdspan, RhsMdspan>
54KernelAttempt try_cpu_gemm(OutputMdspan& output, Scalar alpha, LhsMdspan& lhs, RhsMdspan& rhs, Scalar
beta)
59 auto output_span = output_access.mdspan();
60 auto lhs_span = lhs_access.mdspan();
61 auto rhs_span = rhs_access.mdspan();
68template <uni20::MutableRankedMdspecLike<2> OutputMdspan, uni20::Scalar Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
69 uni20::RankedMdspecLike<2> RhsMdspan>
70 requires detail::HostGemmMdspanAccess<OutputMdspan, LhsMdspan, RhsMdspan>
72 LhsMdspan&, RhsMdspan&,
Scalar const&)
74 if constexpr (!has_runtime_precision_v<Scalar> &&
75 detail::cpu_gemm_mdspan_types_compatible<OutputMdspan, Scalar, LhsMdspan, RhsMdspan>())
82template <uni20::MutableRankedMdspecLike<2> OutputMdspan, uni20::Scalar Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
83 uni20::RankedMdspecLike<2> RhsMdspan>
84 requires detail::HostGemmMdspanAccess<OutputMdspan, LhsMdspan, RhsMdspan>
88 return detail::try_cpu_gemm(output, alpha, lhs, rhs,
beta);
94template <MutableRankedMdspecLike<2> C, Scalar S, RankedMdspecLike<2> A, RankedMdspecLike<2> B>
95 requires has_runtime_precision_v<S> && detail::HostGemmMdspanAccess<C, A, B>
98 if constexpr (detail::cpu_gemm_mdspan_types_compatible<C, S, A, B>())
107template <MutableRankedMdspecLike<2> C, Scalar S, RankedMdspecLike<2> A, RankedMdspecLike<2> B>
108 requires has_runtime_precision_v<S> && detail::HostGemmMdspanAccess<C, A, B>
113 return detail::try_cpu_gemm(
c, alpha, a, b,
beta);
118template <uni20::MutableRankedTensorView<2> OutputTensor, uni20::Scalar Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
119 uni20::RankedMdspecLike<2> RhsMdspan>
120 requires detail::HostAssignProductAccess<OutputTensor, LhsMdspan, RhsMdspan>
122 LhsMdspan&, RhsMdspan&)
124 if constexpr (!has_runtime_precision_v<Scalar> &&
125 detail::cpu_assign_product_types_compatible<OutputTensor, Scalar, LhsMdspan, RhsMdspan>())
132template <uni20::MutableRankedTensorView<2> OutputTensor, uni20::Scalar Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
133 uni20::RankedMdspecLike<2> RhsMdspan>
134 requires detail::HostAssignProductAccess<OutputTensor, LhsMdspan, RhsMdspan>
136 LhsMdspan& lhs, RhsMdspan& rhs)
138 auto const shape = detail::matrix_product_shape(lhs, rhs);
141 return detail::try_cpu_gemm(output_span, alpha, lhs, rhs,
Scalar{});
145template <uni20::MutableRankedTensorView<2> OutputTensor, uni20::Scalar Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
146 uni20::RankedMdspecLike<2> RhsMdspan>
147 requires detail::HostAssignProductAccess<OutputTensor, LhsMdspan, RhsMdspan>
151 if constexpr (!has_runtime_precision_v<Scalar> &&
152 detail::cpu_assign_product_types_compatible<OutputTensor, Scalar, LhsMdspan, RhsMdspan>())
159template <uni20::MutableRankedTensorView<2> OutputTensor, uni20::Scalar Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
160 uni20::RankedMdspecLike<2> RhsMdspan>
161 requires detail::HostAssignProductAccess<OutputTensor, LhsMdspan, RhsMdspan>
166 auto const shape = detail::matrix_product_shape(lhs, rhs);
169 return detail::try_cpu_gemm(output_span, alpha, lhs, rhs,
Scalar{});
RAII leases that resolve device descriptors and tensor views to mdspans.
Exact arithmetic or an explicit binary working precision.
Definition core/precision.hpp:13
A lightweight, thread-safe, reference-counted storage for a single object.
Definition shared_storage.hpp:94
Mdspec metadata supporting host read acquisition.
Definition access.hpp:688
Mutable mdspec metadata supporting host write acquisition.
Definition access.hpp:694
Concept for numeric scalar types (integer, real, or complex).
Definition scalar_concepts.hpp:81
Report whether resolved mdspans support reference CPU GEMM expressions.
Definition linalg/cpu/gemm.hpp:22
Operation-tag backend dispatch over tensor-view operands.
Accessor-respecting reference CPU GEMM for resolved mdspans.
Backend-independent dense matrix-product shape validation.
void gemm(OutputMdspan &&output, Scalar alpha, LhsMdspan &&lhs, RhsMdspan &&rhs, Scalar beta)
Execute reference CPU GEMM on resolved mdspans.
Definition linalg/cpu/gemm.hpp:41
Definition linalg/async.hpp:28
KernelAttempt try_kernel(BlasBackend, gemm_op const &, C &c, S const &alpha, A &a, B &b, S const &beta)
Pack logical host values and execute GEMM through value-preserving provider conversion.
Definition linalg/backends/blas/binary80.hpp:30
KernelAttempt
Result of one runtime kernel backend attempt.
Definition kernel_attempt.hpp:27
constexpr KernelAcceptance< KernelTypeAcceptance::no > kernel_types_no
Report that a backend rejects the argument types.
Definition dispatch_error.hpp:34
consteval auto kernel_accepts_types(BlasBackend, gemm_op const &, C &, S const &, A &, B &, S const &)
Accept host-readable native binary80 operands, including transforming accessors.
Definition linalg/backends/blas/binary80.hpp:19
constexpr KernelAcceptance< KernelTypeAcceptance::maybe > kernel_types_maybe
Report that runtime operand values determine backend acceptance.
Definition dispatch_error.hpp:37
constexpr KernelAcceptance< KernelTypeAcceptance::yes > kernel_types_yes
Report that a backend accepts every instance of the argument types.
Definition dispatch_error.hpp:40
Definition data_table.cpp:8
std::remove_cvref_t< decltype(std::declval< detail::host_read_mdspan_lease_t< Mdspec > & >().mdspan())> host_read_mdspan_t
Read-only mdspan type resolved by host descriptor acquisition.
Definition access.hpp:679
Output & prepare_output(Output &output, RequiredExtents const &required)
Prepare a mutable tensor output with the specified shape.
Definition tensor/output.hpp:104
auto acquire_host_read_access_sync(Mdspan const &mdspan)
Acquire a directly host-accessible read-only mdspan.
Definition access.hpp:616
std::remove_cvref_t< decltype(std::declval< detail::host_write_mdspan_lease_t< Mdspec > & >().mdspan())> host_write_mdspan_t
Writable mdspan type resolved by host descriptor acquisition.
Definition access.hpp:684
constexpr decltype(auto) mdspec_of(Tensor &tensor) noexcept(noexcept(tensor.mdspec()))
Return a tensor's immediate or descriptor-backed multidimensional metadata.
Definition tensor/concepts.hpp:50
mpreal beta(mpreal const &a, mpreal const &x)
Real Beta function; positive rational/integer pairs retain exact values.
Definition mpreal_special.hpp:164
auto acquire_host_write_access_sync(Mdspan &mdspan)
Acquire a directly host-accessible writable mdspan.
Definition access.hpp:626
Backend value for the reference host CPU dense linalg oracle.
Definition backend_selector.hpp:55
Replaceable-output dense matrix product operation tag.
Definition operation_tags.hpp:75
Fixed-output dense matrix multiplication operation tag.
Definition operation_tags.hpp:84
Concepts for tensor-level objects that resolve mdspan kernel operands.
Shape preparation contracts for tensor operation outputs.