Skip to content

Commit 5d63bf0

Browse files
committed
WIP on new layouts
1 parent bc43fa5 commit 5d63bf0

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+3112
-1560
lines changed

benchmarks/benchmarkArray1DR2TensorMultiplicationKernels.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,18 +52,18 @@ namespace benchmarking
5252
RAJA_OUTER_LOOP( N, INNER_LOOP( a_ijl, b_ilk, c_ijk ) )
5353

5454

55-
template< typename VALUE_TYPE_CONST, int USD >
55+
template< typename VALUE_TYPE_CONST, typename LAYOUT, std::enable_if_t< LAYOUT::NDIM == 2 >* = nullptr >
5656
inline LVARRAY_HOST_DEVICE constexpr
57-
void R2TensorMultiplyFortran( LvArray::ArraySlice< VALUE_TYPE_CONST, 2, USD, INDEX_TYPE > const a,
58-
LvArray::ArraySlice< VALUE_TYPE_CONST, 2, USD, INDEX_TYPE > const b,
59-
LvArray::ArraySlice< VALUE_TYPE, 2, USD, INDEX_TYPE > const c )
57+
void R2TensorMultiplyFortran( LvArray::ArraySlice< VALUE_TYPE_CONST, LAYOUT > const a,
58+
LvArray::ArraySlice< VALUE_TYPE_CONST, LAYOUT > const b,
59+
LvArray::ArraySlice< VALUE_TYPE, LAYOUT > const c )
6060
{ INNER_LOOP( a( j, l ), b( l, k ), c( j, k ) ) }
6161

62-
template< typename VALUE_TYPE_CONST, int USD >
62+
template< typename VALUE_TYPE_CONST, typename LAYOUT, std::enable_if_t< LAYOUT::NDIM == 2 >* = nullptr >
6363
RAJA_INLINE LVARRAY_HOST_DEVICE constexpr
64-
void R2TensorMultiplySubscript( LvArray::ArraySlice< VALUE_TYPE_CONST, 2, USD, INDEX_TYPE > const a,
65-
LvArray::ArraySlice< VALUE_TYPE_CONST, 2, USD, INDEX_TYPE > const b,
66-
LvArray::ArraySlice< VALUE_TYPE, 2, USD, INDEX_TYPE > const c )
64+
void R2TensorMultiplySubscript( LvArray::ArraySlice< VALUE_TYPE_CONST, LAYOUT > const a,
65+
LvArray::ArraySlice< VALUE_TYPE_CONST, LAYOUT > const b,
66+
LvArray::ArraySlice< VALUE_TYPE, LAYOUT > const c )
6767
{ INNER_LOOP( a[ j ][ l ], b[ l ][ k ], c[ j ][ k ] ) }
6868

6969

benchmarks/benchmarkArrayOfArraysNodeToElementMapConstructionKernels.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ namespace benchmarking
1515

1616
// Sphinx start after vector
1717
void NaiveNodeToElemMapConstruction::
18-
vector( ArrayView< INDEX_TYPE const, 2, 1, INDEX_TYPE, DEFAULT_BUFFER > const & elementToNodeMap,
18+
vector( ArrayViewT< INDEX_TYPE const, RAJA::PERM_IJ > const & elementToNodeMap,
1919
std::vector< std::vector< INDEX_TYPE > > & nodeToElementMap,
2020
INDEX_TYPE const numNodes )
2121
{
@@ -33,7 +33,7 @@ void NaiveNodeToElemMapConstruction::
3333

3434
// Sphinx start after naive
3535
void NaiveNodeToElemMapConstruction::
36-
naive( ArrayView< INDEX_TYPE const, 2, 1, INDEX_TYPE, DEFAULT_BUFFER > const & elementToNodeMap,
36+
naive( ArrayViewT< INDEX_TYPE const, RAJA::PERM_IJ > const & elementToNodeMap,
3737
ArrayOfArrays< INDEX_TYPE, INDEX_TYPE, DEFAULT_BUFFER > & nodeToElementMap,
3838
INDEX_TYPE const numNodes )
3939
{
@@ -52,7 +52,7 @@ void NaiveNodeToElemMapConstruction::
5252
// Sphinx start after overAllocation
5353
template< typename POLICY >
5454
void NodeToElemMapConstruction< POLICY >::
55-
overAllocation( ArrayView< INDEX_TYPE const, 2, 1, INDEX_TYPE, DEFAULT_BUFFER > const & elementToNodeMap,
55+
overAllocation( ArrayViewT< INDEX_TYPE const, RAJA::PERM_IJ > const & elementToNodeMap,
5656
ArrayOfArrays< INDEX_TYPE, INDEX_TYPE, DEFAULT_BUFFER > & nodeToElementMap,
5757
INDEX_TYPE const numNodes,
5858
INDEX_TYPE const maxNodeElements )
@@ -83,14 +83,14 @@ overAllocation( ArrayView< INDEX_TYPE const, 2, 1, INDEX_TYPE, DEFAULT_BUFFER >
8383
// Sphinx start after resizeFromCapacities
8484
template< typename POLICY >
8585
void NodeToElemMapConstruction< POLICY >::
86-
resizeFromCapacities( ArrayView< INDEX_TYPE const, 2, 1, INDEX_TYPE, DEFAULT_BUFFER > const & elementToNodeMap,
86+
resizeFromCapacities( ArrayViewT< INDEX_TYPE const, RAJA::PERM_IJ > const & elementToNodeMap,
8787
ArrayOfArrays< INDEX_TYPE, INDEX_TYPE, DEFAULT_BUFFER > & nodeToElementMap,
8888
INDEX_TYPE const numNodes )
8989
{
9090
using ATOMIC_POLICY = typename RAJAHelper< POLICY >::AtomicPolicy;
9191

9292
// Create an Array containing the size of each inner array.
93-
Array< INDEX_TYPE, 1, RAJA::PERM_I, INDEX_TYPE, DEFAULT_BUFFER > elementsPerNode( numNodes );
93+
Array< INDEX_TYPE, DynamicExtent< 1, INDEX_TYPE >, RAJA::PERM_I, DEFAULT_BUFFER > elementsPerNode( numNodes );
9494

9595
// Calculate the size of each inner array.
9696
RAJA::forall< POLICY >(

benchmarks/benchmarkHelpers.hpp

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,13 @@ inline std::string typeToString( RAJA::PERM_KJI const & ) { return "RAJA::PERM_K
6666
using INDEX_TYPE = std::ptrdiff_t;
6767

6868
template< typename T, typename PERMUTATION >
69-
using ArrayT = LvArray::Array< T, typeManipulation::getDimension< PERMUTATION >, PERMUTATION, INDEX_TYPE, DEFAULT_BUFFER >;
69+
using ArrayT = LvArray::Array< T, DynamicExtent< typeManipulation::getDimension< PERMUTATION >, INDEX_TYPE >, PERMUTATION, DEFAULT_BUFFER >;
7070

7171
template< typename T, typename PERMUTATION >
72-
using ArrayViewT = LvArray::ArrayView< T,
73-
typeManipulation::getDimension< PERMUTATION >,
74-
typeManipulation::getStrideOneDimension( PERMUTATION {} ),
75-
INDEX_TYPE,
76-
DEFAULT_BUFFER >;
72+
using ArrayViewT = LvArray::ArrayView< T, DynamicLayout< typeManipulation::getDimension< PERMUTATION >, INDEX_TYPE, PERMUTATION >, DEFAULT_BUFFER >;
7773

7874
template< typename T, typename PERMUTATION >
79-
using ArraySliceT = LvArray::ArraySlice< T,
80-
typeManipulation::getDimension< PERMUTATION >,
81-
typeManipulation::getStrideOneDimension( PERMUTATION {} ),
82-
INDEX_TYPE >;
75+
using ArraySliceT = LvArray::ArraySlice< T, DynamicLayout< typeManipulation::getDimension< PERMUTATION >, INDEX_TYPE, PERMUTATION > >;
8376

8477
template< typename T, typename PERMUTATION >
8578
using RajaView = RAJA::View< T,
@@ -145,8 +138,8 @@ inline std::uint_fast64_t getSeed()
145138
}
146139

147140

148-
template< typename T, int NDIM, int USD >
149-
void initialize( ArraySlice< T, NDIM, USD, INDEX_TYPE > const slice, int & iter )
141+
template< typename T, typename LAYOUT >
142+
void initialize( ArraySlice< T, LAYOUT > const slice, int & iter )
150143
{
151144
++iter;
152145
std::mt19937_64 gen( iter * getSeed() );
@@ -171,7 +164,7 @@ RajaView< T, PERMUTATION > makeRajaView( ArrayT< T, PERMUTATION > const & array
171164

172165
for( int i = 0; i < NDIM; ++i )
173166
{
174-
sizes[ i ] = array.dims()[ i ];
167+
sizes[ i ] = array.size( i );
175168
}
176169

177170
constexpr std::array< camp::idx_t, NDIM > const permutation = RAJA::as_array< PERMUTATION >::get();

examples/exampleArray.cpp

Lines changed: 36 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,8 @@ TEST( Array, constructors )
3131
{
3232
// Create an empty 2D array of integers.
3333
LvArray::Array< int,
34-
2,
34+
LvArray::DynamicExtent< 2, std::ptrdiff_t >,
3535
camp::idx_seq< 0, 1 >,
36-
std::ptrdiff_t,
3736
LvArray::MallocBuffer > array;
3837
EXPECT_TRUE( array.empty() );
3938
EXPECT_EQ( array.size(), 0 );
@@ -44,9 +43,8 @@ TEST( Array, constructors )
4443
{
4544
// Create a 3D array of std::string of size 3 x 4 x 5.
4645
LvArray::Array< std::string,
47-
3,
46+
LvArray::DynamicExtent< 3, std::ptrdiff_t >,
4847
camp::idx_seq< 0, 1, 2 >,
49-
std::ptrdiff_t,
5048
LvArray::MallocBuffer > array( 3, 4, 5 );
5149
EXPECT_FALSE( array.empty() );
5250
EXPECT_EQ( array.size(), 3 * 4 * 5 );
@@ -69,9 +67,8 @@ TEST( Array, accessors )
6967
{
7068
// Create a 2D array of integers.
7169
LvArray::Array< int,
72-
2,
70+
LvArray::DynamicExtent< 2, std::ptrdiff_t >,
7371
camp::idx_seq< 0, 1 >,
74-
std::ptrdiff_t,
7572
LvArray::MallocBuffer > array( 3, 4 );
7673

7774
// Access using operator().
@@ -100,15 +97,14 @@ TEST( Array, permutations )
10097
{
10198
// Create a 3D array of doubles in the standard layout.
10299
LvArray::Array< int,
103-
3,
100+
LvArray::DynamicExtent< 3, std::ptrdiff_t >,
104101
camp::idx_seq< 0, 1, 2 >,
105-
std::ptrdiff_t,
106102
LvArray::MallocBuffer > array( 3, 4, 5 );
107103

108104
// Index 0 has the largest stride while index 2 has unit stride.
109-
EXPECT_EQ( array.strides()[ 0 ], array.size( 2 ) * array.size( 1 ) );
110-
EXPECT_EQ( array.strides()[ 1 ], array.size( 2 ) );
111-
EXPECT_EQ( array.strides()[ 2 ], 1 );
105+
EXPECT_EQ( array.stride< 0 >(), array.size( 2 ) * array.size( 1 ) );
106+
EXPECT_EQ( array.stride< 1 >(), array.size( 2 ) );
107+
EXPECT_EQ( array.stride< 2 >(), 1 );
112108

113109
int const * const pointer = array.data();
114110
for( std::ptrdiff_t i = 0; i < array.size( 0 ); ++i )
@@ -128,15 +124,14 @@ TEST( Array, permutations )
128124
{
129125
// Create a 3D array of doubles in a flipped layout.
130126
LvArray::Array< int,
131-
3,
127+
LvArray::DynamicExtent< 3, std::ptrdiff_t >,
132128
camp::idx_seq< 2, 1, 0 >,
133-
std::ptrdiff_t,
134129
LvArray::MallocBuffer > array( 3, 4, 5 );
135130

136131
// Index 0 has the unit stride while index 2 has the largest stride.
137-
EXPECT_EQ( array.strides()[ 0 ], 1 );
138-
EXPECT_EQ( array.strides()[ 1 ], array.size( 0 ) );
139-
EXPECT_EQ( array.strides()[ 2 ], array.size( 0 ) * array.size( 1 ) );
132+
EXPECT_EQ( array.stride< 0 >(), 1 );
133+
EXPECT_EQ( array.stride< 1 >(), array.size( 0 ) );
134+
EXPECT_EQ( array.stride< 2 >(), array.size( 0 ) * array.size( 1 ) );
140135

141136
int const * const pointer = array.data();
142137
for( std::ptrdiff_t i = 0; i < array.size( 0 ); ++i )
@@ -159,9 +154,8 @@ TEST( Array, permutations )
159154
TEST( Array, resize )
160155
{
161156
LvArray::Array< int,
162-
3,
157+
LvArray::DynamicExtent< 3, std::ptrdiff_t >,
163158
camp::idx_seq< 0, 1, 2 >,
164-
std::ptrdiff_t,
165159
LvArray::MallocBuffer > array;
166160

167161
// Resize using a pointer
@@ -192,9 +186,8 @@ TEST( Array, resize )
192186
TEST( Array, resizeSingleDimension )
193187
{
194188
LvArray::Array< int,
195-
2,
189+
LvArray::DynamicExtent< 2, std::ptrdiff_t >,
196190
camp::idx_seq< 1, 0 >,
197-
std::ptrdiff_t,
198191
LvArray::MallocBuffer > array( 5, 6 );
199192

200193
for( std::ptrdiff_t i = 0; i < array.size( 0 ); ++i )
@@ -223,8 +216,7 @@ TEST( Array, resizeSingleDimension )
223216
}
224217

225218
// Shrink the second dimension from 6 to 3;
226-
array.setSingleParameterResizeIndex( 1 );
227-
array.resize( 3 );
219+
array.resizeDimension< 1 >( 3 );
228220
for( std::ptrdiff_t i = 0; i < array.size( 0 ); ++i )
229221
{
230222
for( std::ptrdiff_t j = 0; j < array.size( 1 ); ++j )
@@ -246,32 +238,25 @@ TEST( Array, resizeSingleDimension )
246238
TEST( Array, arrayView )
247239
{
248240
LvArray::Array< int,
249-
2,
241+
LvArray::DynamicExtent< 2, std::ptrdiff_t >,
250242
camp::idx_seq< 1, 0 >,
251-
std::ptrdiff_t,
252243
LvArray::MallocBuffer > array( 5, 6 );
253244

254245
// Create a view.
255246
LvArray::ArrayView< int,
256-
2,
257-
0,
258-
std::ptrdiff_t,
247+
LvArray::DynamicLayout< 2, std::ptrdiff_t, camp::idx_seq< 1, 0 > >,
259248
LvArray::MallocBuffer > const view = array;
260249
EXPECT_EQ( view.data(), array.data() );
261250

262251
// Create a view with const values.
263252
LvArray::ArrayView< int const,
264-
2,
265-
0,
266-
std::ptrdiff_t,
253+
LvArray::DynamicLayout< 2, std::ptrdiff_t, camp::idx_seq< 1, 0 > >,
267254
LvArray::MallocBuffer > const viewConst = array.toViewConst();
268255
EXPECT_EQ( viewConst.data(), array.data() );
269256

270257
// Copy a view.
271258
LvArray::ArrayView< int,
272-
2,
273-
0,
274-
std::ptrdiff_t,
259+
LvArray::DynamicLayout< 2, std::ptrdiff_t, camp::idx_seq< 1, 0 > >,
275260
LvArray::MallocBuffer > const viewCopy = view;
276261
EXPECT_EQ( viewCopy.data(), array.data() );
277262
}
@@ -282,17 +267,14 @@ TEST( Array, arraySlice )
282267
{
283268
{
284269
LvArray::Array< int,
285-
2,
270+
LvArray::DynamicExtent< 2, std::ptrdiff_t >,
286271
camp::idx_seq< 0, 1 >,
287-
std::ptrdiff_t,
288272
LvArray::MallocBuffer > array( 5, 6 );
289273

290274
// The unit stride dimension of array is 1 so when we slice off
291275
// the first dimension the unit stride dimension of the slice is 0.
292276
LvArray::ArraySlice< int,
293-
1,
294-
0,
295-
std::ptrdiff_t > const slice = array[ 2 ];
277+
LvArray::DynamicLayout1D< std::ptrdiff_t > > const slice = array[ 2 ];
296278
EXPECT_TRUE( slice.isContiguous() );
297279
EXPECT_EQ( slice.size(), 6 );
298280
EXPECT_EQ( slice.size( 0 ), 6 );
@@ -301,17 +283,14 @@ TEST( Array, arraySlice )
301283

302284
{
303285
LvArray::Array< int,
304-
3,
286+
LvArray::DynamicExtent< 3, std::ptrdiff_t >,
305287
camp::idx_seq< 2, 1, 0 >,
306-
std::ptrdiff_t,
307288
LvArray::MallocBuffer > array( 3, 5, 6 );
308289

309290
// The unit stride dimension of array is 0 so when we slice off
310291
// the first dimension the unit stride dimension of the slice is -1.
311292
LvArray::ArraySlice< int,
312-
2,
313-
-1,
314-
std::ptrdiff_t > const slice = array[ 2 ];
293+
LvArray::NonContiguousLayout< 2, std::ptrdiff_t > > const slice = array[ 2 ];
315294
EXPECT_FALSE( slice.isContiguous() );
316295
EXPECT_EQ( slice.size(), 5 * 6 );
317296
EXPECT_EQ( slice.size( 0 ), 5 );
@@ -326,9 +305,8 @@ TEST( Array, arraySlice )
326305
CUDA_TEST( Array, chaiBuffer )
327306
{
328307
LvArray::Array< int,
329-
2,
308+
LvArray::DynamicExtent< 2, std::ptrdiff_t >,
330309
camp::idx_seq< 1, 0 >,
331-
std::ptrdiff_t,
332310
LvArray::ChaiBuffer > array( 5, 6 );
333311

334312
// Move the array to the device.
@@ -344,9 +322,7 @@ CUDA_TEST( Array, chaiBuffer )
344322
);
345323

346324
LvArray::ArrayView< int,
347-
2,
348-
0,
349-
std::ptrdiff_t,
325+
LvArray::DynamicLayout< 2, std::ptrdiff_t, camp::idx_seq< 1, 0 > >,
350326
LvArray::ChaiBuffer > const & view = array;
351327

352328
// Capture the view in a host kernel which moves the data back to the host.
@@ -364,9 +340,8 @@ CUDA_TEST( Array, chaiBuffer )
364340
TEST( Array, setName )
365341
{
366342
LvArray::Array< int,
367-
2,
343+
LvArray::DynamicExtent< 2, std::ptrdiff_t >,
368344
camp::idx_seq< 1, 0 >,
369-
std::ptrdiff_t,
370345
LvArray::ChaiBuffer > array( 1024, 1024 );
371346

372347
// Move the array to the device.
@@ -381,8 +356,8 @@ TEST( Array, setName )
381356
#endif
382357

383358
// Sphinx start after sum int
384-
template< int NDIM, int USD >
385-
int sum( LvArray::ArraySlice< int const, NDIM, USD, std::ptrdiff_t > const slice )
359+
template< typename LAYOUT >
360+
int sum( LvArray::ArraySlice< int const, LAYOUT > const slice )
386361
{
387362
int value = 0;
388363
for( int const val : slice )
@@ -395,8 +370,8 @@ int sum( LvArray::ArraySlice< int const, NDIM, USD, std::ptrdiff_t > const slice
395370
// Sphinx end before sum int
396371

397372
// Sphinx start after sum double
398-
template< int NDIM, int USD >
399-
double sum( LvArray::ArraySlice< double const, NDIM, USD, std::ptrdiff_t > const slice )
373+
template< typename LAYOUT >
374+
double sum( LvArray::ArraySlice< double const, LAYOUT > const slice )
400375
{
401376
double value = 0;
402377
LvArray::forValuesInSlice( slice, [&value] ( double const val )
@@ -409,11 +384,12 @@ double sum( LvArray::ArraySlice< double const, NDIM, USD, std::ptrdiff_t > const
409384
// Sphinx end before sum double
410385

411386
// Sphinx start after copy
412-
template< int NDIM, int DST_USD, int SRC_USD >
413-
void copy( LvArray::ArraySlice< int, NDIM, DST_USD, std::ptrdiff_t > const dst,
414-
LvArray::ArraySlice< int const, NDIM, SRC_USD, std::ptrdiff_t > const src )
387+
template< typename SRC_LAYOUT, typename DST_LAYOUT >
388+
void copy( LvArray::ArraySlice< int, DST_LAYOUT > const dst,
389+
LvArray::ArraySlice< int const, SRC_LAYOUT > const src )
415390
{
416-
for( int dim = 0; dim < NDIM; ++dim )
391+
static_assert( DST_LAYOUT::NDIM == SRC_LAYOUT::NDIM, "Layout ranks must match" );
392+
for( int dim = 0; dim < DST_LAYOUT::NDIM; ++dim )
417393
{
418394
LVARRAY_ERROR_IF_NE( dst.size( dim ), src.size( dim ) );
419395
}
@@ -431,15 +407,15 @@ void copy( LvArray::ArraySlice< int, NDIM, DST_USD, std::ptrdiff_t > const dst,
431407
TEST( Array, boundsCheck )
432408
{
433409
#if defined(ARRAY_USE_BOUNDS_CHECK)
434-
LvArray::Array< int, 3, camp::idx_seq< 0, 1, 2 >, std::ptrdiff_t, LvArray::MallocBuffer > x( 3, 4, 5 );
410+
LvArray::Array< int, LvArray::DynamicExtent< 3, std::ptrdiff_t >, camp::idx_seq< 0, 1, 2 >, LvArray::MallocBuffer > x( 3, 4, 5 );
435411

436412
// Out of bounds access aborts the program.
437413
EXPECT_DEATH_IF_SUPPORTED( x( 2, 3, 4 ), "" );
438414
EXPECT_DEATH_IF_SUPPORTED( x( -1, 4, 6 ), "" );
439415
EXPECT_DEATH_IF_SUPPORTED( x[ 0 ][ 10 ][ 2 ], "" );
440416

441417
// Out of bounds emplace
442-
LvArray::Array< int, 1, camp::idx_seq< 0 >, std::ptrdiff_t, LvArray::MallocBuffer > x( 10 );
418+
LvArray::Array< int, LvArray::DynamicExtent< 1, std::ptrdiff_t >, camp::idx_seq< 0 >, LvArray::MallocBuffer > x( 10 );
443419
EXPECT_DEATH_IF_SUPPORTED( x.emplace( -1, 5 ) );
444420
#endif
445421
}

0 commit comments

Comments
 (0)