1. CPU 시간 측정: std::chrono
사용 헤더
#include <chrono>
기본 패턴
auto cpu_start = std::chrono::high_resolution_clock::now();
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;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaEventRecord(start);
WindowColvolution<<<gridDim, blockDim>>>(da, dkernel, dc, IMG_ROW, IMG_COL, kernel_size);
cudaEventRecord(stop);
cudaEventSynchronize(stop);
float gpu_ms = 0;
cudaEventElapsedTime(&gpu_ms, start, stop);
printf("GPU time = %.3f ms\n", gpu_ms);
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()를 사용해 모든 작업 동기화 후 타이밍 시작/끝