Files
video-v1/vav2/docs/working/CUDA_API_Problem_Analysis.md
2025-10-07 03:49:32 +09:00

2.8 KiB

CUDA API Problem - 심층 분석

작성일: 2025년 10월 7일 상태: 문제 분석 완료, 새로운 해결책 필요

1. 시도한 해결책: Hybrid API (실패)

구현: Runtime API cudaLaunchKernel() 사용 결과: 여전히 CUDA_ERROR_INVALID_HANDLE 발생

실패 원인 분석:

Runtime API Surface (cudaSurfaceObject_t)
      ↓
Driver API Kernel (cuModuleLoadData로 로드)
      ↓
Kernel 내부에서 surf2Dwrite() 호출 시 handle 불일치

2. 근본 문제 파악

문제의 핵심

  • cudaLaunchKernel()이 Driver API 커널 함수를 받을 수 있음
  • BUT 커널 내부에서 surf2Dwrite()가 사용하는 surface handle이 문제
  • Driver API로 로드된 커널은 Driver API surface object를 기대함
  • Runtime API surface object를 전달하면 handle space 불일치로 에러 발생

오해했던 부분

잘못된 가정: "cudaLaunchKernel()만 사용하면 Runtime API surface를 전달할 수 있다" 진실: 커널이 어떤 API로 로드되었는지가 중요 - Driver API 커널은 Driver API handles 필요

3. 올바른 해결책 2가지

옵션 A: Driver API Surface 사용 (권장)

변경 파일: ExternalMemoryCache.cpp 변경 내용:

// Runtime API surface 생성 제거
cudaCreateSurfaceObject(&surface, &res_desc);  // 제거

// Driver API surface 생성으로 교체
cuSurfObjectCreate(&surface, &res_desc);  // 추가

장점:

  • 코드 변경 최소화 (한 파일만 수정)
  • PTX 커널 시스템 그대로 유지
  • 즉시 구현 가능

단점:

  • Runtime/Driver API 혼용 유지
  • 장기적 유지보수성 약간 저하

옵션 B: 완전 Runtime API 전환

변경 파일: D3D12SurfaceHandler.cpp 변경 내용:

  • PTX 로딩 제거
  • NVRTC로 커널 재컴파일
  • Runtime API 커널 함수 포인터 사용

장점:

  • API 완전 통일
  • 장기적 유지보수성 향상

단점:

  • 구현 복잡도 높음
  • NVRTC 통합 필요
  • 빌드 시스템 재구성

4. 권장 조치: 옵션 A 구현

이유:

  1. 사용자 요청 ("CUDA Runtime API 로 통일") 정신에 부합하지 않지만 실용적
  2. 빠른 문제 해결 가능
  3. 옵션 B는 향후 리팩토링으로 진행 가능

구현 계획:

  1. ExternalMemoryCache.cpp 수정
    • cudaCreateSurfaceObject()cuSurfObjectCreate()
    • Runtime API 타입 → Driver API 타입 변환
  2. ExternalMemoryCache.h 수정
    • cudaSurfaceObject_tCUsurfObject 타입 변경
  3. D3D12SurfaceHandler.h/.cpp 수정
    • Surface object 타입 변경
  4. 빌드 및 테스트

5. 다음 단계

사용자에게 상황 보고 및 옵션 선택 요청:

  • 옵션 A: Driver API surface (빠른 해결)
  • 옵션 B: 완전 Runtime API (시간 소요)

현재 상황:

  • Hybrid API는 작동하지 않음
  • 완전한 API 통일 필요