커널 ABI
호스트 <-> 커널(플러그인/디바이스 코드) 사이의 바이너리 인터페이스 규약,
API 가 함수/타입 시그니처를 글로 약속한거라면, ABI 는 컴파일된 바이너리끼리 실제로 어떻게 물려 들어갈지까지 고정하는 것
런타임 컨트랙트
그 인터페이스 위에서 양쪽이 지켜야 할 실행 시 행동 규칙
커널 ABI ( Application Binary Interface )
ABI 는 아래를 바이너리 레벨에서 고정
- 함수 호출 규약 : 커널 런처/설정 함수의 정확한 시그니처, extern "C" 여부(네임 맹글링 방지), 반환 타임
- 자료구조 메모리 레이아웃: struct 의 필드 순서/크기/정렬, enum 의 기저 타입, 포인터 폭, 패딩
- 스칼라/텐서 인코딩 : dtype 코드, shape/stride 의 타입과 의미, 브로드캐스트 규칙
- 런치 파라미터 ABI : grid, block, smem, stream 을 어떻게 전달하는지
- 심볼/버전 네고: ABI_BRSION, struct_size 필드, 향후 확장을 위한 reserved[]
이걸 고정하면, 런타임을 다시 컴파일하지 않고도 새로운 커널 바이너리를 꽃아 쓸 수 있다. ( 플러그인 모듈화 )
런타임 컨트랙트 (실행 시 행동 규약)
아래를 규약하면 디버깅 최소화 가능
1. 메모리/수명
- TensorDesc.data 는 유효하고 해당 디바이스 공간에 존재해야 함 (CPU - host, CUDA - device)
- 입력은 읽기 전용, 출력은 쓰기 전용이 기본. flags 로 inplace 허용 여부 명시
- 브로드 캐스트/비연속(strided) 텐서 허용 범위를 명시
- workspace 는 런타임이 할당,해제하고, 커널은 수명 내에서만 사용(보관 금지)
2. 비동기/동기화
- GPU : 커널은 반드시 제공된 stream 에 enqueue. cudaDeviceSynchronize() 금지
- 런타임 정책(SyncPolicy) 에 따라 이벤트 기록/호출부 동기화는 호스트가 책임
- CPU : 멀티 스레딩 사용 가능하지만, 호출 스레드 밖으로 예외/스레드 보존 금지
3. 오류 처리
- 커널 내부에서 예외를 던지지 말 것
- LaunchFn 의 반환값으로 상대 코드
- GPU 는 런타임이 cudaGetLstError() 를 호출해 수집
4. 수치/결정성
- KernelCtx.flags 로 Deterministic/MathMode 전달
- 결정성 True 일 때 원자적 합산/비결정 타일링 금지, 대체 패스 사용
- NaN/Inf 전파 규칙 문서화
5. 사전/사후 조건
- 사전 : shape 호환/브로드캐스트 타당성/데이터 타입 허용 여부는 런타임에서 검증 후 호출
- 사후 : 출력 텐서는 정의된 영역에만 기록, aliasing 허용 시 교집합 규칙 문서화
6. 스레드 안전성
- 커널은 순수 함수 ( 입력/출력/워크스페이스 외 전역 상태 쓰지 않기 )
- 정적 캐시/전역 버퍼가 필요하면 opaque 핸들로만 접근
'dev_AI_framework' 카테고리의 다른 글
| graph_executor_v2 통합 문서 (수정 사항 + 빌드 & 스모크) (0) | 2025.09.02 |
|---|---|
| graph_executor 와 compiler 의 관계 (0) | 2025.09.02 |
| AI Compiler 구현 - python -> graph_executor_v2 -> launch_kernel() 까지의 완료된 상황 (0) | 2025.09.02 |
| "CUDA" + "C++" + "pybind11" 모듈의 빌드 방법 및 과정, 체크리스트 확인 (0) | 2025.09.01 |
| AI 컴파일러의 구현 - graph_executor_v2 를 통해 (0) | 2025.09.01 |