elips/docs
Chapter XV · GPU

GPU engine architecture

GPU support is optional, compile-time-selectable, and entirely behind a port. Nothing in the planner mentions CUDA.

surfaceVault · seek / seek_hybriddomain code is backend-agnosticorchestrationGpuSelectorrank backendsGpuDeviceManagerenumerate devicesDynamicBatcherwindow_us · max_batchGpuMemoryManagerpool · pinnedinterface segregationGpuPortcompute · top_kGpuMemoryPortalloc · pinnedGpuKernelPortcos · l2 · dotGpuStreamPortsynchroniseGpuIndexPortbuild · searchbackends · indexesCUDANVIDIAHIP / ROCmAMDMetalApple unifiedBruteForce · IVFFlat · PQGraph · Hybrid · DistCAGRA · multi-GPUstd::expected — failure is expected
GpuPort + GpuMemoryPort + GpuKernelPort + GpuStreamPort + GpuIndexPort. Backends fulfill the contract.

The 13-method GpuPort (include/elips/gpu_engine/GpuPort.hpp)

cpp
class GpuPort {
public:
    [[nodiscard]] virtual std::expected<void, GpuError>
        initialize(const GpuConfig&) = 0;
    virtual void shutdown() noexcept = 0;

    [[nodiscard]] virtual GpuDeviceInfo device_info() const noexcept = 0;
    [[nodiscard]] virtual bool is_available() const noexcept = 0;

    [[nodiscard]] virtual std::expected<GpuBuffer, GpuError>
        allocate_device(size_t bytes) = 0;
    virtual void free_device(GpuBuffer&&) noexcept = 0;

    [[nodiscard]] virtual std::expected<void, GpuError>
        upload(const void*, GpuBuffer&, size_t) = 0;
    [[nodiscard]] virtual std::expected<void, GpuError>
        download(const GpuBuffer&, void*, size_t) = 0;

    [[nodiscard]] virtual std::expected<void, GpuError>
        compute_distances_batch(
            std::span<const float> queries, std::span<const float> db,
            std::span<float> out, size_t nq, size_t nb, size_t dim,
            elips::Metric) = 0;

    [[nodiscard]] virtual std::expected<void, GpuError>
        top_k(std::span<const float> distances,
              std::span<uint32_t> idx, std::span<float> val,
              size_t nq, size_t nb, size_t k) = 0;

    virtual void synchronize() = 0;
    [[nodiscard]] virtual bool is_idle() const noexcept = 0;
};

All operations return std::expected<T, GpuError>. The error enum: DeviceNotFound, InsufficientMemory, KernelLaunchFailed, TransferFailed, IndexBuildFailed, UnsupportedMetric, InitializationFailed, BackendUnavailable.