Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
linalg/backends/blas/binary80.hpp
Go to the documentation of this file.
1#pragma once
2
9
10namespace uni20::linalg
11{
12
14template <MutableRankedMdspecLike<2> C, mplapack_binary80_detail::Binary80Scalar S, RankedMdspecLike<2> A,
15 RankedMdspecLike<2> B>
16 requires HostWritableMdspec<C> && HostReadableMdspec<A> && HostReadableMdspec<B> &&
17 std::same_as<typename C::value_type, S> && std::same_as<typename A::value_type, S> &&
18 std::same_as<typename B::value_type, S>
19consteval auto kernel_accepts_types(BlasBackend, gemm_op const&, C&, S const&, A&, B&, S const&)
20{
21 return kernel_types_maybe;
22}
23
25template <MutableRankedMdspecLike<2> C, mplapack_binary80_detail::Binary80Scalar S, RankedMdspecLike<2> A,
26 RankedMdspecLike<2> B>
28 std::same_as<typename C::value_type, S> && std::same_as<typename A::value_type, S> &&
29 std::same_as<typename B::value_type, S>
30KernelAttempt try_kernel(BlasBackend, gemm_op const&, C& c, S const& alpha, A& a, B& b, S const& beta)
31{
32 ERROR_IF(a.extent(1) != b.extent(0) || c.extent(0) != a.extent(0) || c.extent(1) != b.extent(1),
33 "GEMM operand shapes do not agree");
34 if (c.extent(0) == 0 || c.extent(1) == 0) return KernelAttempt::success;
38 auto cs = ca.mdspan();
39 auto as = aa.mdspan();
40 auto bs = ba.mdspan();
41 auto av = mplapack_binary80_detail::pack(as, alpha != S{0} && a.extent(1) != 0);
42 auto bv = mplapack_binary80_detail::pack(bs, alpha != S{0} && a.extent(1) != 0);
43 auto cv = mplapack_binary80_detail::pack(cs, beta != S{0});
44 mplapack::gemm(a.extent(0), b.extent(1), a.extent(1), alpha, mplapack_binary80_detail::values(av),
45 mplapack_binary80_detail::values(bv), beta, mplapack_binary80_detail::values(cv));
46 mplapack_binary80_detail::unpack(cv, cs);
48}
49
51template <MutableRankedTensorView<2> C, mplapack_binary80_detail::Binary80Scalar S, RankedMdspecLike<2> A,
52 RankedMdspecLike<2> B>
54 std::same_as<tensor_element_t<C>, S> && std::same_as<typename A::value_type, S> &&
55 std::same_as<typename B::value_type, S>
56consteval auto kernel_accepts_types(BlasBackend, assign_product_op const&, C&, S const&, A&, B&)
57{
58 return kernel_types_yes;
59}
60
62template <MutableRankedTensorView<2> C, mplapack_binary80_detail::Binary80Scalar S, RankedMdspecLike<2> A,
63 RankedMdspecLike<2> B>
65 std::same_as<tensor_element_t<C>, S> && std::same_as<typename A::value_type, S> &&
66 std::same_as<typename B::value_type, S>
67KernelAttempt try_kernel(BlasBackend backend, assign_product_op const&, C& c, S const& alpha, A& a, B& b)
68{
69 auto shape = detail::matrix_product_shape(a, b);
70 prepare_output(c, shape);
71 auto out = mdspec_of(c);
72 return try_kernel(backend, gemm_op{}, out, alpha, a, b, S{});
73}
74
76template <MutableRankedTensorView<2> C, mplapack_binary80_detail::Binary80Scalar S, RankedMdspecLike<2> A,
77 RankedMdspecLike<2> B>
79 std::same_as<tensor_element_t<C>, S> && std::same_as<typename A::value_type, S> &&
80 std::same_as<typename B::value_type, S>
82{
83 return kernel_types_yes;
84}
85
87template <MutableRankedTensorView<2> C, mplapack_binary80_detail::Binary80Scalar S, RankedMdspecLike<2> A,
88 RankedMdspecLike<2> B>
90 std::same_as<tensor_element_t<C>, S> && std::same_as<typename A::value_type, S> &&
91 std::same_as<typename B::value_type, S>
93 S const& alpha, A& a, B& b)
94{
95 auto& output = prepare_output(storage, detail::matrix_product_shape(a, b));
96 auto out = mdspec_of(output);
97 return try_kernel(backend, gemm_op{}, out, alpha, a, b, S{});
98}
99
100} // namespace uni20::linalg
RAII leases that resolve device descriptors and tensor views to mdspans.
Binary80 scalar eligibility and logical host packing for BLAS/LAPACK adapters.
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
Operation-tag backend dispatch over tensor-view operands.
Backend-independent dense matrix-product shape validation.
Definition cli.cpp:6
auto pack(Span const &span, bool read=true)
Definition binary80_common.hpp:23
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
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
void gemm(std::size_t m, std::size_t n, std::size_t k, float80 const &alpha, std::span< float80 const > a, std::span< float80 const > b, float80 const &beta, std::span< float80 > c)
Packed column-major binary80 GEMM; provider representations stay private.
Definition binary80.cpp:193
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
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-independent operation values used with normalized kernel operands.
Backend family for BLAS dense linalg kernels, including MPLAPACK scalar adapters.
Definition backend_selector.hpp:27
Replaceable-output dense matrix product operation tag.
Definition operation_tags.hpp:75
Fixed-output dense matrix multiplication operation tag.
Definition operation_tags.hpp:84
Shape preparation contracts for tensor operation outputs.
#define ERROR_IF(cond,...)
Definition trace.hpp:389