Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
linalg/backends/looped_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 LoopedGemmContractionBackend
30{
31 static constexpr std::string_view name = "looped_gemm_contraction";
32
33 GemmSelector gemm_selector;
34};
35
36template <class GemmSelector>
38
39namespace detail::looped_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, OutputMdspec& output_source, LhsMdspec& lhs_source,
49 RhsMdspec& rhs_source, ContractionMatrixProjection const& projection, uni20::index_type offset,
50 output_matrix& output, Scalar alpha, lhs_matrix& lhs, rhs_matrix& rhs) {
51 { make_offset_contraction_matrix_mdspec(output_source, projection, offset) } -> std::same_as<output_matrix>;
52 { make_offset_contraction_matrix_mdspec(lhs_source, projection, offset) } -> std::same_as<lhs_matrix>;
53 { make_offset_contraction_matrix_mdspec(rhs_source, projection, offset) } -> std::same_as<rhs_matrix>;
54 try_dispatch_kernel(selector, gemm_op{}, output, alpha, lhs, rhs, alpha);
55 };
56}
57
58} // namespace detail::looped_gemm_contraction_backend
59
61template <
62 class GemmSelector, std::size_t LhsRank, std::size_t RhsRank, std::size_t ContractedRank,
63 MutableRankedContractionMdspecLike<ContractionAxes<LhsRank, RhsRank, ContractedRank>::output_rank> OutputMdspec,
64 uni20::Scalar Scalar, RankedContractionMdspecLike<LhsRank> LhsMdspec,
65 RankedContractionMdspecLike<RhsRank> RhsMdspec>
67 contract_op<LhsRank, RhsRank, ContractedRank> const&, OutputMdspec&, Scalar const&,
68 LhsMdspec&, RhsMdspec&, Scalar const&)
69{
70 if constexpr (detail::looped_gemm_contraction_backend::gemm_dispatch_types_compatible<GemmSelector, OutputMdspec,
71 Scalar, LhsMdspec, RhsMdspec>())
72 return kernel_types_maybe;
73 else
74 return kernel_types_no;
75}
76
83template <
84 class GemmSelector, std::size_t LhsRank, std::size_t RhsRank, std::size_t ContractedRank,
85 MutableRankedContractionMdspecLike<ContractionAxes<LhsRank, RhsRank, ContractedRank>::output_rank> OutputMdspec,
86 uni20::Scalar Scalar, RankedContractionMdspecLike<LhsRank> LhsMdspec,
87 RankedContractionMdspecLike<RhsRank> RhsMdspec>
88 requires(detail::looped_gemm_contraction_backend::gemm_dispatch_types_compatible<GemmSelector, OutputMdspec, Scalar,
89 LhsMdspec, RhsMdspec>())
91 contract_op<LhsRank, RhsRank, ContractedRank> const& operation, OutputMdspec& output,
92 Scalar alpha, LhsMdspec& lhs, RhsMdspec& rhs, Scalar beta)
93{
94 auto plan = try_make_looped_contraction_gemm_plan(output, lhs, rhs, operation.axes);
95 if (!plan) return KernelAttempt::unsupported_layout;
96 if (plan->loop_extent == 0) return KernelAttempt::success;
97
98 for (uni20::index_type index = 0; index < plan->loop_extent; ++index)
99 {
100 auto output_matrix =
101 make_offset_contraction_matrix_mdspec(output, plan->gemm.output, index * plan->output_offset_stride);
102 auto lhs_matrix = make_offset_contraction_matrix_mdspec(lhs, plan->gemm.lhs, index * plan->lhs_offset_stride);
103 auto rhs_matrix = make_offset_contraction_matrix_mdspec(rhs, plan->gemm.rhs, index * plan->rhs_offset_stride);
104 if (index == 0)
105 {
106 if (!try_dispatch_kernel(backend.gemm_selector, gemm_op{}, output_matrix, alpha, lhs_matrix, rhs_matrix, beta))
108 }
109 else
110 {
111 dispatch_kernel(backend.gemm_selector, gemm_op{}, output_matrix, alpha, lhs_matrix, rhs_matrix, beta);
112 }
113 }
115}
116
117} // 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
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
void dispatch_kernel(BackendSelector &&selector, Op op, Args &&... args)
Normalize a selector and dispatch or report that every eligible backend declined.
Definition dispatch.hpp:374
auto try_make_looped_contraction_gemm_plan(OutputMdspec const &output, LhsMdspec const &lhs, RhsMdspec const &rhs, ContractionAxes< LhsRank, RhsRank, ContractedRank > const &axes) -> std::optional< LoopedContractionGemmPlan >
Try to leave one residual M or N dimension around a GEMM projection.
Definition contraction_strides.hpp:256
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
auto make_offset_contraction_matrix_mdspec(Mdspec &span, ContractionMatrixProjection const &projection, uni20::index_type element_offset) -> offset_contraction_matrix_mdspec_t< Mdspec >
Project a rank-two mdspec slice at one nonnegative element offset.
Definition contraction_strides.hpp:390
typename detail::contraction_strides::OffsetContractionMatrixMdspec< std::remove_cvref_t< Mdspec > >::type offset_contraction_matrix_mdspec_t
Rank-two strided metadata type whose storage origin may be advanced.
Definition contraction_strides.hpp:347
std::ptrdiff_t index_type
Definition types.hpp:19
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.
Extents and strides for one rank-two projection of a contraction operand.
Definition contraction_strides.hpp:106
Contract through a loop of GEMMs selected from one retained execution selector.
Definition linalg/backends/looped_gemm/contract.hpp:30
static constexpr std::string_view name
Definition linalg/backends/looped_gemm/contract.hpp:31
GemmSelector gemm_selector
Definition linalg/backends/looped_gemm/contract.hpp:33
Fixed-output pairwise tensor contraction operation.
Definition operation_tags.hpp:98
Fixed-output dense matrix multiplication operation tag.
Definition operation_tags.hpp:84