Files
video-v1/vav2/docs/working/CUDA_API_Problem_Analysis.md

96 lines
2.8 KiB
Markdown
Raw Permalink Normal View History

2025-10-07 03:49:32 +09:00
# 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`
**변경 내용**:
```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_t``CUsurfObject` 타입 변경
3. `D3D12SurfaceHandler.h/.cpp` 수정
- Surface object 타입 변경
4. 빌드 및 테스트
## 5. 다음 단계
사용자에게 상황 보고 및 옵션 선택 요청:
- **옵션 A**: Driver API surface (빠른 해결)
- **옵션 B**: 완전 Runtime API (시간 소요)
현재 상황:
- Hybrid API는 **작동하지 않음**
- 완전한 API 통일 필요