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");
66 if (dependency_params.async) {
77 error<std::runtime_error>(
80 std::source_location::current(),
81 "GpuExecutionContext: GPU initialisation failed");
124 const std::type_index native_type = [&]() -> std::type_index {
125 if constexpr (std::is_same_v<
126 std::decay_t<
decltype(
input.data)>,
127 std::shared_ptr<Kakshya::SignalSourceContainer>>) {
129 return input.data->value_element_type();
130 }
else if constexpr (std::is_same_v<
131 std::decay_t<
decltype(
input.data)>,
132 std::vector<Kakshya::DataVariant>>) {
133 if (!
input.data.empty())
136 return typeid(double);
139 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);
141 if (is_native_non_double) {
142 if constexpr (std::is_same_v<
143 std::decay_t<
decltype(
input.data)>,
144 std::vector<Kakshya::DataVariant>>) {
146 }
else if constexpr (std::is_same_v<
147 std::decay_t<
decltype(
input.data)>,
148 std::shared_ptr<Kakshya::SignalSourceContainer>>) {
151 return { {}, std::move(info) };
157 std::vector<std::vector<double>>
channels(spans.size());
158 for (
size_t c = 0; c < spans.size(); ++c)
159 channels[c].assign(spans[c].begin(), spans[c].end());
160 return { std::move(
channels), std::move(double_info) };
181 const std::vector<std::vector<double>>&
channels,
187 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>));
189 if (is_native_non_double) {
193 std::vector<uint8_t> raw_bytes(allocated);
196 auto native_variant = OperationHelper::reconstruct_from_double<Kakshya::DataVariant>(
197 { std::vector<double>(allocated /
sizeof(
double), 0.0) },
199 std::visit([&](
auto& vec) {
200 using V =
typename std::decay_t<
decltype(vec)>::value_type;
201 vec.resize(allocated /
sizeof(V));
202 std::memcpy(vec.data(), raw_bytes.data(), allocated);
206 if constexpr (std::is_same_v<OutputType, std::vector<Kakshya::DataVariant>>) {
207 result.
data = { std::move(native_variant) };
208 }
else if constexpr (std::is_same_v<OutputType, Kakshya::DataVariant>) {
209 result.
data = std::move(native_variant);
212 for (
const auto& [idx, bytes] : raw.
aux)
213 result.
metadata[
"gpu_output_" + std::to_string(idx)] = bytes;
218 [](
size_t s,
const auto& ch) { return s + ch.size(); });
221 std::vector<std::vector<double>> result_ch(
channels.size());
222 for (
size_t c = 0; c <
channels.size(); ++c) {
224 for (
size_t i = 0; i <
channels[c].size(); ++i)
225 result_ch[c][i] =
static_cast<double>(raw.
primary[
offset++]);
228 OperationHelper::reconstruct_from_double<OutputType>(result_ch, structure_info));
230 for (
const auto& [idx, bytes] : raw.
aux)
231 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.
Portal::Graphics::FenceID dispatch_core_dependency_async(const std::vector< DependencyStage > &stages)
Non-blocking variant of dispatch_core_dependency.
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 Kakshya::DataSpanVariant extract_native_data(const Kakshya::DataVariant &variant)
Extract a single DataVariant as a type-erased span without conversion.
static DataStructureInfo get_structure_info(const T &compute_data)
Populate DataStructureInfo from a Datum without extracting spans.
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
Dimensions, modality, source type, and optional Composite field schema.
T data
The actual computation data.
void set_metadata(const std::string &key, ValueType &&value)
Add or update metadata entry.
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...