본문 바로가기

dev_AI_framework

커널 ABI, 런타임 컨트랙트에 대해

커널 ABI

호스트 <-> 커널(플러그인/디바이스 코드) 사이의 바이너리 인터페이스 규약, 

API 가 함수/타입 시그니처를 글로 약속한거라면, ABI 는 컴파일된 바이너리끼리 실제로 어떻게 물려 들어갈지까지 고정하는 것

 

런타임 컨트랙트

그 인터페이스 위에서 양쪽이 지켜야 할 실행 시 행동 규칙

 

커널 ABI ( Application Binary Interface )

ABI 는 아래를 바이너리 레벨에서 고정

  1. 함수 호출 규약 : 커널 런처/설정 함수의 정확한 시그니처, extern "C" 여부(네임 맹글링 방지), 반환 타임
  2. 자료구조 메모리 레이아웃: struct 의 필드 순서/크기/정렬, enum 의 기저 타입, 포인터 폭, 패딩
  3. 스칼라/텐서 인코딩 : dtype 코드, shape/stride 의 타입과 의미, 브로드캐스트 규칙
  4. 런치 파라미터 ABI : grid, block, smem, stream 을 어떻게 전달하는지
  5. 심볼/버전 네고: 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 핸들로만 접근