milupHPC documentation
  • src
  • subdomain_key_tree
tree_handler.cpp
Go to the documentation of this file.
1#include "../../include/subdomain_key_tree/tree_handler.h"
2
3TreeHandler::TreeHandler(integer numParticles, integer numNodes) : numParticles(numParticles),
4 numNodes(numNodes) {
5
6 cuda::malloc(d_count, numNodes);
7 cuda::malloc(d_start, numNodes);
8 cuda::malloc(d_sorted, numNodes);
9 cuda::malloc(d_child, POW_DIM * numNodes);
10 cuda::malloc(d_index, 1);
11 h_index = new integer;
12 cuda::malloc(d_mutex, 1);
13
14 cuda::malloc(d_minX, 1);
15 cuda::malloc(d_maxX, 1);
16 h_minX = new real;
17 h_maxX = new real;
18#if DIM > 1
19 cuda::malloc(d_minY, 1);
20 cuda::malloc(d_maxY, 1);
21 h_minY = new real;
22 h_maxY = new real;
23#if DIM == 3
24 cuda::malloc(d_minZ, 1);
25 cuda::malloc(d_maxZ, 1);
26 h_minZ = new real;
27 h_maxZ = new real;
28#endif
29#endif
30
31 h_toDeleteLeaf = new integer[2];
32 h_toDeleteNode = new integer[2];
33 cuda::malloc(d_toDeleteLeaf, 2);
34 cuda::malloc(d_toDeleteNode, 2);
35
36 cuda::malloc(d_tree, 1);
37
38#if DIM == 1
39 TreeNS::Kernel::Launch::set(d_tree, d_count, d_start, d_child, d_sorted, d_index, d_toDeleteLeaf, d_toDeleteNode,
40 d_minX, d_maxX);
41#elif DIM == 2
42 TreeNS::Kernel::Launch::set(d_tree, d_count, d_start, d_child, d_sorted, d_index, d_toDeleteLeaf, d_toDeleteNode,
43 d_minX, d_maxX, d_minY, d_maxY);
44#else
45 TreeNS::Kernel::Launch::set(d_tree, d_count, d_start, d_child, d_sorted, d_index, d_toDeleteLeaf, d_toDeleteNode,
46 d_minX, d_maxX, d_minY, d_maxY, d_minZ, d_maxZ);
47#endif
48
49}
50
51TreeHandler::~TreeHandler() {
52
53 cuda::free(d_count);
54 cuda::free(d_start);
55 cuda::free(d_sorted);
56 cuda::free(d_child);
57 cuda::free(d_index);
58 cuda::free(d_mutex);
59
60 cuda::free(d_minX);
61 cuda::free(d_maxX);
62 delete h_minX;
63 delete h_maxX;
64#if DIM > 1
65 cuda::free(d_minY);
66 cuda::free(d_maxY);
67 delete h_minY;
68 delete h_maxY;
69#if DIM == 3
70 cuda::free(d_minZ);
71 cuda::free(d_maxZ);
72 delete h_minZ;
73 delete h_maxZ;
74#endif
75#endif
76
77 delete [] h_toDeleteLeaf;
78 delete [] h_toDeleteNode;
79 cuda::free(d_toDeleteLeaf);
80 cuda::free(d_toDeleteNode);
81
82 cuda::free(d_tree);
83
84}
85
86void TreeHandler::copy(To::Target target, bool borders, bool index, bool toDelete) {
87
88 if (borders) {
89 cuda::copy(h_minX, d_minX, 1, target);
90 cuda::copy(h_maxX, d_maxX, 1, target);
91#if DIM > 1
92 cuda::copy(h_minY, d_minY, 1, target);
93 cuda::copy(h_maxY, d_maxY, 1, target);
94#if DIM == 3
95 cuda::copy(h_minZ, d_minZ, 1, target);
96 cuda::copy(h_maxZ, d_maxZ, 1, target);
97#endif
98#endif
99 }
100 if (index) {
101 cuda::copy(h_index, d_index, 1, target);
102 }
103 if (toDelete) {
104 cuda::copy(h_toDeleteLeaf, d_toDeleteLeaf, 2, target);
105 cuda::copy(h_toDeleteNode, d_toDeleteNode, 2, target);
106 }
107
108}
109
110void TreeHandler::globalizeBoundingBox(Execution::Location exLoc) {
111
112 boost::mpi::communicator comm;
113
114 switch (exLoc) {
115 case Execution::device:
116 all_reduce(comm, boost::mpi::inplace_t<real*>(d_minX), 1, boost::mpi::minimum<real>());
117 all_reduce(comm, boost::mpi::inplace_t<real*>(d_maxX), 1, boost::mpi::maximum<real>());
118#if DIM > 1
119 all_reduce(comm, boost::mpi::inplace_t<real*>(d_minY), 1, boost::mpi::minimum<real>());
120 all_reduce(comm, boost::mpi::inplace_t<real*>(d_maxY), 1, boost::mpi::maximum<real>());
121#if DIM == 3
122 all_reduce(comm, boost::mpi::inplace_t<real*>(d_minZ), 1, boost::mpi::minimum<real>());
123 all_reduce(comm, boost::mpi::inplace_t<real*>(d_maxZ), 1, boost::mpi::maximum<real>());
124#endif
125#endif
126 break;
127 case Execution::host:
128 all_reduce(comm, boost::mpi::inplace_t<real*>(h_minX), 1, boost::mpi::minimum<real>());
129 all_reduce(comm, boost::mpi::inplace_t<real*>(h_maxX), 1, boost::mpi::maximum<real>());
130#if DIM > 1
131 all_reduce(comm, boost::mpi::inplace_t<real*>(h_minY), 1, boost::mpi::minimum<real>());
132 all_reduce(comm, boost::mpi::inplace_t<real*>(h_maxY), 1, boost::mpi::maximum<real>());
133#if DIM == 3
134 all_reduce(comm, boost::mpi::inplace_t<real*>(h_minZ), 1, boost::mpi::minimum<real>());
135 all_reduce(comm, boost::mpi::inplace_t<real*>(h_maxZ), 1, boost::mpi::maximum<real>());
136#endif
137#endif
138 break;
139 default:
140 Logger(ERROR) << "not available!";
141 }
142
143}
144
Logger
Logger class.
Definition: logger.h:80
TreeHandler::d_tree
Tree * d_tree
device instance of Class Tree
Definition: tree_handler.h:85
TreeHandler::h_minX
real * h_minX
host (pointer to) bounding box minimal x
Definition: tree_handler.h:60
TreeHandler::h_minY
real * h_minY
host (pointer to) bounding box minimal y
Definition: tree_handler.h:69
TreeHandler::d_mutex
integer * d_mutex
device (pointer to) mutex/lock
Definition: tree_handler.h:44
TreeHandler::d_sorted
integer * d_sorted
device (pointer to) sorted (array)
Definition: tree_handler.h:36
TreeHandler::h_maxX
real * h_maxX
host (pointer to) bounding box maximal x
Definition: tree_handler.h:62
TreeHandler::h_index
integer * h_index
host (pointer to) index
Definition: tree_handler.h:42
TreeHandler::h_toDeleteLeaf
integer * h_toDeleteLeaf
host (pointer to) array remembering leaf indices for rebuilding after temporarily inserting particles
Definition: tree_handler.h:47
TreeHandler::d_maxX
real * d_maxX
device (pointer to) bounding box maximal x
Definition: tree_handler.h:58
TreeHandler::d_maxZ
real * d_maxZ
device (pointer to) bounding box maximal z
Definition: tree_handler.h:76
TreeHandler::h_toDeleteNode
integer * h_toDeleteNode
host (pointer to) array remembering leaf indices for rebuilding after temporarily inserting particles
Definition: tree_handler.h:49
TreeHandler::d_start
integer * d_start
device (pointer to) start (array)
Definition: tree_handler.h:34
TreeHandler::d_toDeleteLeaf
integer * d_toDeleteLeaf
device (pointer to) array remembering leaf indices for rebuilding after temporarily inserting particl...
Definition: tree_handler.h:51
TreeHandler::d_minZ
real * d_minZ
device (pointer to) bounding box minimal z
Definition: tree_handler.h:74
TreeHandler::d_index
integer * d_index
device (pointer to) index
Definition: tree_handler.h:40
TreeHandler::d_minX
real * d_minX
device (pointer to) bounding box minimal x
Definition: tree_handler.h:56
TreeHandler::copy
void copy(To::Target target=To::device, bool borders=true, bool index=true, bool toDelete=true)
Copy (parts of the) tree instance(s) between host and device.
Definition: tree_handler.cpp:86
TreeHandler::h_maxY
real * h_maxY
host (pointer to) bounding box maximal y
Definition: tree_handler.h:71
TreeHandler::TreeHandler
TreeHandler(integer numParticles, integer numNodes)
Constructor.
Definition: tree_handler.cpp:3
TreeHandler::numNodes
integer numNodes
number of nodes
Definition: tree_handler.h:29
TreeHandler::d_minY
real * d_minY
device (pointer to) bounding box minimal y
Definition: tree_handler.h:65
TreeHandler::h_minZ
real * h_minZ
host (pointer to) bounding box minimal z
Definition: tree_handler.h:78
TreeHandler::d_maxY
real * d_maxY
device (pointer to) bounding box maximal y
Definition: tree_handler.h:67
TreeHandler::~TreeHandler
~TreeHandler()
Destructor.
Definition: tree_handler.cpp:51
TreeHandler::h_maxZ
real * h_maxZ
host (pointer to) bounding box maximal x
Definition: tree_handler.h:80
TreeHandler::d_count
integer * d_count
device (pointer to) count (array)
Definition: tree_handler.h:32
TreeHandler::globalizeBoundingBox
void globalizeBoundingBox(Execution::Location exLoc=Execution::device)
All reduce bounding box(es)/borders (among MPI processes)
Definition: tree_handler.cpp:110
TreeHandler::d_child
integer * d_child
device (pointer to) child/children (array)
Definition: tree_handler.h:38
TreeHandler::d_toDeleteNode
integer * d_toDeleteNode
device (pointer to) array remembering leaf indices for rebuilding after temporarily inserting particl...
Definition: tree_handler.h:53
ERROR
@ ERROR
warning log type
Definition: logger.h:51
ProfilerIds::numParticles
const char *const numParticles
Definition: h5profiler.h:29
TreeNS::Kernel::Launch::set
void set(Tree *tree, integer *count, integer *start, integer *child, integer *sorted, integer *index, integer *toDeleteLeaf, integer *toDeleteNode, real *minX, real *maxX)
Wrapper for TreeNS::Kernel::set()
Definition: tree.cu:1869
cuda::copy
void copy(T *h_var, T *d_var, std::size_t count=1, To::Target copyTo=To::device)
Copy between host and device and vice-versa.
Definition: cuda_runtime.h:30
cuda::free
void free(T *d_var)
Free device memory.
Definition: cuda_runtime.h:81
cuda::malloc
void malloc(T *&d_var, std::size_t count)
Allocate device memory.
Definition: cuda_runtime.h:70
real
double real
Definition: parameter.h:15
integer
int integer
Definition: parameter.h:17
POW_DIM
#define POW_DIM
Definition: parameter.h:40
Execution::Location
Location
Definition: parameter.h:192
Execution::device
@ device
Definition: parameter.h:193
Execution::host
@ host
Definition: parameter.h:193
To::Target
Target
Definition: parameter.h:164

milupHPC - src/subdomain_key_tree/tree_handler.cpp Source File
Generated on Wed Aug 31 2022 12:16:53 by Doxygen 1.9.3