목적
- 커널을 자유롭게 교체하라 수 있는 구조를 완성
- 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 선택
현재 구조 빌드업 단계
'AI Compiler framework' 카테고리의 다른 글
| AICF Python Binding - Plan A (Unified op_call) 설계 문서 (0) | 2025.12.20 |
|---|---|
| Python <-> CUDA Ops Binding 설계 및 pyd 모듈 생성 과정 (0) | 2025.12.19 |
| CUDA Elementwise 커널 구현 및 Nsight Compute 분석 문서화 (AICF - Torch 커널 대체의 첫 단계) (0) | 2025.12.18 |
| AICF 초기 프레임워크 구조 정립 및 커널 관측에 대한 기록 - 초기 Pytorch 구현 이유, 실제 커널 실행 흐름 관찰 (0) | 2025.12.17 |
| aicf 의 메커니즘과 ge_v2 와의 비교 (0) | 2025.12.17 |