2.8 KiB
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 구현
이유:
- 사용자 요청 ("CUDA Runtime API 로 통일") 정신에 부합하지 않지만 실용적
- 빠른 문제 해결 가능
- 옵션 B는 향후 리팩토링으로 진행 가능
구현 계획:
ExternalMemoryCache.cpp수정cudaCreateSurfaceObject()→cuSurfObjectCreate()- Runtime API 타입 → Driver API 타입 변환
ExternalMemoryCache.h수정cudaSurfaceObject_t→CUsurfObject타입 변경
D3D12SurfaceHandler.h/.cpp수정- Surface object 타입 변경
- 빌드 및 테스트
5. 다음 단계
사용자에게 상황 보고 및 옵션 선택 요청:
- 옵션 A: Driver API surface (빠른 해결)
- 옵션 B: 완전 Runtime API (시간 소요)
현재 상황:
- Hybrid API는 작동하지 않음
- 완전한 API 통일 필요