Cleaned up the include directory: removed all unnecessary stuff and moved common definitions to a separate file

This commit is contained in:
jpekkila
2019-07-22 19:46:45 +03:00
parent 84af939e5d
commit f74df5339f
4 changed files with 185 additions and 231 deletions

View File

@@ -1,3 +1,23 @@
/*
Copyright (C) 2014-2019, Johannes Pekkilae, Miikka Vaeisalae.
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/>.
*/
#pragma once
/* /*
* ============================================================================= * =============================================================================
* Logical switches * Logical switches
@@ -26,8 +46,11 @@
FUNC(AC_max_steps), \ FUNC(AC_max_steps), \
FUNC(AC_save_steps), \ FUNC(AC_save_steps), \
FUNC(AC_bin_steps), \ FUNC(AC_bin_steps), \
FUNC(AC_bc_type) FUNC(AC_bc_type),
#define AC_FOR_REAL_PARAM_TYPES(FUNC)\
#define AC_FOR_USER_INT3_PARAM_TYPES(FUNC)
#define AC_FOR_USER_REAL_PARAM_TYPES(FUNC)\
/* cparams */\ /* cparams */\
FUNC(AC_dsx), \ FUNC(AC_dsx), \
FUNC(AC_dsy), \ FUNC(AC_dsy), \
@@ -97,7 +120,9 @@
FUNC(AC_cs2_sound), \ FUNC(AC_cs2_sound), \
FUNC(AC_inv_dsx), \ FUNC(AC_inv_dsx), \
FUNC(AC_inv_dsy), \ FUNC(AC_inv_dsy), \
FUNC(AC_inv_dsz) FUNC(AC_inv_dsz),
#define AC_FOR_USER_REAL3_PARAM_TYPES(FUNC)
// clang-format on // clang-format on
/* /*
@@ -106,49 +131,33 @@
* ============================================================================= * =============================================================================
*/ */
// clang-format off // clang-format off
#if LDENSITY
#define AC_FOR_DENSITY_VTXBUF_HANDLES(FUNC) \
FUNC(VTXBUF_LNRHO),
#else
#define AC_FOR_DENSITY_VTXBUF_HANDLES(FUNC)
#endif
#if LHYDRO
#define AC_FOR_HYDRO_VTXBUF_HANDLES(FUNC) \
FUNC(VTXBUF_UUX), \
FUNC(VTXBUF_UUY), \
FUNC(VTXBUF_UUZ),
#else
#define AC_FOR_HYDRO_VTXBUF_HANDLES(FUNC)
#endif
#if LMAGNETIC
#define AC_FOR_MAGNETIC_VTXBUF_HANDLES(FUNC) \
FUNC(VTXBUF_AX), \
FUNC(VTXBUF_AY), \
FUNC(VTXBUF_AZ),
#else
#define AC_FOR_MAGNETIC_VTXBUF_HANDLES(FUNC)
#endif
#if LENTROPY #if LENTROPY
#define AC_FOR_ENTROPY_VTXBUF_HANDLES(FUNC) \ #define AC_FOR_VTXBUF_HANDLES(FUNC) \
FUNC(VTXBUF_ENTROPY), FUNC(VTXBUF_LNRHO), \
FUNC(VTXBUF_UUX), \
FUNC(VTXBUF_UUY), \
FUNC(VTXBUF_UUZ), \
FUNC(VTXBUF_AX), \
FUNC(VTXBUF_AY), \
FUNC(VTXBUF_AZ), \
FUNC(VTXBUF_ENTROPY),
#elif LMAGNETIC
#define AC_FOR_VTXBUF_HANDLES(FUNC) \
FUNC(VTXBUF_LNRHO), \
FUNC(VTXBUF_UUX), \
FUNC(VTXBUF_UUY), \
FUNC(VTXBUF_UUZ), \
FUNC(VTXBUF_AX), \
FUNC(VTXBUF_AY), \
FUNC(VTXBUF_AZ),
#elif LHYDRO
#define AC_FOR_VTXBUF_HANDLES(FUNC) \
FUNC(VTXBUF_LNRHO), \
FUNC(VTXBUF_UUX), \
FUNC(VTXBUF_UUY), \
FUNC(VTXBUF_UUZ),
#else #else
#define AC_FOR_ENTROPY_VTXBUF_HANDLES(FUNC) #define AC_FOR_VTXBUF_HANDLES(FUNC) \
FUNC(VTXBUF_LNRHO),
#endif #endif
//MR: Temperature must not have an additional variable slot, but should sit on the
// same as entropy.
#if LTEMPERATURE
#define AC_FOR_TEMPERATURE_VTXBUF_HANDLES(FUNC)\
FUNC(VTXBUF_TEMPERATURE),
#else
#define AC_FOR_TEMPERATURE_VTXBUF_HANDLES(FUNC)
#endif
#define AC_FOR_VTXBUF_HANDLES(FUNC) AC_FOR_HYDRO_VTXBUF_HANDLES(FUNC) \
AC_FOR_DENSITY_VTXBUF_HANDLES(FUNC) \
AC_FOR_ENTROPY_VTXBUF_HANDLES(FUNC) \
AC_FOR_MAGNETIC_VTXBUF_HANDLES(FUNC) \
// clang-format on // clang-format on

View File

@@ -16,183 +16,28 @@
You should have received a copy of the GNU General Public License You should have received a copy of the GNU General Public License
along with Astaroth. If not, see <http://www.gnu.org/licenses/>. along with Astaroth. If not, see <http://www.gnu.org/licenses/>.
*/ */
/**
* @file
* \brief Brief info.
*
* Provides an interface to Astaroth. Contains all the necessary configuration
* structs and functions for running the code on multiple GPUs.
*
* All interface functions declared here (such as acInit()) operate all GPUs
* available in the node under the hood, and the user does not need any
* information about the decomposition, synchronization or such to use these
* functions.
*
*/
#pragma once #pragma once
/* Prevent name mangling */ #include "astaroth_defines.h"
#ifdef __cplusplus
extern "C" {
#endif
#include <float.h> // FLT_EPSILON, etc
#include <stdlib.h> // size_t
#include <vector_types.h> // CUDA vector types (float4, etc)
/*
* =============================================================================
* Flags for auto-optimization
* =============================================================================
*/
#define AUTO_OPTIMIZE (0) // DEPRECATED TODO remove
#define BOUNDCONDS_OPTIMIZE (0)
#define GENERATE_BENCHMARK_DATA (0)
#define VERBOSE_PRINTING (1)
// Device info
#define REGISTERS_PER_THREAD (255)
#define MAX_REGISTERS_PER_BLOCK (65536)
#define MAX_THREADS_PER_BLOCK (1024)
#define WARP_SIZE (32)
/*
* =============================================================================
* Compile-time constants used during simulation (user definable)
* =============================================================================
*/
// USER_PROVIDED_DEFINES must be defined in user.h if the user wants to override the following
// logical switches
#include "user.h"
// clang-format off
#ifndef USER_PROVIDED_DEFINES
#include "stencil_defines.h"
#endif
// clang-format on
/*
* =============================================================================
* Built-in parameters
* =============================================================================
*/
// clang-format off
#define AC_FOR_BUILTIN_INT_PARAM_TYPES(FUNC)\
/* cparams */\
FUNC(AC_nx), \
FUNC(AC_ny), \
FUNC(AC_nz), \
FUNC(AC_mx), \
FUNC(AC_my), \
FUNC(AC_mz), \
FUNC(AC_nx_min), \
FUNC(AC_ny_min), \
FUNC(AC_nz_min), \
FUNC(AC_nx_max), \
FUNC(AC_ny_max), \
FUNC(AC_nz_max), \
/* Additional */\
FUNC(AC_mxy),\
FUNC(AC_nxy),\
FUNC(AC_nxyz),
// clang-format on
/*
* =============================================================================
* Single/double precision switch
* =============================================================================
*/
// clang-format off
#if AC_DOUBLE_PRECISION == 1
typedef double AcReal;
typedef double3 AcReal3;
#define AC_REAL_MAX (DBL_MAX)
#define AC_REAL_MIN (DBL_MIN)
#define AC_REAL_EPSILON (DBL_EPSILON)
#else
typedef float AcReal;
typedef float3 AcReal3;
#define AC_REAL_MAX (FLT_MAX)
#define AC_REAL_MIN (FLT_MIN)
#define AC_REAL_EPSILON (FLT_EPSILON)
#endif
// clang-format on
typedef struct { typedef struct {
AcReal3 row[3]; int int_params[NUM_INT_PARAMS];
} AcMatrix; int3 int3_params[NUM_INT3_PARAMS];
AcReal real_params[NUM_REAL_PARAMS];
/* AcReal3 vec_params[NUM_REAL3_PARAMS];
* =============================================================================
* Helper macros
* =============================================================================
*/
#define AC_GEN_ID(X) X
#define AC_GEN_STR(X) #X
/*
* =============================================================================
* Error codes
* =============================================================================
*/
typedef enum { AC_SUCCESS = 0, AC_FAILURE = 1 } AcResult;
/*
* =============================================================================
* Reduction types
* =============================================================================
*/
typedef enum { RTYPE_MAX, RTYPE_MIN, RTYPE_RMS, RTYPE_RMS_EXP, NUM_REDUCTION_TYPES } ReductionType;
/*
* =============================================================================
* Definitions for the enums and structs for AcMeshInfo (DO NOT TOUCH)
* =============================================================================
*/
typedef enum {
AC_FOR_BUILTIN_INT_PARAM_TYPES(AC_GEN_ID) //
AC_FOR_USER_INT_PARAM_TYPES(AC_GEN_ID), //
NUM_INT_PARAM_TYPES
} AcIntParam;
typedef enum { AC_FOR_REAL_PARAM_TYPES(AC_GEN_ID), NUM_REAL_PARAM_TYPES } AcRealParam;
// typedef enum { AC_FOR_VEC_PARAM_TYPES(AC_GEN_ID), NUM_VEC_PARAM_TYPES } AcVecParam;
extern const char* intparam_names[]; // Defined in astaroth.cu
extern const char* realparam_names[]; // Defined in astaroth.cu
typedef struct {
int int_params[NUM_INT_PARAM_TYPES];
AcReal real_params[NUM_REAL_PARAM_TYPES];
// AcReal* vec_params[NUM_VEC_PARAM_TYPES];
} AcMeshInfo; } AcMeshInfo;
/*
* =============================================================================
* Definitions for the enums and structs for AcMesh (DO NOT TOUCH)
* =============================================================================
*/
typedef enum { AC_FOR_VTXBUF_HANDLES(AC_GEN_ID) NUM_VTXBUF_HANDLES } VertexBufferHandle;
extern const char* vtxbuf_names[]; // Defined in astaroth.cu
/*
typedef struct {
AcReal* data;
} VertexBuffer;
*/
// NOTE: there's no particular benefit declaring AcMesh a class, since
// a library user may already have allocated memory for the vertex_buffers.
// But then we would allocate memory again when the user wants to start
// filling the class with data. => Its better to consider AcMesh as a
// payload-only struct
typedef struct { typedef struct {
AcReal* vertex_buffer[NUM_VTXBUF_HANDLES]; AcReal* vertex_buffer[NUM_VTXBUF_HANDLES];
AcMeshInfo info; AcMeshInfo info;
} AcMesh; } AcMesh;
typedef enum {
STREAM_DEFAULT,
NUM_STREAM_TYPES, //
STREAM_ALL
} StreamType;
#define AC_VTXBUF_SIZE(mesh_info) \ #define AC_VTXBUF_SIZE(mesh_info) \
((size_t)(mesh_info.int_params[AC_mx] * mesh_info.int_params[AC_my] * \ ((size_t)(mesh_info.int_params[AC_mx] * mesh_info.int_params[AC_my] * \
mesh_info.int_params[AC_mz])) mesh_info.int_params[AC_mz]))
@@ -209,17 +54,6 @@ typedef struct {
((i) + (j)*mesh_info.int_params[AC_mx] + \ ((i) + (j)*mesh_info.int_params[AC_mx] + \
(k)*mesh_info.int_params[AC_mx] * mesh_info.int_params[AC_my]) (k)*mesh_info.int_params[AC_mx] * mesh_info.int_params[AC_my])
/*
* =============================================================================
* Astaroth interface: Basic functions. Synchronous.
* =============================================================================
*/
typedef enum {
STREAM_DEFAULT,
NUM_STREAM_TYPES, //
STREAM_ALL
} StreamType;
/** Checks whether there are any CUDA devices available. Returns AC_SUCCESS if there is 1 or more, /** Checks whether there are any CUDA devices available. Returns AC_SUCCESS if there is 1 or more,
* AC_FAILURE otherwise. */ * AC_FAILURE otherwise. */
AcResult acCheckDeviceAvailability(void); AcResult acCheckDeviceAvailability(void);
@@ -303,8 +137,3 @@ AcResult acIntegrateStepWithOffsetAsync(const int& isubstep, const AcReal& dt, c
/** Performs the boundary condition step on the GPUs in the node. Asynchronous. */ /** Performs the boundary condition step on the GPUs in the node. Asynchronous. */
AcResult acBoundcondStep(void); AcResult acBoundcondStep(void);
AcResult acBoundcondStepAsync(const StreamType stream); AcResult acBoundcondStepAsync(const StreamType stream);
/* End extern "C" */
#ifdef __cplusplus
}
#endif

109
include/astaroth_defines.h Normal file
View File

@@ -0,0 +1,109 @@
/*
Copyright (C) 2014-2019, Johannes Pekkilae, Miikka Vaeisalae.
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/>.
*/
#pragma once
#include <float.h> // FLT_EPSILON, etc
#include <stdlib.h> // size_t
#include <vector_types.h> // CUDA vector types (float4, etc)
#include "stencil_defines.h"
// Library flags
#define VERBOSE_PRINTING (1)
// Built-in types and parameters
#if AC_DOUBLE_PRECISION == 1
typedef double AcReal;
typedef double3 AcReal3;
#define AC_REAL_MAX (DBL_MAX)
#define AC_REAL_MIN (DBL_MIN)
#define AC_REAL_EPSILON (DBL_EPSILON)
#else
typedef float AcReal;
typedef float3 AcReal3;
#define AC_REAL_MAX (FLT_MAX)
#define AC_REAL_MIN (FLT_MIN)
#define AC_REAL_EPSILON (FLT_EPSILON)
#endif
typedef struct {
AcReal3 row[3];
} AcMatrix;
// clang-format off
#define AC_FOR_BUILTIN_INT_PARAM_TYPES(FUNC)\
FUNC(AC_nx), \
FUNC(AC_ny), \
FUNC(AC_nz), \
FUNC(AC_mx), \
FUNC(AC_my), \
FUNC(AC_mz), \
FUNC(AC_nx_min), \
FUNC(AC_ny_min), \
FUNC(AC_nz_min), \
FUNC(AC_nx_max), \
FUNC(AC_ny_max), \
FUNC(AC_nz_max), \
FUNC(AC_mxy),\
FUNC(AC_nxy),\
FUNC(AC_nxyz),\
#define AC_FOR_BUILTIN_INT3_PARAM_TYPES(FUNC)
#define AC_FOR_BUILTIN_REAL_PARAM_TYPES(FUNC)
#define AC_FOR_BUILTIN_REAL3_PARAM_TYPES(FUNC)
// clang-format on
typedef enum { AC_SUCCESS = 0, AC_FAILURE = 1 } AcResult;
typedef enum { RTYPE_MAX, RTYPE_MIN, RTYPE_RMS, RTYPE_RMS_EXP, NUM_REDUCTION_TYPES } ReductionType;
#define AC_GEN_ID(X) X
typedef enum {
AC_FOR_BUILTIN_INT_PARAM_TYPES(AC_GEN_ID) //
AC_FOR_USER_INT_PARAM_TYPES(AC_GEN_ID) //
NUM_INT_PARAMS
} AcIntParam;
typedef enum {
AC_FOR_BUILTIN_INT3_PARAM_TYPES(AC_GEN_ID) //
AC_FOR_USER_INT3_PARAM_TYPES(AC_GEN_ID) //
NUM_INT3_PARAMS
} AcInt3Param;
typedef enum {
AC_FOR_BUILTIN_REAL_PARAM_TYPES(AC_GEN_ID) //
AC_FOR_USER_REAL_PARAM_TYPES(AC_GEN_ID) //
NUM_REAL_PARAMS
} AcRealParam;
typedef enum {
AC_FOR_BUILTIN_REAL3_PARAM_TYPES(AC_GEN_ID) //
AC_FOR_USER_REAL3_PARAM_TYPES(AC_GEN_ID) //
NUM_REAL3_PARAMS
} AcReal3Param;
typedef enum { AC_FOR_VTXBUF_HANDLES(AC_GEN_ID) NUM_VTXBUF_HANDLES } VertexBufferHandle;
#undef AC_GEN_ID
extern const char* intparam_names[];
extern const char* int3param_names[];
extern const char* realparam_names[];
extern const char* real3param_names[];
extern const char* vtxbuf_names[];

View File

@@ -130,10 +130,17 @@
#include "math_utils.h" // sum for reductions #include "math_utils.h" // sum for reductions
#include "standalone/config_loader.h" // update_config #include "standalone/config_loader.h" // update_config
const char* intparam_names[] = {AC_FOR_BUILTIN_INT_PARAM_TYPES(AC_GEN_STR) #define AC_GEN_STR(X) #X
AC_FOR_USER_INT_PARAM_TYPES(AC_GEN_STR)}; const char* intparam_names[] = {AC_FOR_BUILTIN_INT_PARAM_TYPES(AC_GEN_STR) //
const char* realparam_names[] = {AC_FOR_REAL_PARAM_TYPES(AC_GEN_STR)}; AC_FOR_USER_INT_PARAM_TYPES(AC_GEN_STR)};
const char* vtxbuf_names[] = {AC_FOR_VTXBUF_HANDLES(AC_GEN_STR)}; const char* int3param_names[] = {AC_FOR_BUILTIN_INT3_PARAM_TYPES(AC_GEN_STR) //
AC_FOR_USER_INT3_PARAM_TYPES(AC_GEN_STR)};
const char* realparam_names[] = {AC_FOR_BUILTIN_REAL_PARAM_TYPES(AC_GEN_STR) //
AC_FOR_USER_REAL_PARAM_TYPES(AC_GEN_STR)};
const char* real3param_names[] = {AC_FOR_BUILTIN_REAL3_PARAM_TYPES(AC_GEN_STR) //
AC_FOR_USER_REAL3_PARAM_TYPES(AC_GEN_STR)};
const char* vtxbuf_names[] = {AC_FOR_VTXBUF_HANDLES(AC_GEN_STR)};
#undef AC_GEN_STR
static const int MAX_NUM_DEVICES = 32; static const int MAX_NUM_DEVICES = 32;
static int num_devices = 0; static int num_devices = 0;