| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | #pragma once |
| |
|
| | |
| |
|
| | #ifdef __CUDACC__ |
| |
|
| | |
| | #include <cuda_runtime_api.h> |
| | #include <thrust/system/cuda/error.h> |
| | #include <thrust/system_error.h> |
| | #include <string> |
| |
|
| | void cuda_safe_call(cudaError_t error, const std::string& message = "") |
| | { |
| | if(error) |
| | throw thrust::system_error(error, thrust::cuda_category(), message); |
| | } |
| |
|
| | struct timer |
| | { |
| | cudaEvent_t start; |
| | cudaEvent_t end; |
| |
|
| | timer(void) |
| | { |
| | cuda_safe_call(cudaEventCreate(&start)); |
| | cuda_safe_call(cudaEventCreate(&end)); |
| | restart(); |
| | } |
| |
|
| | ~timer(void) |
| | { |
| | cuda_safe_call(cudaEventDestroy(start)); |
| | cuda_safe_call(cudaEventDestroy(end)); |
| | } |
| |
|
| | void restart(void) |
| | { |
| | cuda_safe_call(cudaEventRecord(start, 0)); |
| | } |
| |
|
| | double elapsed(void) |
| | { |
| | cuda_safe_call(cudaEventRecord(end, 0)); |
| | cuda_safe_call(cudaEventSynchronize(end)); |
| |
|
| | float ms_elapsed; |
| | cuda_safe_call(cudaEventElapsedTime(&ms_elapsed, start, end)); |
| | return ms_elapsed / 1e3; |
| | } |
| |
|
| | double epsilon(void) |
| | { |
| | return 0.5e-6; |
| | } |
| | }; |
| |
|
| | #else |
| |
|
| | |
| | #include <ctime> |
| |
|
| | struct timer |
| | { |
| | clock_t start; |
| | clock_t end; |
| |
|
| | timer(void) |
| | { |
| | restart(); |
| | } |
| |
|
| | ~timer(void) |
| | { |
| | } |
| |
|
| | void restart(void) |
| | { |
| | start = clock(); |
| | } |
| |
|
| | double elapsed(void) |
| | { |
| | end = clock(); |
| |
|
| | return static_cast<double>(end - start) / static_cast<double>(CLOCKS_PER_SEC); |
| | } |
| |
|
| | double epsilon(void) |
| | { |
| | return 1.0 / static_cast<double>(CLOCKS_PER_SEC); |
| | } |
| | }; |
| |
|
| | #endif |
| |
|
| |
|