Framework/CUDA
CUDA - 8장. 디버깅 및 성능 분석
개발_노트
2025. 3. 29. 22:56
🛠️ 8장. 디버깅 및 성능 분석
🎯 학습 목표
CUDA 개발 과정에서 발생하는 오류를 빠르게 파악하고,
성능 병목을 식별하여 효과적으로 최적화하는 디버깅 및 분석 역량을 기릅니다.
🧭 전체 구성 요약
항목 |
핵심 내용 |
8.1 |
CUDA 오류 디버깅 기법 (cudaErrorCheck, cuda-memcheck, Visual Studio 등) |
8.2 |
Nsight 도구 사용법 (Systems & Compute) |
8.3 |
병목 원인 분석 및 최적화 전략 |
📘 8.1 CUDA 오류 디버깅 기법
✅ 에러 체크 매크로
#define CUDA_CHECK(call) { \
cudaError_t err = call; \
if (err != cudaSuccess) { \
fprintf(stderr, "CUDA Error: %s (%s:%d)\n", \
cudaGetErrorString(err), __FILE__, __LINE__); \
exit(EXIT_FAILURE); \
} \
}
⚠️ 자주 발생하는 오류
메시지 |
원인 |
cudaErrorInvalidValue |
포인터 or 인덱스 오류 |
cudaMemcpy 오류 |
Host↔Device 방향 오류 |
invalid device function |
컴파일 GPU 아키텍처 불일치 |
launch failed |
커널 내부 런타임 에러 |
🧭 디버깅 흐름도
┌──────────────┐
│ CUDA 함수 실행 │
└──────┬───────┘
▼
CUDA_ERROR 발생?
▼
┌────Yes────┐
│ cudaGetLastError │
└────┬──────┘
▼
오류 해석 및 원인 분석
🧪 실전 디버깅 사례
if (idx <= N) { // ❌ 경계 오류 가능
out[idx] = in[idx];
}
→ idx < N 으로 수정해야 안전
🧰 디버깅 도구
도구 |
기능 |
cuda-memcheck |
메모리 접근 오류, 초기화 누락 등 감지 |
cuda-gdb |
CLI 기반 디버거 (Linux/WSL) |
Visual Studio (Windows) |
GUI 디버깅 지원, 커널 중단점 가능 |
Compute Sanitizer |
경합 조건, 주소 충돌 탐지 가능 |
📘 8.2 Nsight 도구 사용법
🧩 Nsight Systems – 실행 흐름 시각화
nsys profile -o profile ./app
기능 |
설명 |
전체 타임라인 |
CPU ↔ GPU 전송 흐름 확인 |
커널 실행 |
실행 순서 및 병렬성 파악 |
스트림 |
Overlap 여부 시각화 가능 |
✅ GUI 실행: nsight-sys profile.qdrep
🧮 Nsight Compute – 커널 성능 상세 분석
ncu ./app
항목 |
분석 내용 |
Warp Efficiency |
스레드 병렬도 측정 |
Global Load Efficiency |
메모리 접근 최적화 확인 |
Occupancy |
스레드 및 리소스 활용도 |
FLOPs |
연산량 측정 (실제 처리량) |
🎯 적정 기준값 가이드
지표 |
권장 수치 |
Warp Efficiency |
≥ 90% |
Global Memory Throughput |
≥ 80% |
SM Occupancy |
70~100% |
Coalesced Load |
True (연속 접근) |
🖼️ UI 주요 화면 예시 (설명용)
- Summary: 커널별 실행 시간/횟수 요약
- Details: 메모리 대역폭, 연산 비율
- Roofline View: 연산 vs 메모리 병목 여부 시각화
📘 8.3 성능 분석 및 병목 원인 식별
✅ 분석 절차
- 오류 없이 커널 실행 확인
- nsys로 전체 흐름 분석 (전송/커널 오버랩)
- ncu로 병목 지표 분석 (warp, occupancy 등)
- 병목 원인 분류 → 전략 적용
⚠️ 주요 병목 유형 및 해결 전략
병목 원인 |
대응 방법 |
메모리 병목 |
Coalescing, Shared Mem 활용 |
낮은 Occupancy |
블록/스레드 조정, 레지스터 줄이기 |
워프 분기 |
if-else 최소화, flow 정렬 |
오버랩 부족 |
CUDA Stream, 비동기 cudaMemcpyAsync() |
✅ 최종 정리
구분 |
핵심 요약 |
오류 처리 |
cudaErrorCheck, cudaGetLastError(), cuda-memcheck |
흐름 분석 |
Nsight Systems → 전송/커널 타이밍 시각화 |
커널 분석 |
Nsight Compute → Occupancy, Warp, Memory 분석 |
병목 대응 |
Coalescing, Shared Mem, Stream, 조건문 정리 |
고급 도구 |
cuda-gdb, Compute Sanitizer, VS Debugger 연동 가능 |