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 성능 분석 및 병목 원인 식별

✅ 분석 절차

  1. 오류 없이 커널 실행 확인
  2. nsys로 전체 흐름 분석 (전송/커널 오버랩)
  3. ncu로 병목 지표 분석 (warp, occupancy 등)
  4. 병목 원인 분류 → 전략 적용

⚠️ 주요 병목 유형 및 해결 전략

병목 원인 대응 방법
메모리 병목 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 연동 가능