sov-kernel-monster / rtx /src /cuda_kernels_orig.c
SNAPKITTYWEST's picture
chore: push full sov-kernel-monster content from local build
9425aed verified
Raw
History Blame Contribute Delete
6.71 kB
/* cuda_kernels.c β€” load PTX modules, wire all kernel dispatch
* Zero-CRT, zero-libc. Typedefs from cuda_driver_loader.c.
*/
typedef unsigned long long uint64_t;
typedef unsigned int uint32_t;
typedef int int32_t;
typedef unsigned long long CUdeviceptr;
typedef struct CUmod_st* CUmodule;
typedef struct CUfunc_st* CUfunction;
typedef struct CUstream_st* CUstream;
typedef int CUresult;
typedef unsigned long long SIZE_T;
#define CUDA_SUCCESS 0
/* Driver function pointers (resolved by cuda_driver_loader.c) */
extern CUresult (*g_cuModuleLoadData)(CUmodule*, const void*);
extern CUresult (*g_cuModuleGetFunction)(CUfunction*, CUmodule, const char*);
extern CUresult (*g_cuLaunchKernel)(CUfunction, unsigned int, unsigned int, unsigned int,
unsigned int, unsigned int, unsigned int,
unsigned int, CUstream, void**, void**);
extern CUresult (*g_cuMemAlloc_v2)(CUdeviceptr*, SIZE_T);
extern CUresult (*g_cuMemcpyHtoD_v2)(CUdeviceptr, const void*, SIZE_T);
extern CUresult (*g_cuModuleUnload)(CUmodule);
/* Embedded PTX blobs (xxd -i at build time) */
extern const unsigned char flash_attention_ptx_data[];
extern const unsigned int flash_attention_ptx_size;
extern const unsigned char gemm_ptx_data[];
extern const unsigned int gemm_ptx_size;
/* ── module / function handles ─────────────────────────────────── */
static CUmodule s_fa_module = 0;
static CUmodule s_gemm_module = 0;
static CUfunction s_fa_paged = 0; /* flash_attention_paged */
static CUfunction s_rmsnorm = 0; /* rmsnorm_fused */
static CUfunction s_silu = 0; /* silu_fused */
static CUfunction s_gemm = 0; /* gemm_f16_f32_accum */
/* block_table device buffer (allocated once) */
static CUdeviceptr s_d_block_table = 0;
#define SOV_MAX_SEQS 256
#define SOV_KV_MAX_BLOCKS_PER_SEQ 128
/* ── sov_cuda_kernels_init ──────────────────────────────────────── */
int sov_cuda_kernels_init(void) {
if (!g_cuModuleLoadData || !g_cuModuleGetFunction) return -1;
CUresult r;
r = g_cuModuleLoadData(&s_fa_module, (const void*)flash_attention_ptx_data);
if (r != CUDA_SUCCESS) return -1;
r = g_cuModuleGetFunction(&s_fa_paged, s_fa_module, "flash_attention_paged");
if (r != CUDA_SUCCESS) return -2;
r = g_cuModuleGetFunction(&s_rmsnorm, s_fa_module, "rmsnorm_fused");
if (r != CUDA_SUCCESS) return -3;
r = g_cuModuleGetFunction(&s_silu, s_fa_module, "silu_fused");
if (r != CUDA_SUCCESS) return -4;
r = g_cuModuleLoadData(&s_gemm_module, (const void*)gemm_ptx_data);
if (r != CUDA_SUCCESS) return -5;
r = g_cuModuleGetFunction(&s_gemm, s_gemm_module, "gemm_f16_f32_accum");
if (r != CUDA_SUCCESS) return -6;
/* Allocate persistent device block_table buffer */
SIZE_T bt_bytes = SOV_MAX_SEQS * SOV_KV_MAX_BLOCKS_PER_SEQ * sizeof(int32_t);
r = g_cuMemAlloc_v2(&s_d_block_table, bt_bytes);
if (r != CUDA_SUCCESS) return -7;
return 0;
}
/* ── sov_cuda_flash_attention ───────────────────────────────────── */
int sov_cuda_flash_attention(int seqs, int heads,
float* q, float* k, float* v, float* out,
int* h_block_table, int* seq_lens,
int head_dim, int block_size) {
if (!s_fa_paged || !g_cuLaunchKernel) return -1;
/* Upload block_table to device */
SIZE_T bt_bytes = (SIZE_T)(seqs * block_size) * sizeof(int32_t);
g_cuMemcpyHtoD_v2(s_d_block_table, h_block_table, bt_bytes);
void* args[] = {
&q, &k, &v, &out,
&s_d_block_table,
&seq_lens,
(void*)&head_dim,
(void*)&block_size
};
/* grid = (n_seqs, n_heads, 1) block = (128, 1, 1) */
CUresult r = g_cuLaunchKernel(s_fa_paged,
(unsigned int)seqs,
(unsigned int)heads,
1u,
128u, 1u, 1u,
(unsigned int)(head_dim * 4 + 16), /* smem: Q tile */
0, args, 0);
return (r == CUDA_SUCCESS) ? 0 : -2;
}
/* ── sov_cuda_rmsnorm_fused ─────────────────────────────────────── */
int sov_cuda_rmsnorm_fused(CUdeviceptr x, CUdeviceptr w, int n) {
if (!s_rmsnorm || !g_cuLaunchKernel) return -1;
void* args[] = { &x, &w, &x, (void*)&n };
unsigned int grid = ((unsigned int)n + 127u) / 128u;
CUresult r = g_cuLaunchKernel(s_rmsnorm,
grid, 1u, 1u,
128u, 1u, 1u,
0u, 0, args, 0);
return (r == CUDA_SUCCESS) ? 0 : -2;
}
/* ── sov_cuda_silu_fused ────────────────────────────────────────── */
int sov_cuda_silu_fused(CUdeviceptr x, CUdeviceptr out, int n) {
if (!s_silu || !g_cuLaunchKernel) return -1;
void* args[] = { &x, &out, (void*)&n };
unsigned int grid = ((unsigned int)n + 127u) / 128u;
CUresult r = g_cuLaunchKernel(s_silu,
grid, 1u, 1u,
128u, 1u, 1u,
0u, 0, args, 0);
return (r == CUDA_SUCCESS) ? 0 : -2;
}
/* ── sov_cuda_gemm (thin wrapper -> gemm_dispatch.c) ────────────── */
int sov_cuda_gemm_simple(CUdeviceptr A, CUdeviceptr B, CUdeviceptr C,
int M, int N, int K);
int sov_cuda_gemm(CUdeviceptr A, CUdeviceptr B, CUdeviceptr C,
int M, int N, int K) {
return sov_cuda_gemm_simple(A, B, C, M, N, K);
}
/* ── shutdown ───────────────────────────────────────────────────── */
void sov_cuda_kernels_shutdown(void) {
if (g_cuModuleUnload) {
if (s_fa_module) g_cuModuleUnload(s_fa_module);
if (s_gemm_module) g_cuModuleUnload(s_gemm_module);
}
s_fa_module = s_gemm_module = 0;
s_fa_paged = s_rmsnorm = s_silu = s_gemm = 0;
}