1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
|
/* Copyright 2019-2020 Maxence Thevenet, Revathi Jambunathan, Weiqun Zhang
*
*
* This file is part of WarpX.
*
* License: BSD-3-Clause-LBNL
*/
#include <GpuParser.H>
GpuParser::GpuParser (WarpXParser const& wp)
{
#ifdef AMREX_USE_GPU
struct wp_parser* a_wp = wp.m_parser;
// Initialize GPU parser: allocate memory in CUDA managed memory,
// copy all data needed on GPU to m_gpu_parser
m_gpu_parser.sz_mempool = wp_ast_size(a_wp->ast);
m_gpu_parser.p_root = (struct wp_node*)
amrex::The_Managed_Arena()->alloc(m_gpu_parser.sz_mempool);
m_gpu_parser.p_free = m_gpu_parser.p_root;
// 0: don't free the source
m_gpu_parser.ast = wp_parser_ast_dup(&m_gpu_parser, a_wp->ast, 0);
wp_parser_regvar_gpu(&m_gpu_parser, "x", 0);
wp_parser_regvar_gpu(&m_gpu_parser, "y", 1);
wp_parser_regvar_gpu(&m_gpu_parser, "z", 2);
wp_parser_regvar_gpu(&m_gpu_parser, "t", 3);
// Initialize CPU parser: allocate memory in CUDA managed memory,
// copy all data needed on CPU to m_cpu_parser
m_cpu_parser.sz_mempool = wp_ast_size(a_wp->ast);
m_cpu_parser.p_root = (struct wp_node*)
amrex::The_Managed_Arena()->alloc(m_cpu_parser.sz_mempool);
m_cpu_parser.p_free = m_cpu_parser.p_root;
// 0: don't free the source
m_cpu_parser.ast = wp_parser_ast_dup(&m_cpu_parser, a_wp->ast, 0);
wp_parser_regvar(&m_cpu_parser, "x", &(m_var.x));
wp_parser_regvar(&m_cpu_parser, "y", &(m_var.y));
wp_parser_regvar(&m_cpu_parser, "z", &(m_var.z));
wp_parser_regvar(&m_cpu_parser, "t", &(m_t));
#else // not defined AMREX_USE_GPU
#ifdef _OPENMP
nthreads = omp_get_max_threads();
#else // _OPENMP
nthreads = 1;
#endif // _OPENMP
m_parser = ::new struct wp_parser*[nthreads];
m_var = ::new amrex::XDim3[nthreads];
m_t = ::new amrex::Real[nthreads];
for (int tid = 0; tid < nthreads; ++tid)
{
#ifdef _OPENMP
m_parser[tid] = wp_parser_dup(wp.m_parser[tid]);
#else // _OPENMP
m_parser[tid] = wp_parser_dup(wp.m_parser);
#endif // _OPENMP
wp_parser_regvar(m_parser[tid], "x", &(m_var[tid].x));
wp_parser_regvar(m_parser[tid], "y", &(m_var[tid].y));
wp_parser_regvar(m_parser[tid], "z", &(m_var[tid].z));
wp_parser_regvar(m_parser[tid], "t", &(m_t[tid]));
}
#endif // AMREX_USE_GPU
}
void
GpuParser::clear ()
{
#ifdef AMREX_USE_GPU
amrex::The_Managed_Arena()->free(m_gpu_parser.ast);
amrex::The_Managed_Arena()->free(m_cpu_parser.ast);
#else
for (int tid = 0; tid < nthreads; ++tid)
{
wp_parser_delete(m_parser[tid]);
}
::delete[] m_parser;
::delete[] m_var;
#endif
}
|