Moved all headers used throughout the library to src/common
This commit is contained in:
139
src/common/errchk.h
Normal file
139
src/common/errchk.h
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2014-2020, Johannes Pekkila, Miikka Vaisala.
|
||||||
|
|
||||||
|
This file is part of Astaroth.
|
||||||
|
|
||||||
|
Astaroth is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Astaroth is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Astaroth. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* \brief Brief info.
|
||||||
|
*
|
||||||
|
* Detailed info.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* =============================================================================
|
||||||
|
* General error checking
|
||||||
|
* =============================================================================
|
||||||
|
*/
|
||||||
|
#define ERROR(str) \
|
||||||
|
{ \
|
||||||
|
time_t t; \
|
||||||
|
time(&t); \
|
||||||
|
fprintf(stderr, "%s", ctime(&t)); \
|
||||||
|
fprintf(stderr, "\tError in file %s line %d: %s\n", __FILE__, __LINE__, str); \
|
||||||
|
fflush(stderr); \
|
||||||
|
exit(EXIT_FAILURE); \
|
||||||
|
abort(); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define WARNING(str) \
|
||||||
|
{ \
|
||||||
|
time_t t; \
|
||||||
|
time(&t); \
|
||||||
|
fprintf(stderr, "%s", ctime(&t)); \
|
||||||
|
fprintf(stderr, "\tWarning in file %s line %d: %s\n", __FILE__, __LINE__, str); \
|
||||||
|
fflush(stderr); \
|
||||||
|
}
|
||||||
|
|
||||||
|
// DO NOT REMOVE BRACKETS AROUND RETVAL. F.ex. if (!a < b) vs if (!(a < b)).
|
||||||
|
#define ERRCHK(retval) \
|
||||||
|
{ \
|
||||||
|
if (!(retval)) \
|
||||||
|
ERROR(#retval " was false"); \
|
||||||
|
}
|
||||||
|
#define WARNCHK(retval) \
|
||||||
|
{ \
|
||||||
|
if (!(retval)) \
|
||||||
|
WARNING(#retval " was false"); \
|
||||||
|
}
|
||||||
|
#define ERRCHK_ALWAYS(retval) \
|
||||||
|
{ \
|
||||||
|
if (!(retval)) \
|
||||||
|
ERROR(#retval " was false"); \
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* =============================================================================
|
||||||
|
* CUDA-specific error checking
|
||||||
|
* =============================================================================
|
||||||
|
*/
|
||||||
|
#if defined(__CUDA_RUNTIME_API_H__)
|
||||||
|
static inline void
|
||||||
|
cuda_assert(cudaError_t code, const char* file, int line, bool abort)
|
||||||
|
{
|
||||||
|
if (code != cudaSuccess) {
|
||||||
|
time_t t;
|
||||||
|
time(&t);
|
||||||
|
fprintf(stderr, "%s", ctime(&t));
|
||||||
|
fprintf(stderr, "\tCUDA error in file %s line %d: %s\n", file, line,
|
||||||
|
cudaGetErrorString(code));
|
||||||
|
fflush(stderr);
|
||||||
|
|
||||||
|
if (abort)
|
||||||
|
exit(code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef NDEBUG
|
||||||
|
#undef ERRCHK
|
||||||
|
#undef WARNCHK
|
||||||
|
#define ERRCHK(params)
|
||||||
|
#define WARNCHK(params)
|
||||||
|
#define ERRCHK_CUDA(params) params
|
||||||
|
#define WARNCHK_CUDA(params) params
|
||||||
|
#define ERRCHK_CUDA_KERNEL() \
|
||||||
|
{ \
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define ERRCHK_CUDA(params) \
|
||||||
|
{ \
|
||||||
|
cuda_assert((params), __FILE__, __LINE__, true); \
|
||||||
|
}
|
||||||
|
#define WARNCHK_CUDA(params) \
|
||||||
|
{ \
|
||||||
|
cuda_assert((params), __FILE__, __LINE__, false); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ERRCHK_CUDA_KERNEL() \
|
||||||
|
{ \
|
||||||
|
ERRCHK_CUDA(cudaPeekAtLastError()); \
|
||||||
|
ERRCHK_CUDA(cudaDeviceSynchronize()); \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ERRCHK_CUDA_ALWAYS(params) \
|
||||||
|
{ \
|
||||||
|
cuda_assert((params), __FILE__, __LINE__, true); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define ERRCHK_CUDA_KERNEL_ALWAYS() \
|
||||||
|
{ \
|
||||||
|
ERRCHK_CUDA_ALWAYS(cudaPeekAtLastError()); \
|
||||||
|
ERRCHK_CUDA_ALWAYS(cudaDeviceSynchronize()); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define WARNCHK_CUDA_ALWAYS(params) \
|
||||||
|
{ \
|
||||||
|
cuda_assert((params), __FILE__, __LINE__, false); \
|
||||||
|
}
|
||||||
|
#endif // __CUDA_RUNTIME_API_H__
|
187
src/common/math_utils.h
Normal file
187
src/common/math_utils.h
Normal file
@@ -0,0 +1,187 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2014-2020, Johannes Pekkila, Miikka Vaisala.
|
||||||
|
|
||||||
|
This file is part of Astaroth.
|
||||||
|
|
||||||
|
Astaroth is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Astaroth is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Astaroth. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* \brief Brief info.
|
||||||
|
*
|
||||||
|
* Detailed info.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
//#include <cmath>
|
||||||
|
// using namespace std; // Potentially bad practice to declare namespace std here
|
||||||
|
#include <math.h> // isnan, isinf // Overloads incorrect/bugged with GCC <= 6.0
|
||||||
|
//#include <tgmath.h> // Even this does not work
|
||||||
|
#include <stdlib.h> // rand
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
static inline const T
|
||||||
|
max(const T& a, const T& b)
|
||||||
|
{
|
||||||
|
return a > b ? a : b;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
static inline const T
|
||||||
|
min(const T& a, const T& b)
|
||||||
|
{
|
||||||
|
return a < b ? a : b;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const int3
|
||||||
|
max(const int3& a, const int3& b)
|
||||||
|
{
|
||||||
|
return (int3){max(a.x, b.x), max(a.y, b.y), max(a.z, b.z)};
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline const int3
|
||||||
|
min(const int3& a, const int3& b)
|
||||||
|
{
|
||||||
|
return (int3){min(a.x, b.x), min(a.y, b.y), min(a.z, b.z)};
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
static inline const T
|
||||||
|
sum(const T& a, const T& b)
|
||||||
|
{
|
||||||
|
return a + b;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
static inline const T
|
||||||
|
clamp(const T& val, const T& min, const T& max)
|
||||||
|
{
|
||||||
|
return val < min ? min : val > max ? max : val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline AcReal
|
||||||
|
randr()
|
||||||
|
{
|
||||||
|
return AcReal(rand()) / AcReal(RAND_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool
|
||||||
|
is_power_of_two(const unsigned val)
|
||||||
|
{
|
||||||
|
return val && !(val & (val - 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __CUDACC__
|
||||||
|
#define HOST_DEVICE_INLINE __host__ __device__ __forceinline__
|
||||||
|
#else
|
||||||
|
#define HOST_DEVICE_INLINE inline
|
||||||
|
#endif // __CUDACC__
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE AcReal3
|
||||||
|
operator+(const AcReal3& a, const AcReal3& b)
|
||||||
|
{
|
||||||
|
return (AcReal3){a.x + b.x, a.y + b.y, a.z + b.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE int3
|
||||||
|
operator+(const int3& a, const int3& b)
|
||||||
|
{
|
||||||
|
return (int3){a.x + b.x, a.y + b.y, a.z + b.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE int3 operator*(const int3& a, const int3& b)
|
||||||
|
{
|
||||||
|
return (int3){a.x * b.x, a.y * b.y, a.z * b.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE void
|
||||||
|
operator+=(AcReal3& lhs, const AcReal3& rhs)
|
||||||
|
{
|
||||||
|
lhs.x += rhs.x;
|
||||||
|
lhs.y += rhs.y;
|
||||||
|
lhs.z += rhs.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE AcReal3
|
||||||
|
operator-(const AcReal3& a, const AcReal3& b)
|
||||||
|
{
|
||||||
|
return (AcReal3){a.x - b.x, a.y - b.y, a.z - b.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE int3
|
||||||
|
operator-(const int3& a, const int3& b)
|
||||||
|
{
|
||||||
|
return (int3){a.x - b.x, a.y - b.y, a.z - b.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE AcReal3
|
||||||
|
operator-(const AcReal3& a)
|
||||||
|
{
|
||||||
|
return (AcReal3){-a.x, -a.y, -a.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE void
|
||||||
|
operator-=(AcReal3& lhs, const AcReal3& rhs)
|
||||||
|
{
|
||||||
|
lhs.x -= rhs.x;
|
||||||
|
lhs.y -= rhs.y;
|
||||||
|
lhs.z -= rhs.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE AcReal3 operator*(const AcReal& a, const AcReal3& b)
|
||||||
|
{
|
||||||
|
return (AcReal3){a * b.x, a * b.y, a * b.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE AcReal3 operator*(const AcReal3& b, const AcReal& a)
|
||||||
|
{
|
||||||
|
return (AcReal3){a * b.x, a * b.y, a * b.z};
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE AcReal
|
||||||
|
dot(const AcReal3& a, const AcReal3& b)
|
||||||
|
{
|
||||||
|
return a.x * b.x + a.y * b.y + a.z * b.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE AcReal3
|
||||||
|
mul(const AcMatrix& aa, const AcReal3& x)
|
||||||
|
{
|
||||||
|
return (AcReal3){dot(aa.row[0], x), dot(aa.row[1], x), dot(aa.row[2], x)};
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE AcReal3
|
||||||
|
cross(const AcReal3& a, const AcReal3& b)
|
||||||
|
{
|
||||||
|
AcReal3 c;
|
||||||
|
|
||||||
|
c.x = a.y * b.z - a.z * b.y;
|
||||||
|
c.y = a.z * b.x - a.x * b.z;
|
||||||
|
c.z = a.x * b.y - a.y * b.x;
|
||||||
|
|
||||||
|
return c;
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE bool
|
||||||
|
is_valid(const AcReal& a)
|
||||||
|
{
|
||||||
|
return !isnan(a) && !isinf(a);
|
||||||
|
}
|
||||||
|
|
||||||
|
static HOST_DEVICE_INLINE bool
|
||||||
|
is_valid(const AcReal3& a)
|
||||||
|
{
|
||||||
|
return is_valid(a.x) && is_valid(a.y) && is_valid(a.z);
|
||||||
|
}
|
63
src/common/timer_hires.h
Normal file
63
src/common/timer_hires.h
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
/*
|
||||||
|
Copyright (C) 2014-2020, Johannes Pekkila, Miikka Vaisala.
|
||||||
|
|
||||||
|
This file is part of Astaroth.
|
||||||
|
|
||||||
|
Astaroth is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
Astaroth is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with Astaroth. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
@file
|
||||||
|
\brief High-resolution timer.
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
Timer t;
|
||||||
|
timer_reset(&t);
|
||||||
|
timer_diff_nsec(t);
|
||||||
|
|
||||||
|
If there are issues, try compiling with -std=gnu11 -lrt
|
||||||
|
*/
|
||||||
|
#pragma once
|
||||||
|
#include <stdio.h> // perror
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
typedef struct timespec Timer;
|
||||||
|
// Contains at least the following members:
|
||||||
|
// time_t tv_sec;
|
||||||
|
// long tv_nsec;
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
timer_reset(Timer* t)
|
||||||
|
{
|
||||||
|
const int retval = clock_gettime(CLOCK_REALTIME, t);
|
||||||
|
if (retval == -1)
|
||||||
|
perror("clock_gettime failure");
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline long
|
||||||
|
timer_diff_nsec(const Timer start)
|
||||||
|
{
|
||||||
|
Timer end;
|
||||||
|
timer_reset(&end);
|
||||||
|
const long diff = (end.tv_sec - start.tv_sec) * 1000000000l + (end.tv_nsec - start.tv_nsec);
|
||||||
|
return diff;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
timer_diff_print(const Timer t)
|
||||||
|
{
|
||||||
|
printf("Time elapsed: %g ms\n", timer_diff_nsec(t) / 1e6);
|
||||||
|
}
|
Reference in New Issue
Block a user