|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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 |
|
|
|
|