본문 바로가기

AI Compiler framework

CUDA Backend - kernel Registry 기반 빌드업 정리

목적

  • 커널을 자유롭게 교체하라 수 있는 구조를 완성
  • naive 커널을 표준 ABI + registry + dispatch 에 연결
  • 이후 최적화 커널을 구조 변경 없이 추가 가능하게 함

 

1. 현재 확정된 설계 원칙

1.1 커널 교체가 가능한 이유

모든 CUDA 커널은 다음 계약을 따른다.

  • 표준 Kernel ABI
    • TensorDesc* inputs / outputs
    • const void* attr
    • cudaStream_t stream
  • KernelVariant
    • launch
    • supported
    • query_workspace
  • Registry + Dispatch
    • 런타임에 조건에 맞는 variant 자동 선택

커널 구현은 교체 가능

IR / Runtime / Graph 는 커널 내부를 몰라도 됨

 

2. Stream / Status / TensorDesc (기초 계약)

2.1 Stream

namespace aicf {
struct Stream {
    void* handle = nullptr; // cudaStream_t
};
}
  • handle == nullptr 
  • CUDA 헤더 의존 최소화를 위한 래핑

 

2.2 Status

enum class Status : int32_t {
    Ok = 0,
    Error = 1,
    NotImplemented = 2,
    InvalidArgument = 3,
};
  • dispatch 에서 매칭 실패 - NotImplement
  • 인자 오류 - InvalidArgument
  • CUDA 런치 실패 - Error

 

2.3 TensorDesc

struct TensorDesc {
  void* data;
  DType dtype;        // F32 중심
  int ndim;           // 현재 add/relu: 1, gemm: 2
  int64_t shape[4];
  int64_t stride[4];
  bool contiguous;
  int alignment;
  int device;
};

 

 

3. Ops 분리 구조

ops/
 ├─ add/
 │   ├─ api.hpp
 │   ├─ kernels.cuh
 │   └─ launcher.cu
 ├─ relu/
 │   ├─ api.hpp
 │   ├─ kernels.cuh
 │   └─ launcher.cu
 └─ gemm/
     ├─ api.hpp
     ├─ kernels.cuh
     └─ launcher.cu

 

 

4. KernelVariant 등록 흐름

4.1 Variant factory ( 각 launcher.cu )

  • make_add_f32_variant()
  • make_relu_f32_variant()
  • make_gemm_f32_naive_variant()

각 variant 는

  • 지원 조건
  • 실제 실행
  • workspace 크기

 

4.2 register_all

extern "C" void aicf_cuda_register_all_kernels() {
  auto& R = KernelRegistry::instance();
  R.register_kernel(OpKind::EltwiseAdd,  make_add_f32_variant());
  R.register_kernel(OpKind::EltwiseRelu, make_relu_f32_variant());
  R.register_kernel(OpKind::Gemm,        make_gemm_f32_naive_variant());
}

MSVC / static lib 환경에서 안전

자동 constructor 방식 사용 안 함

 

4.3 초기화 위치

void aicf_cuda_context_init() {
  aicf_cuda_register_all_kernels();
}

 

 

5. 빌드 설정

5.1 필수 소스 등록

target_sources(aicf PRIVATE
  src/backends/cuda/ops/add/launcher.cu
  src/backends/cuda/ops/relu/launcher.cu
  src/backends/cuda/ops/gemm/launcher.cu

  src/backends/cuda/registry/registry.cpp
  src/backends/cuda/registry/register_all.cpp
)

5.2 빌드

mkdir build
cd build
cmake .. -G Ninja
ninja


////////////////or/////////////////

cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Release

 

 

6. 실행 / 검증

6.1 벤치 실행

.\aicf_eltwise_bench.exe
.\aicf_gemm_bench.exe

6.2 Nsight Compute

ncu --target-processes all \
    --section LaunchStats \
    --page details \
    .\aicf_gemm_bench.exe

 

7. 현재 상태

✔ 완료된 것

  • add / relu / gemm naive 커널 구현
  • eltwise 분리
  • Kernel Registry + Dispatch 연결
  • Stream / Status / TensorDesc 계약 확정
  • MSVC-safe kernel 등록 구조

❌ 아직 안 한 것 (의도적으로)

  • 커널 최적화 (shared memory / tensor core)
  • attr (epilogue, alpha/beta, fusion)
  • ND elementwise 일반화
  • perf 기반 variant 선택

현재 구조 빌드업 단계