Uni20
Asynchronous tensor and runtime library.
Loading...
Searching...
No Matches
lu_binary80.hpp
Go to the documentation of this file.
1#pragma once
2
8
9namespace uni20::linalg
10{
12template <MutableRankedMdspecLike<2> A>
13 requires HostWritableMdspec<A> && mplapack_binary80_detail::Binary80LuScalar<typename A::value_type>
14consteval auto kernel_accepts_types(LapackBackend, lu_factor_op const&, A&, std::span<std::size_t>, LuNorms<float80>*,
16{
17 return kernel_types_yes;
18}
19
21template <MutableRankedMdspecLike<2> A>
22 requires HostWritableMdspec<A> && mplapack_binary80_detail::Binary80LuScalar<typename A::value_type>
23KernelAttempt try_kernel(LapackBackend, lu_factor_op const&, A& a, std::span<std::size_t> pivots,
24 LuNorms<float80>* norms, SolveInfo& info, SolveOptions<float80> const& options)
25{
26 detail::require_lu_shape(a, pivots.size());
27 detail::require_solve_options(options);
28 auto access = acquire_host_write_access_sync(a);
29 auto s = access.mdspan();
30 info = {};
31 if (!detail::solve_matrix_is_finite(s))
32 {
33 info.status = SolveStatus::nonfinite_input;
35 }
36 auto work = mplapack_binary80_detail::pack(s);
37 detail::capture_lu_norms(work.mdspan(), norms, float80{0});
38 auto scale = detail::lu_input_scale(work.mdspan(), float80{0});
39 auto tolerance = options.relative_pivot_tolerance;
40 std::vector<std::size_t> provider_pivots;
41 auto singular = mplapack::getrf(pivots.size(), mplapack_binary80_detail::values(work), provider_pivots);
42 mplapack_binary80_detail::unpack(work, s);
43 std::copy(provider_pivots.begin(), provider_pivots.end(), pivots.begin());
44 if (!detail::solve_matrix_is_finite(work.mdspan()))
46 else if (singular)
47 info = {.status = SolveStatus::singular, .pivot = singular - 1};
48 else
49 detail::check_lu_diagonal(work.mdspan(), scale, tolerance, info);
51}
52
54template <RankedMdspecLike<2> A, MutableRankedMdspecLike<2> B>
56 mplapack_binary80_detail::Binary80LuScalar<typename A::value_type> &&
57 std::same_as<typename A::value_type, typename B::value_type>
58consteval auto kernel_accepts_types(LapackBackend, lu_solve_op const&, A&, std::span<std::size_t const>, B&, SolveInfo&)
59{
60 return kernel_types_yes;
61}
62
65template <RankedMdspecLike<2> A, MutableRankedMdspecLike<2> B>
67 mplapack_binary80_detail::Binary80LuScalar<typename A::value_type> &&
68 std::same_as<typename A::value_type, typename B::value_type>
69KernelAttempt try_kernel(LapackBackend, lu_solve_op const&, A& a, std::span<std::size_t const> pivots, B& b,
70 SolveInfo& info)
71{
72 detail::require_lu_solve_shape(a, pivots, b);
73 info = {};
74 if (a.extent(0) == 0 || b.extent(1) == 0) return KernelAttempt::success;
77 auto as = aa.mdspan();
78 auto bs = ba.mdspan();
79 if (!detail::solve_matrix_is_finite(bs))
80 {
81 info.status = SolveStatus::nonfinite_input;
83 }
86 mplapack::getrs(pivots.size(), b.extent(1), mplapack_binary80_detail::values(std::as_const(av)), pivots,
87 mplapack_binary80_detail::values(bv));
88 mplapack_binary80_detail::unpack(bv, bs);
89 if (!detail::solve_matrix_is_finite(bv.mdspan())) info.status = SolveStatus::nonfinite_result;
91}
92} // 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.
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.
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
@ nonfinite_input
An input coefficient or RHS component was nonfinite; both workspaces are preserved.
@ singular
An exactly zero elimination pivot was found.
@ nonfinite_result
A factor, solution, reduction, or required magnitude became nonfinite.
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::yes > kernel_types_yes
Report that a backend accepts every instance of the argument types.
Definition dispatch_error.hpp:40
std::size_t getrf(std::size_t n, std::span< float80 > a, std::vector< std::size_t > &pivots)
Factor a square binary80 matrix, returning zero or a one-based singular pivot.
Definition binary80.cpp:203
void getrs(std::size_t n, std::size_t nrhs, std::span< float80 const > a, std::span< std::size_t const > pivots, std::span< float80 > b)
Solve from read-only binary80 LU factors and zero-based pivots.
Definition binary80.cpp:213
auto acquire_host_read_access_sync(Mdspan const &mdspan)
Acquire a directly host-accessible read-only mdspan.
Definition access.hpp:616
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 configured dense LAPACK kernels, including MPLAPACK scalar adapters.
Definition backend_selector.hpp:20
Original matrix norms after conversion to factor precision.
Definition lu_info.hpp:20
Diagnostics written by a completed numerical attempt, independent of dispatch.
Definition solve_info.hpp:41
Real-scalar pivot policy for a square linear solve.
Definition solve_info.hpp:62
Real relative_pivot_tolerance
Reject nonzero pivots at or below this fraction of the original maximum entry magnitude.
Definition solve_info.hpp:64
Fixed-output packed LU factorization with zero-based row-swap pivots.
Definition operation_tags.hpp:165
Solve using read-only packed LU factors, overwriting an existing RHS.
Definition operation_tags.hpp:171
Multiply one element value by a retained scalar factor.
Definition elementwise_functions.hpp:68