21namespace detail::cublas_backend
26 return blas::detail::span_data(
span).buffer().device();
29[[nodiscard]]
inline bool product_output_is_empty(detail::matrix_product_extents
const& shape)
noexcept
31 return shape.extent(0) == 0 || shape.extent(1) == 0;
37template <uni20::MutableRankedMdspecLike<2> OutputMdspan,
class Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
38 uni20::RankedMdspecLike<2> RhsMdspan>
42 if constexpr (detail::cublas_backend::accepts_gemm_types<Scalar, OutputMdspan, LhsMdspan, RhsMdspan>())
49template <uni20::MutableRankedMdspecLike<2> OutputMdspan,
class Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
50 uni20::RankedMdspecLike<2> RhsMdspan>
54 return detail::cublas_backend::try_gemm(output, alpha, lhs, rhs,
beta);
58template <uni20::MutableRankedTensorView<2> OutputTensor,
class Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
59 uni20::RankedMdspecLike<2> RhsMdspan>
61 LhsMdspan&, RhsMdspan&)
63 using output_span = std::remove_cvref_t<decltype(uni20::mdspec_of(std::declval<OutputTensor&>()))>;
64 if constexpr (detail::cublas_backend::accepts_gemm_types<Scalar, output_span, LhsMdspan, RhsMdspan>())
71template <uni20::MutableRankedTensorView<2> OutputTensor,
class Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
72 uni20::RankedMdspecLike<2> RhsMdspan>
76 auto const shape = detail::matrix_product_shape(lhs, rhs);
77 bool const output_is_empty = detail::cublas_backend::product_output_is_empty(shape);
78 auto const lhs_device = detail::cublas_backend::span_device(lhs);
79 if (!output_is_empty && detail::cublas_backend::span_device(rhs) != lhs_device)
92 if (!output_is_empty && detail::cublas_backend::span_device(output_span) != lhs_device)
94 return detail::cublas_backend::try_gemm(output_span, alpha, lhs, rhs,
Scalar{});
98template <uni20::MutableRankedTensorView<2> OutputTensor,
class Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
99 uni20::RankedMdspecLike<2> RhsMdspan>
105 using output_span = std::remove_cvref_t<decltype(uni20::mdspec_of(std::declval<OutputTensor&>()))>;
106 if constexpr (detail::cublas_backend::accepts_gemm_types<Scalar, output_span, LhsMdspan, RhsMdspan>())
113template <uni20::MutableRankedTensorView<2> OutputTensor,
class Scalar, uni20::RankedMdspecLike<2> LhsMdspan,
114 uni20::RankedMdspecLike<2> RhsMdspan>
118 Scalar alpha, LhsMdspan& lhs, RhsMdspan& rhs)
120 auto const shape = detail::matrix_product_shape(lhs, rhs);
121 bool const output_is_empty = detail::cublas_backend::product_output_is_empty(shape);
122 auto const lhs_device = detail::cublas_backend::span_device(lhs);
123 if (!output_is_empty && detail::cublas_backend::span_device(rhs) != lhs_device)
128 return detail::cublas_backend::try_gemm(output_span, alpha, lhs, rhs,
Scalar{});
A lightweight, thread-safe, reference-counted storage for a single object.
Definition shared_storage.hpp:94
Validated CUDA device identity with cached immutable capabilities.
Definition device.hpp:105
Concept for numeric scalar types (integer, real, or complex).
Definition scalar_concepts.hpp:81
Operation-tag backend dispatch over tensor-view operands.
CUDA-mdspan preparation and buffer-ledger execution for CublasBackend GEMM.
Backend-independent dense matrix-product shape validation.
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
Output & prepare_output(Output &output, RequiredExtents const &required)
Prepare a mutable tensor output with the specified shape.
Definition tensor/output.hpp:104
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
constexpr bool tensor_extents_equal(LhsExtents const &lhs, RhsExtents const &rhs) noexcept
Compare two tensor extent objects by rank and per-axis extent.
Definition tensor/output.hpp:31
std::size_t span
Definition presentation.cpp:2017
Backend value for cuBLAS dense linalg kernels.
Definition backend_selector.hpp:34
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.