CUDA 연산 시간 측정 정리

Mechboy·2025년 5월 28일

cuda

목록 보기
6/6

1. CPU 시간 측정: std::chrono

사용 헤더

#include <chrono>

기본 패턴

// 시작 시점 기록
auto cpu_start = std::chrono::high_resolution_clock::now();

// … CPU 연산 수행 …
conv2d_cpu(A, C_cpu, IMG_ROW, IMG_COL, kernel, kernel_size);

// 종료 시점 기록
auto cpu_end = std::chrono::high_resolution_clock::now();

// 경과 시간 계산 (밀리초 단위)
double cpu_ms = std::chrono::duration<double, std::milli>(cpu_end - cpu_start).count();

printf("CPU time = %.3f ms\n", cpu_ms);
  • high_resolution_clock
    — 가장 정밀도가 높은 시계(clock) 타입
  • time_point
    high_resolution_clock::time_point
  • duration<double, std::milli>
    time_point 차이를 밀리초(ms) 단위의 double로 변환

2. GPU 시간 측정: CUDA 이벤트 API

사용 헤더

#include <cuda_runtime.h>

기본 패턴

cudaEvent_t start, stop;

// 1) 이벤트 생성
cudaEventCreate(&start);
cudaEventCreate(&stop);

// 2) GPU 연산 직전 기록
cudaEventRecord(start);

// <<<…>>> 커널 실행
WindowColvolution<<<gridDim, blockDim>>>(da, dkernel, dc, IMG_ROW, IMG_COL, kernel_size);

// 3) GPU 연산 직후 기록
cudaEventRecord(stop);

// 4) GPU가 stop 이벤트까지 완료될 때까지 대기
cudaEventSynchronize(stop);

// 5) 경과 시간(ms) 측정
float gpu_ms = 0;
cudaEventElapsedTime(&gpu_ms, start, stop);

printf("GPU time = %.3f ms\n", gpu_ms);

// 6) 자원 해제
cudaEventDestroy(start);
cudaEventDestroy(stop);
  • cudaEventCreate: 이벤트 핸들 생성
  • cudaEventRecord: 해당 스트림에 타임스탬프 삽입
  • cudaEventSynchronize: 이벤트 완료까지 블록
  • cudaEventElapsedTime: 두 이벤트 간 경과를 float ms 단위로 반환
  • cudaEventDestroy: 리소스 정리

3. 주의사항 & 팁

  • 스트림 지정
    — 기본 스트림이 아닌 다른 스트림을 쓰면 cudaEventRecord(stream, event) 형태로 스트림을 전달해야 함.
  • 비동기 호출
    — 커널은 비동기 실행이므로 반드시 cudaEventRecord(stop)cudaEventSynchronize(stop)을 호출해야 정확한 측정 가능.
  • CPU vs GPU 비교 시
    — CPU 측정 구간에 GPU 대기 시간(cudaMemcpy, cudaEventRecord 등)이 포함되지 않도록 주의!
  • 더 정밀한 측정
    — 여러 번 반복(for 루프) 후 평균 내기
    cudaDeviceSynchronize()를 사용해 모든 작업 동기화 후 타이밍 시작/끝
profile
imageprocessing and Data science

0개의 댓글