#pragma once #ifdef __CUDACC__ #include <cuda.h> #include <cuda_runtime.h> #endif #include <cstdio> #include <cassert> #include <limits> #ifdef __CUDACC__ #define checkCuda(x) do { if((x)!=cudaSuccess) { \ printf("CUDA Runtime Error: %s at %s:%d\n",\ cudaGetErrorString(x),__FILE__,__LINE__);\ exit(1);}} while(0) #endif template <typename T> DEVICE inline T infinity() { #ifdef __CUDA_ARCH__ const unsigned long long ieee754inf = 0x7ff0000000000000; return __longlong_as_double(ieee754inf); #else return std::numeric_limits<T>::infinity(); #endif } template <> DEVICE inline double infinity() { #ifdef __CUDA_ARCH__ return __longlong_as_double(0x7ff0000000000000ULL); #else return std::numeric_limits<double>::infinity(); #endif } template <> DEVICE inline float infinity() { #ifdef __CUDA_ARCH__ return __int_as_float(0x7f800000); #else return std::numeric_limits<float>::infinity(); #endif } inline void cuda_synchronize() { #ifdef __CUDACC__ checkCuda(cudaDeviceSynchronize()); #endif }