Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
linalg/backends/direct_gemm/contract.hpp
Go to the documentation of this file.
1#pragma once
2
15
16#include <concepts>
17#include <string_view>
18#include <type_traits>
19#include <utility>
20
21namespace uni20::linalg
22{
23
29template <KernelBackendSelector GemmSelector> struct DirectGemmContractionBackend
30{
31 static constexpr std::string_view name = "direct_gemm_contraction";
32
33 GemmSelector gemm_selector;
34};
35
36template <class GemmSelector>
38
39namespace detail::direct_gemm_contraction_backend
40{
41
42template <class GemmSelector, class OutputMdspec, class Scalar, class LhsMdspec, class RhsMdspec>
43consteval bool gemm_dispatch_types_compatible()
44{
48 return requires(GemmSelector const& selector, output_matrix& output, Scalar alpha, lhs_matrix& lhs, rhs_matrix& rhs) {
49 try_dispatch_kernel(selector, gemm_op{}, output, alpha, lhs, rhs, alpha);
50 };
51}
52
53} // namespace detail::direct_gemm_contraction_backend
54
56template <
57 class GemmSelector, std::size_t LhsRank, std::size_t RhsRank, std::size_t ContractedRank,
58 MutableRankedContractionMdspecLike<ContractionAxes<LhsRank, RhsRank, ContractedRank>::output_rank> OutputMdspec,
59 uni20::Scalar Scalar, RankedContractionMdspecLike<LhsRank> LhsMdspec,
60 RankedContractionMdspecLike<RhsRank> RhsMdspec>
62 contract_op<LhsRank, RhsRank, ContractedRank> const&, OutputMdspec&, Scalar const&,
63 LhsMdspec&, RhsMdspec&, Scalar const&)
64{
65 if constexpr (detail::direct_gemm_contraction_backend::gemm_dispatch_types_compatible<GemmSelector, OutputMdspec,
66 Scalar, LhsMdspec, RhsMdspec>())
67 return kernel_types_maybe;
68 else
69 return kernel_types_no;
70}
71
73template <
74 class GemmSelector, std::size_t LhsRank, std::size_t RhsRank, std::size_t ContractedRank,
75 MutableRankedContractionMdspecLike<ContractionAxes<LhsRank, RhsRank, ContractedRank>::output_rank> OutputMdspec,
76 uni20::Scalar Scalar, RankedContractionMdspecLike<LhsRank> LhsMdspec,
77 RankedContractionMdspecLike<RhsRank> RhsMdspec>
78 requires(detail::direct_gemm_contraction_backend::gemm_dispatch_types_compatible<GemmSelector, OutputMdspec, Scalar,
79 LhsMdspec, RhsMdspec>())
81 contract_op<LhsRank, RhsRank, ContractedRank> const& operation, OutputMdspec& output,
82 Scalar alpha, LhsMdspec& lhs, RhsMdspec& rhs, Scalar beta)
83{
84 auto plan = try_make_direct_contraction_gemm_plan(output, lhs, rhs, operation.axes);
85 if (!plan) return KernelAttempt::unsupported_layout;
86
87 auto output_matrix = make_contraction_matrix_mdspec(output, plan->output);
88 auto lhs_matrix = make_contraction_matrix_mdspec(lhs, plan->lhs);
89 auto rhs_matrix = make_contraction_matrix_mdspec(rhs, plan->rhs);
90 if (!try_dispatch_kernel(backend.gemm_selector, gemm_op{}, output_matrix, alpha, lhs_matrix, rhs_matrix, beta))
93}
94
95} // namespace uni20::linalg
Ordered backend selector values shared by tensor storage and linalg dispatch.
Concept for numeric scalar types (integer, real, or complex).
Definition scalar_concepts.hpp:81
Stride grouping and direct-GEMM projections for tensor contraction.
Operation-tag backend dispatch over tensor-view operands.
Fixed-output Tensor GEMM front end.
Definition linalg/async.hpp:28
auto make_contraction_matrix_mdspec(Mdspec &span, ContractionMatrixProjection const &projection) -> contraction_matrix_mdspec_t< Mdspec >
Project an mdspec into one rank-two GEMM operand without acquiring its handle.
Definition contraction_strides.hpp:367
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
bool try_dispatch_kernel(BackendSelector &&selector, Op op, Args &&... args)
Normalize a selector and try each eligible backend until one performs the operation.
Definition dispatch.hpp:348
typename detail::contraction_strides::ContractionMatrixMdspec< std::remove_cvref_t< Mdspec > >::type contraction_matrix_mdspec_t
Rank-two strided metadata type retaining an operand descriptor or immediate handle.
Definition contraction_strides.hpp:342
auto try_make_direct_contraction_gemm_plan(OutputMdspec const &output, LhsMdspec const &lhs, RhsMdspec const &rhs, ContractionAxes< LhsRank, RhsRank, ContractedRank > const &axes) -> std::optional< DirectContractionGemmPlan >
Try to collapse merged contraction groups to three rank-two GEMM operands.
Definition contraction_strides.hpp:227
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
mpreal beta(mpreal const &a, mpreal const &x)
Real Beta function; positive rational/integer pairs retain exact values.
Definition mpreal_special.hpp:164
Backend-independent operation values used with normalized kernel operands.
Contract directly through one GEMM selected from a retained execution selector.
Definition linalg/backends/direct_gemm/contract.hpp:30
GemmSelector gemm_selector
Definition linalg/backends/direct_gemm/contract.hpp:33
static constexpr std::string_view name
Definition linalg/backends/direct_gemm/contract.hpp:31
Fixed-output pairwise tensor contraction operation.
Definition operation_tags.hpp:98
Fixed-output dense matrix multiplication operation tag.
Definition operation_tags.hpp:84