30template <ComputeData InputType = std::vector<Kakshya::DataVariant>,
31 ComputeData OutputType = InputType>
63 const auto& dependency_params = safe_variant_get_or_throw<DependencyParams>(ctx.
parameters,
64 "GpuExecutionContext: DEPENDENCY mode requires DependencyParams");
70 error<std::runtime_error>(
73 std::source_location::current(),
74 "GpuExecutionContext: GPU initialisation failed");
117 const std::type_index native_type = [&]() -> std::type_index {
118 if constexpr (std::is_same_v<
119 std::decay_t<
decltype(
input.data)>,
120 std::shared_ptr<Kakshya::SignalSourceContainer>>) {
122 return input.data->value_element_type();
123 }
else if constexpr (std::is_same_v<
124 std::decay_t<
decltype(
input.data)>,
125 std::vector<Kakshya::DataVariant>>) {
126 if (!
input.data.empty())
129 return typeid(double);
132 const bool is_native_non_double = native_type ==
typeid(float) || native_type ==
typeid(uint8_t) || native_type ==
typeid(uint16_t) || native_type ==
typeid(uint32_t);
134 if (is_native_non_double) {
135 if constexpr (std::is_same_v<
136 std::decay_t<
decltype(
input.data)>,
137 std::vector<Kakshya::DataVariant>>) {
139 }
else if constexpr (std::is_same_v<
140 std::decay_t<
decltype(
input.data)>,
141 std::shared_ptr<Kakshya::SignalSourceContainer>>) {
144 return { {}, std::move(info) };
150 std::vector<std::vector<double>> channels(spans.size());
151 for (
size_t c = 0; c < spans.size(); ++c)
152 channels[c].assign(spans[c].begin(), spans[c].end());
153 return { std::move(channels), std::move(double_info) };
174 const std::vector<std::vector<double>>& channels,
180 const bool is_native_non_double = ot == std::type_index(
typeid(std::vector<float>)) || ot == std::type_index(
typeid(std::vector<uint8_t>)) || ot == std::type_index(
typeid(std::vector<uint16_t>)) || ot == std::type_index(
typeid(std::vector<uint32_t>));
182 if (is_native_non_double) {
186 std::vector<uint8_t> raw_bytes(allocated);
189 auto native_variant = OperationHelper::reconstruct_from_double<Kakshya::DataVariant>(
190 { std::vector<double>(allocated /
sizeof(
double), 0.0) },
192 std::visit([&](
auto& vec) {
193 using V =
typename std::decay_t<
decltype(vec)>::value_type;
194 vec.resize(allocated /
sizeof(V));
195 std::memcpy(vec.data(), raw_bytes.data(), allocated);
199 if constexpr (std::is_same_v<OutputType, std::vector<Kakshya::DataVariant>>) {
200 result.
data = { std::move(native_variant) };
201 }
else if constexpr (std::is_same_v<OutputType, Kakshya::DataVariant>) {
202 result.
data = std::move(native_variant);
205 for (
const auto& [idx, bytes] : raw.
aux)
206 result.
metadata[
"gpu_output_" + std::to_string(idx)] = bytes;
210 const size_t total = std::accumulate(channels.begin(), channels.end(),
size_t { 0 },
211 [](
size_t s,
const auto& ch) { return s + ch.size(); });
212 if (!raw.
primary.empty() && !channels.empty() && raw.
primary.size() >= total) {
214 std::vector<std::vector<double>> result_ch(channels.size());
215 for (
size_t c = 0; c < channels.size(); ++c) {
216 result_ch[c].resize(channels[c].size());
217 for (
size_t i = 0; i < channels[c].size(); ++i)
218 result_ch[c][i] =
static_cast<double>(raw.
primary[
offset++]);
221 OperationHelper::reconstruct_from_double<OutputType>(result_ch, structure_info));
223 for (
const auto& [idx, bytes] : raw.
aux)
224 result.
metadata[
"gpu_output_" + std::to_string(idx)] = bytes;
Core::GlobalInputConfig input
Zero-copy typed view over one frame of container storage.
GpuResourceManager m_resources
void download_binding(size_t index, void *dest, size_t byte_size)
Read back a specific binding into a caller-provided destination.
const std::string & dispatch_key() const
The key used for this context's GpuResourceManager unit.
void flatten_native_variants_to_staging(const std::vector< Kakshya::DataVariant > &variants, const DataStructureInfo &structure_info)
Flatten native-typed DataVariant channels into m_native_staging_bytes without any conversion.
GpuChannelResult dispatch_core(const std::vector< std::vector< double > > &channels, const DataStructureInfo &structure_info)
Full single-pass dispatch.
bool ensure_gpu_ready()
Ensure GPU resources are initialised.
void dispatch_core_dependency(const std::vector< DependencyStage > &stages)
Multi-pipeline dependency dispatch.
GpuChannelResult dispatch_core_chained(const std::vector< std::vector< double > > &channels, const DataStructureInfo &structure_info, const ExecutionContext &ctx)
Multi-pass (chained) dispatch.
GpuChannelResult dispatch_core_chained_indirect(const std::vector< std::vector< double > > &channels, const DataStructureInfo &structure_info, const ExecutionContext &ctx)
Multi-pass dispatch where a GPU-resident indirect buffer gates each pass's workgroup count instead of...
size_t find_first_output_index() const
Non-template base that owns all type-independent GPU dispatch logic.
GpuExecutionContext(GpuComputeConfig config)
GpuExecutionContext & operator=(const GpuExecutionContext &)=delete
virtual output_type execute(const input_type &input, const ExecutionContext &ctx)
Dispatch to GPU and reconstruct a typed output Datum.
GpuExecutionContext(const GpuExecutionContext &)=delete
virtual output_type collect_gpu_outputs(const GpuChannelResult &raw, const std::vector< std::vector< double > > &channels, const DataStructureInfo &structure_info)
Reconstruct Datum<OutputType> from a GpuChannelResult.
GpuExecutionContext(GpuExecutionContext &&)=delete
~GpuExecutionContext() override=default
GpuExecutionContext & operator=(GpuExecutionContext &&)=delete
virtual std::pair< std::vector< std::vector< double > >, DataStructureInfo > extract_inputs(const input_type &input)
Extract channel data and structure metadata from the input Datum.
Type-parameterised shell over GpuDispatchCore.
size_t buffer_allocated_bytes(const std::string &key, size_t index) const
static DataStructureInfo get_structure_info(T &compute_data)
Populate DataStructureInfo from a Datum without extracting spans.
static Kakshya::DataSpanVariant extract_native_data(const Kakshya::DataVariant &variant)
Extract a single DataVariant as a type-erased span without conversion.
static std::tuple< std::vector< std::span< double > >, DataStructureInfo > extract_structured_double(T &compute_data)
Extract structured double data from Datum container or direct ComputeData with automatic container ha...
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Yantra
DSP algorithms, computational units, matrix operations, Grammar.
@ CHAINED
Part of a sequential chain.
@ DEPENDENCY
Part of dependency graph.
@ CHAINED_INDIRECT
Chained dispatch where a GPU-written indirect buffer gates each pass's workgroup count.
Plain-data description of the compute shader to dispatch.
std::type_index original_type
Metadata about data structure for reconstruction.
T data
The actual computation data.
std::unordered_map< std::string, std::any > metadata
Associated metadata.
Input/Output container for computation pipeline data flow with structure preservation.
ExecutionMode mode
Execution mode controlling scheduling behavior.
ExecutionParams parameters
Optional parameters specific to the execution mode.
Context information controlling how a compute operation executes.
std::unordered_map< size_t, std::vector< uint8_t > > aux
std::vector< float > primary
Erased output of a GPU dispatch: reconstructed float data plus any raw auxiliary outputs keyed by bin...