#pragma once #include #include #include #include #include namespace ling3 { struct GdnState { std::vector fp16; std::vector fp32; bool fp32_valid = false; }; struct GdnRunTimings { double stage_ms = 0.0; double npu_ms = 0.0; double collect_ms = 0.0; double total_ms = 0.0; }; class GdnStep { public: GdnStep( std::span heads6_model, std::span heads5_model); ~GdnStep(); GdnStep(const GdnStep &) = delete; GdnStep & operator=(const GdnStep &) = delete; GdnStep(GdnStep &&) noexcept; GdnStep & operator=(GdnStep &&) noexcept; void Reset(); GdnState SaveState(); void RestoreState(const GdnState & state); GdnRunTimings Run( std::span query, std::span key, std::span value, std::span decay, std::span beta, std::span output); GdnRunTimings RunBatch16( std::span query, std::span key, std::span value, std::span decay, std::span beta, std::span output); GdnRunTimings RunBatchCpu( std::span query, std::span key, std::span value, std::span decay, std::span beta, std::span output); bool has_batch16() const noexcept; std::size_t state_bytes() const noexcept; private: struct Impl; std::unique_ptr impl_; }; } // namespace ling3