-
Notifications
You must be signed in to change notification settings - Fork 9
Expand file tree
/
Copy pathbenchmarkArrayOfArraysNodeToElementMapConstructionKernels.cpp
More file actions
135 lines (116 loc) · 4.72 KB
/
benchmarkArrayOfArraysNodeToElementMapConstructionKernels.cpp
File metadata and controls
135 lines (116 loc) · 4.72 KB
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
* Copyright (c) 2021, Lawrence Livermore National Security, LLC and LvArray contributors.
* All rights reserved.
* See the LICENSE file for details.
* SPDX-License-Identifier: (BSD-3-Clause)
*/
// Source includes
#include "benchmarkArrayOfArraysNodeToElementMapConstructionKernels.hpp"
namespace LvArray
{
namespace benchmarking
{
// Sphinx start after vector
void NaiveNodeToElemMapConstruction::
vector( ArrayViewT< INDEX_TYPE const, RAJA::PERM_IJ > const & elementToNodeMap,
std::vector< std::vector< INDEX_TYPE > > & nodeToElementMap,
INDEX_TYPE const numNodes )
{
nodeToElementMap.resize( numNodes );
for( INDEX_TYPE elementIndex = 0; elementIndex < elementToNodeMap.size( 0 ); ++elementIndex )
{
for( INDEX_TYPE const nodeIndex : elementToNodeMap[ elementIndex ] )
{
nodeToElementMap[ nodeIndex ].emplace_back( elementIndex );
}
}
}
// Sphinx end before vector
// Sphinx start after naive
void NaiveNodeToElemMapConstruction::
naive( ArrayViewT< INDEX_TYPE const, RAJA::PERM_IJ > const & elementToNodeMap,
ArrayOfArrays< INDEX_TYPE, INDEX_TYPE, DEFAULT_BUFFER > & nodeToElementMap,
INDEX_TYPE const numNodes )
{
nodeToElementMap.resize( numNodes );
for( INDEX_TYPE elementIndex = 0; elementIndex < elementToNodeMap.size( 0 ); ++elementIndex )
{
for( INDEX_TYPE const nodeIndex : elementToNodeMap[ elementIndex ] )
{
nodeToElementMap.emplaceBack( nodeIndex, elementIndex );
}
}
}
// Sphinx end before naive
// Sphinx start after overAllocation
template< typename POLICY >
void NodeToElemMapConstruction< POLICY >::
overAllocation( ArrayViewT< INDEX_TYPE const, RAJA::PERM_IJ > const & elementToNodeMap,
ArrayOfArrays< INDEX_TYPE, INDEX_TYPE, DEFAULT_BUFFER > & nodeToElementMap,
INDEX_TYPE const numNodes,
INDEX_TYPE const maxNodeElements )
{
using ATOMIC_POLICY = typename RAJAHelper< POLICY >::AtomicPolicy;
// Resize the node to element map allocating space for each inner array.
nodeToElementMap.resize( numNodes, maxNodeElements );
// Create an ArrayOfArraysView
ArrayOfArraysView< INDEX_TYPE, INDEX_TYPE const, false, DEFAULT_BUFFER > const nodeToElementMapView =
nodeToElementMap.toView();
// Launch a RAJA kernel that populates the ArrayOfArraysView.
RAJA::forall< POLICY >(
RAJA::TypedRangeSegment< INDEX_TYPE >( 0, elementToNodeMap.size( 0 ) ),
[elementToNodeMap, nodeToElementMapView] ( INDEX_TYPE const elementIndex )
{
for( INDEX_TYPE const nodeIndex : elementToNodeMap[ elementIndex ] )
{
nodeToElementMapView.emplaceBackAtomic< ATOMIC_POLICY >( nodeIndex, elementIndex );
}
}
);
}
// Sphinx end before overAllocation
// Sphinx start after resizeFromCapacities
template< typename POLICY >
void NodeToElemMapConstruction< POLICY >::
resizeFromCapacities( ArrayViewT< INDEX_TYPE const, RAJA::PERM_IJ > const & elementToNodeMap,
ArrayOfArrays< INDEX_TYPE, INDEX_TYPE, DEFAULT_BUFFER > & nodeToElementMap,
INDEX_TYPE const numNodes )
{
using ATOMIC_POLICY = typename RAJAHelper< POLICY >::AtomicPolicy;
// Create an Array containing the size of each inner array.
Array< INDEX_TYPE, DynamicExtent< 1, INDEX_TYPE >, RAJA::PERM_I, DEFAULT_BUFFER > elementsPerNode( numNodes );
// Calculate the size of each inner array.
RAJA::forall< POLICY >(
RAJA::TypedRangeSegment< INDEX_TYPE >( 0, elementToNodeMap.size( 0 ) ),
[elementToNodeMap, &elementsPerNode] ( INDEX_TYPE const elementIndex )
{
for( INDEX_TYPE const nodeIndex : elementToNodeMap[ elementIndex ] )
{
RAJA::atomicInc< ATOMIC_POLICY >( &elementsPerNode[ nodeIndex ] );
}
}
);
// Resize the node to element map with the inner array sizes.
nodeToElementMap.resizeFromCapacities< POLICY >( elementsPerNode.size(), elementsPerNode.data() );
// Create an ArrayOfArraysView
ArrayOfArraysView< INDEX_TYPE, INDEX_TYPE const, false, DEFAULT_BUFFER > const nodeToElementMapView =
nodeToElementMap.toView();
// Launch a RAJA kernel that populates the ArrayOfArraysView.
RAJA::forall< POLICY >(
RAJA::TypedRangeSegment< INDEX_TYPE >( 0, elementToNodeMap.size( 0 ) ),
[elementToNodeMap, nodeToElementMapView] ( INDEX_TYPE const elementIndex )
{
for( INDEX_TYPE const nodeIndex : elementToNodeMap[ elementIndex ] )
{
nodeToElementMapView.emplaceBackAtomic< ATOMIC_POLICY >( nodeIndex, elementIndex );
}
} );
}
// Sphinx end before resizeFromCapacities
// Explicit instantiation of NodeToElemMapConstruction.
template class NodeToElemMapConstruction< serialPolicy >;
#if defined(RAJA_ENABLE_OPENMP)
template class NodeToElemMapConstruction< parallelHostPolicy >;
#endif
} // namespace benchmarking
} // namespace LvArray