30template <ComputeData InputType = std::vector<Kakshya::DataVariant>,
31 ComputeData OutputType = InputType>
62 if (!ensure_gpu_ready()) {
63 error<std::runtime_error>(
64 Journal::Component::Yantra,
65 Journal::Context::BufferProcessing,
66 std::source_location::current(),
67 "GpuExecutionContext: GPU initialisation failed");
70 auto [ch_copies, structure_info] = extract_inputs(input);
73 ? dispatch_core_chained(ch_copies, structure_info, ctx)
74 : dispatch_core(ch_copies, structure_info);
76 return collect_gpu_outputs(raw, ch_copies, structure_info);
92 auto [spans, structure_info] = OperationHelper::extract_structured_double(
95 std::vector<std::vector<double>> channels(spans.size());
96 for (
size_t c = 0; c < spans.size(); ++c)
97 channels[c].assign(spans[c].begin(), spans[c].end());
99 return { std::move(channels), std::move(structure_info) };
118 const std::vector<std::vector<double>>& channels,
123 const size_t total_ch_elements = std::accumulate(
124 channels.begin(), channels.end(),
size_t { 0 },
125 [](
size_t s,
const auto& ch) { return s + ch.size(); });
127 if (!raw.
primary.empty() && !channels.empty()
128 && raw.
primary.size() >= total_ch_elements) {
130 std::vector<std::vector<double>> result_ch(channels.size());
131 for (
size_t c = 0; c < channels.size(); ++c) {
132 result_ch[c].resize(channels[c].
size());
133 for (
size_t i = 0; i < channels[c].size(); ++i)
134 result_ch[c][i] =
static_cast<double>(raw.
primary[offset++]);
137 OperationHelper::reconstruct_from_double<OutputType>(result_ch, structure_info));
140 for (
const auto& [idx, bytes] : raw.
aux)
141 result.
metadata[
"gpu_output_" + std::to_string(idx)] = bytes;
Non-template base that owns all type-independent GPU dispatch logic.
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(GpuShaderConfig config)
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 double channels and structure metadata from the input Datum.
Type-parameterised shell over GpuDispatchCore.
Metadata about data structure for reconstruction.
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.
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...
Plain-data description of the compute shader to dispatch.