aboutsummaryrefslogtreecommitdiff
path: root/Source/Parser/GpuParser.cpp
blob: 22fab6313be9a521e201e60d74ab014e303efb68 (plain) (blame)
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
}