7 #ifndef WARPX_GPU_PARSER_H_ 8 #define WARPX_GPU_PARSER_H_ 12 #include <AMReX_Gpu.H> 13 #include <AMReX_Array.H> 14 #include <AMReX_TypeTraits.H> 35 template <
typename... Ts>
37 std::enable_if_t<
sizeof...(Ts) == N
38 and amrex::Same<amrex::Real,Ts...>::value,
40 operator() (Ts... var)
const noexcept
43 amrex::GpuArray<amrex::Real,N> l_var{var...};
44 #if AMREX_DEVICE_COMPILE 46 return wp_ast_eval<0>(m_gpu_parser_ast, l_var.data());
49 return wp_ast_eval<0>(m_cpu_parser->ast,
nullptr);
55 int tid = omp_get_thread_num();
59 m_var[tid] = amrex::GpuArray<amrex::Real,N>{var...};
70 struct wp_node* m_gpu_parser_ast;
73 mutable amrex::GpuArray<amrex::Real,N>
m_var;
77 mutable amrex::GpuArray<amrex::Real,N>*
m_var;
85 AMREX_ALWAYS_ASSERT(wp.
depth() <= WARPX_PARSER_DEPTH);
93 for (
int i = 0;
i < N; ++
i) {
100 #else // not defined AMREX_USE_GPU 111 for (
int tid = 0; tid <
nthreads; ++tid)
115 for (
int i = 0;
i < N; ++
i) {
120 for (
int i = 0;
i < N; ++
i) {
126 #endif // AMREX_USE_GPU 138 for (
int i = 0;
i < N; ++
i) {
142 m_gpu_parser_ast = (
struct wp_node*)
143 amrex::The_Arena()->alloc(cpu_tmp->
sz_mempool);
144 amrex::Gpu::htod_memcpy_async(m_gpu_parser_ast, cpu_tmp->
ast, cpu_tmp->
sz_mempool);
146 auto dp = m_gpu_parser_ast;
147 char* droot = (
char*)dp;
148 char* croot = (
char*)(cpu_tmp->
ast);
149 amrex::single_task([=] AMREX_GPU_DEVICE () noexcept
151 wp_ast_update_device_ptr<0>(dp, droot, croot);
154 amrex::Gpu::synchronize();
158 amrex::ignore_unused(wp);
166 amrex::The_Arena()->free(m_gpu_parser_ast);
169 for (
int tid = 0; tid <
nthreads; ++tid)
void operator=(GpuParser< N > const &)=delete
void init_gpu_parser(WarpXParser const &wp)
Definition: GpuParser.H:130
struct wp_parser * m_parser
Definition: WarpXParser.H:78
struct wp_parser ** m_parser
Definition: GpuParser.H:76
Definition: wp_parser_y.h:145
size_t sz_mempool
Definition: wp_parser_y.h:149
struct wp_node * ast
Definition: wp_parser_y.h:148
struct wp_parser * wp_parser_dup(struct wp_parser *source)
Definition: wp_parser_y.cpp:131
i
Definition: check_interp_points_and_weights.py:171
amrex::GpuArray< amrex::Real, N > * m_var
Definition: GpuParser.H:77
Definition: wp_parser_y.h:91
void clear()
Definition: GpuParser.H:163
Definition: WarpXParser.H:26
std::vector< std::string > m_varnames
Definition: WarpXParser.H:80
int depth() const
Definition: WarpXParser.cpp:150
int nthreads
Definition: GpuParser.H:78
void wp_parser_delete(struct wp_parser *parser)
Definition: wp_parser_y.cpp:106
void wp_parser_regvar(struct wp_parser *parser, char const *name, amrex_real *p)
Definition: wp_parser_y.cpp:1087
void wp_parser_regvar_gpu(struct wp_parser *parser, char const *name, int i)
Definition: wp_parser_y.cpp:1093
GpuParser(WarpXParser const &wp)
Definition: GpuParser.H:83
Definition: GpuParser.H:23