| | #pragma once |
| |
|
| | #include <cassert> |
| |
|
| | # define CUDA_SAFE_CALL_NO_SYNC( call) do { \ |
| | cudaError err = call; \ |
| | if( cudaSuccess != err) { \ |
| | fprintf(stderr, "CUDA error in file '%s' in line %i : %s.\n", \ |
| | __FILE__, __LINE__, cudaGetErrorString( err) ); \ |
| | exit(EXIT_FAILURE); \ |
| | } } while (0) |
| |
|
| | # define CUDA_SAFE_CALL( call) do { \ |
| | CUDA_SAFE_CALL_NO_SYNC(call); \ |
| | cudaError err = cudaDeviceSynchronize(); \ |
| | if( cudaSuccess != err) { \ |
| | fprintf(stderr, "CUDA error in file '%s' in line %i : %s.\n", \ |
| | __FILE__, __LINE__, cudaGetErrorString( err) ); \ |
| | exit(EXIT_FAILURE); \ |
| | } } while (0) |
| |
|
| | class cuda_timer |
| | { |
| | cudaEvent_t start_; |
| | cudaEvent_t stop_; |
| |
|
| | public: |
| | cuda_timer() |
| | { |
| | CUDA_SAFE_CALL(cudaEventCreate(&start_)); |
| | CUDA_SAFE_CALL(cudaEventCreate(&stop_)); |
| | } |
| |
|
| | ~cuda_timer() |
| | { |
| | CUDA_SAFE_CALL(cudaEventDestroy(start_)); |
| | CUDA_SAFE_CALL(cudaEventDestroy(stop_)); |
| | } |
| |
|
| | void start() |
| | { |
| | CUDA_SAFE_CALL(cudaEventRecord(start_, 0)); |
| | } |
| |
|
| | void stop() |
| | { |
| | CUDA_SAFE_CALL(cudaEventRecord(stop_, 0)); |
| | CUDA_SAFE_CALL(cudaEventSynchronize(stop_)); |
| | } |
| |
|
| | double milliseconds_elapsed() |
| | { |
| | float elapsed_time; |
| | CUDA_SAFE_CALL(cudaEventElapsedTime(&elapsed_time, start_, stop_)); |
| | return elapsed_time; |
| | } |
| |
|
| | double seconds_elapsed() |
| | { |
| | return milliseconds_elapsed() / 1000.0; |
| | } |
| | }; |
| |
|
| | #if (THRUST_HOST_COMPILER == THRUST_HOST_COMPILER_MSVC) |
| | #include <windows.h> |
| |
|
| | class steady_timer |
| | { |
| | LARGE_INTEGER frequency_; |
| | LARGE_INTEGER start_; |
| | LARGE_INTEGER stop_; |
| |
|
| | public: |
| | steady_timer() : start_(), stop_(), frequency_() |
| | { |
| | BOOL const r = QueryPerformanceFrequency(&frequency_); |
| | assert(0 != r); |
| | } |
| |
|
| | void start() |
| | { |
| | BOOL const r = QueryPerformanceCounter(&start_); |
| | assert(0 != r); |
| | } |
| |
|
| | void stop() |
| | { |
| | BOOL const r = QueryPerformanceCounter(&stop_); |
| | assert(0 != r); |
| | } |
| |
|
| | double seconds_elapsed() |
| | { |
| | return double(stop_.QuadPart - start_.QuadPart) |
| | / double(frequency_.QuadPart); |
| | } |
| | }; |
| | #else |
| | #include <time.h> |
| |
|
| | class steady_timer |
| | { |
| | timespec start_; |
| | timespec stop_; |
| |
|
| | public: |
| | steady_timer() : start_(), stop_() {} |
| |
|
| | void start() |
| | { |
| | int const r = clock_gettime(CLOCK_MONOTONIC, &start_); |
| | assert(0 == r); |
| | } |
| |
|
| | void stop() |
| | { |
| | int const r = clock_gettime(CLOCK_MONOTONIC, &stop_); |
| | assert(0 == r); |
| | } |
| |
|
| | double seconds_elapsed() |
| | { |
| | return double(stop_.tv_sec - start_.tv_sec) |
| | + double(stop_.tv_nsec - start_.tv_nsec) * 1.0e-9; |
| | } |
| | }; |
| | #endif |
| |
|
| |
|
| |
|