Lux GPU Core 0.2.0
Lightweight plugin-based GPU acceleration for blockchain and ML
Loading...
Searching...
No Matches
kernel_loader.h
Go to the documentation of this file.
1// Copyright (c) 2024-2026 Lux Industries Inc.
2// SPDX-License-Identifier: BSD-3-Clause-Eco
3//
4// Kernel Loader - Generic GPU kernel loading and caching infrastructure
5//
6// Provides unified interface for loading GPU kernels from:
7// - Embedded strings (build-time compiled)
8// - Source files (runtime compiled)
9// - Binary blobs (pre-compiled .metallib, PTX, SPIR-V)
10//
11// Supports kernel variants keyed by (name, dtype, size) tuples.
12
13#ifndef LUX_GPU_KERNEL_LOADER_H
14#define LUX_GPU_KERNEL_LOADER_H
15
16#include <stddef.h>
17#include <stdint.h>
18#include <stdbool.h>
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24// =============================================================================
25// Kernel Types
26// =============================================================================
27
28typedef enum {
29 LUX_KERNEL_SOURCE_EMBEDDED = 0, // Embedded as string constant
30 LUX_KERNEL_SOURCE_FILE = 1, // Load from file path
31 LUX_KERNEL_SOURCE_BINARY = 2, // Pre-compiled binary blob
33
41
42// Kernel variant key for caching
43typedef struct {
44 const char* name; // Kernel function name
45 uint32_t dtype; // Data type (LuxDtype)
46 uint32_t size_hint; // Size variant (0 = default)
47 uint32_t flags; // Additional flags
49
50// Kernel source descriptor
51typedef struct {
54 const char* source; // Source string or file path
55 size_t source_len; // Length (0 = null-terminated)
56 const void* binary; // Binary data (for BINARY type)
57 size_t binary_len;
58 const char* entry_point; // Entry function name
59 const char* compile_opts; // Compiler options (nullable)
61
62// Opaque kernel handle
63typedef struct LuxKernel LuxKernel;
64
65// Kernel cache (opaque)
67
68// =============================================================================
69// Kernel Registry (embedded kernels)
70// =============================================================================
71
72// Embedded kernel entry (generated at build time)
73typedef struct {
74 const char* name; // Kernel family name (e.g., "binary_add")
75 const char* entry_point; // Entry function name
77 const char* source; // Embedded source string
78 size_t source_len;
79 const void* binary; // Pre-compiled binary (nullable)
80 size_t binary_len;
82
83// Registry of all embedded kernels (generated by CMake)
84typedef struct {
85 const char* backend; // "metal", "cuda", "webgpu"
87 size_t count;
89
90// Get embedded kernel registry for backend
91const LuxKernelRegistry* lux_kernel_registry_get(const char* backend);
92
93// Find kernel by name in registry
95 const LuxKernelRegistry* registry,
96 const char* name
97);
98
99// =============================================================================
100// Kernel Cache API
101// =============================================================================
102
103// Create kernel cache
105
106// Destroy kernel cache
108
109// Get cached kernel by variant
111 LuxKernelCache* cache,
112 const LuxKernelVariant* variant
113);
114
115// Store kernel in cache
117 LuxKernelCache* cache,
118 const LuxKernelVariant* variant,
119 LuxKernel* kernel
120);
121
122// Clear all cached kernels
124
125// Get cache statistics
127 LuxKernelCache* cache,
128 size_t* count,
129 size_t* memory_bytes
130);
131
132// =============================================================================
133// Kernel Loader API (backend-specific implementations)
134// =============================================================================
135
136// Compile kernel from source
138 void* device_context, // Backend-specific device
139 const LuxKernelSource* source
140);
141
142// Load kernel from binary
144 void* device_context,
145 const void* binary,
146 size_t binary_len,
147 const char* entry_point
148);
149
150// Destroy kernel
152
153// Get kernel entry point name
155
156// =============================================================================
157// Utility Macros for Embedded Kernels
158// =============================================================================
159
160// Declare embedded kernel (used in generated headers)
161#define LUX_DECLARE_KERNEL(name, lang) \
162 extern const char lux_kernel_##name##_source[]; \
163 extern const size_t lux_kernel_##name##_source_len;
164
165// Define embedded kernel source
166#define LUX_DEFINE_KERNEL(name, source_str) \
167 const char lux_kernel_##name##_source[] = source_str; \
168 const size_t lux_kernel_##name##_source_len = sizeof(lux_kernel_##name##_source) - 1;
169
170// Kernel registry entry
171#define LUX_KERNEL_ENTRY(name, entry, lang) \
172 { #name, entry, lang, lux_kernel_##name##_source, lux_kernel_##name##_source_len, NULL, 0 }
173
174// Binary kernel registry entry
175#define LUX_KERNEL_ENTRY_BINARY(name, entry, lang, bin, bin_len) \
176 { #name, entry, lang, NULL, 0, bin, bin_len }
177
178#ifdef __cplusplus
179}
180#endif
181
182#endif // LUX_GPU_KERNEL_LOADER_H
struct LuxKernelCache LuxKernelCache
const LuxEmbeddedKernel * lux_kernel_registry_find(const LuxKernelRegistry *registry, const char *name)
LuxKernel * lux_kernel_load_binary(void *device_context, const void *binary, size_t binary_len, const char *entry_point)
void lux_kernel_cache_clear(LuxKernelCache *cache)
void lux_kernel_cache_put(LuxKernelCache *cache, const LuxKernelVariant *variant, LuxKernel *kernel)
void lux_kernel_cache_stats(LuxKernelCache *cache, size_t *count, size_t *memory_bytes)
LuxKernelCache * lux_kernel_cache_create(void)
LuxKernel * lux_kernel_cache_get(LuxKernelCache *cache, const LuxKernelVariant *variant)
LuxKernel * lux_kernel_compile(void *device_context, const LuxKernelSource *source)
LuxKernelLanguage
@ LUX_KERNEL_LANG_CUDA
@ LUX_KERNEL_LANG_PTX
@ LUX_KERNEL_LANG_METAL
@ LUX_KERNEL_LANG_SPIRV
@ LUX_KERNEL_LANG_WGSL
struct LuxKernel LuxKernel
void lux_kernel_cache_destroy(LuxKernelCache *cache)
void lux_kernel_destroy(LuxKernel *kernel)
const char * lux_kernel_entry_point(LuxKernel *kernel)
LuxKernelSourceType
@ LUX_KERNEL_SOURCE_EMBEDDED
@ LUX_KERNEL_SOURCE_BINARY
@ LUX_KERNEL_SOURCE_FILE
const LuxKernelRegistry * lux_kernel_registry_get(const char *backend)
const char * name
LuxKernelLanguage lang
const char * source
const void * binary
const char * entry_point
const char * backend
const LuxEmbeddedKernel * kernels
const char * compile_opts
LuxKernelLanguage lang
LuxKernelSourceType type
const char * entry_point
const char * source
const void * binary
const char * name