Skip to content
Snippets Groups Projects

Replace tuple-style cast with pointer/stride access

Merged Slattery, Stuart requested to merge (removed):member_pointers into master
Files
4
+ 44
24
@@ -97,7 +97,7 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
// Struct member array element pointer type at a given index I.
template<std::size_t I>
using struct_member_pointer_type =
typename std::add_pointer<struct_member_data_type<I> >::type;
typename std::add_pointer<struct_member_value_type<I> >::type;
// Struct member array element const pointer type at a given index I.
template<std::size_t I>
@@ -263,7 +263,7 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
struct_member_reference_type<I> >::type
get( const Index& idx )
{
return data<I>()[idx.s() * _strides[I] + idx.i()];
return array<I>(idx.s())[idx.i()];
}
template<std::size_t I>
@@ -272,7 +272,7 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
struct_member_const_reference_type<I> >::type
get( const Index& idx ) const
{
return data<I>()[idx.s() * _strides[I] + idx.i()];
return array<I>(idx.s())[idx.i()];
}
// Rank 1
@@ -283,7 +283,7 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
get( const Index& idx,
const int d0 )
{
return data<I>()[idx.s() * _strides[I] + idx.i()][d0];
return array<I>(idx.s())[idx.i()][d0];
}
template<std::size_t I>
@@ -293,7 +293,7 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
get( const Index& idx,
const int d0 ) const
{
return data<I>()[idx.s() * _strides[I] + idx.i()][d0];
return array<I>(idx.s())[idx.i()][d0];
}
// Rank 2
@@ -305,7 +305,7 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
const int d0,
const int d1 )
{
return data<I>()[idx.s() * _strides[I] + idx.i()][d0][d1];
return array<I>(idx.s())[idx.i()][d0][d1];
}
template<std::size_t I>
@@ -316,7 +316,7 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
const int d0,
const int d1 ) const
{
return data<I>()[idx.s() * _strides[I] + idx.i()][d0][d1];
return array<I>(idx.s())[idx.i()][d0][d1];
}
// Rank 3
@@ -329,7 +329,7 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
const int d1,
const int d2 )
{
return data<I>()[idx.s() * _strides[I] + idx.i()][d0][d1][d2];
return array<I>(idx.s())[idx.i()][d0][d1][d2];
}
template<std::size_t I>
@@ -341,7 +341,7 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
const int d1,
const int d2 ) const
{
return data<I>()[idx.s() * _strides[I] + idx.i()][d0][d1][d2];
return array<I>(idx.s())[idx.i()][d0][d1][d2];
}
// Rank 4
@@ -355,7 +355,7 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
const int d2,
const int d3 )
{
return data<I>()[idx.s() * _strides[I] + idx.i()][d0][d1][d2][d3];
return array<I>(idx.s())[idx.i()][d0][d1][d2][d3];
}
template<std::size_t I>
@@ -368,51 +368,70 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
const int d2,
const int d3 ) const
{
return data<I>()[idx.s() * _strides[I] + idx.i()][d0][d1][d2][d3];
return array<I>(idx.s())[idx.i()][d0][d1][d2][d3];
}
// -------------------------------
// Raw data access.
// Get the stride between SoA data for a given member at index I.
// Get the stride between SoA data for a given member at index I. Note
// that this strides are computed in the context of the *value_type* for
// each member.
CABANA_INLINE_FUNCTION
std::size_t stride( const std::size_t I ) const
{
return _strides[I];
}
// Get an un-typed raw pointer to the data for a given member at index
// I. Users will need to cast this pointer to the appropriate type for the
// stride associated with this member to mean anything.
CABANA_INLINE_FUNCTION
void* data( const std::size_t I )
{
return _pointers[I];
}
CABANA_INLINE_FUNCTION
const void* data( const std::size_t I ) const
{
return _pointers[I];
}
private:
// Get a typed pointer to the data for a given member at index I.
template<std::size_t I>
CABANA_INLINE_FUNCTION
struct_member_pointer_type<I> data()
struct_member_pointer_type<I> typedPointer()
{
return static_cast<struct_member_pointer_type<I> >( _pointers[I] );
}
template<std::size_t I>
CABANA_INLINE_FUNCTION
struct_member_const_pointer_type<I> data() const
struct_member_const_pointer_type<I> typedPointer() const
{
return static_cast<struct_member_pointer_type<I> >( _pointers[I] );
}
// Get an un-typed raw pointer to the data for a given member at index
// I. Users will need to cast this pointer to the appropriate type for the
// stride associated with this member to mean anything.
// Get the array at the given struct index.
template<std::size_t I>
CABANA_INLINE_FUNCTION
void* pointer( const std::size_t I )
struct_member_array_type<I> array( const std::size_t s )
{
return _pointers[I];
return reinterpret_cast<struct_member_array_type<I> >(
typedPointer<I>() + s * _strides[I] );
}
template<std::size_t I>
CABANA_INLINE_FUNCTION
const void* pointer( const std::size_t I ) const
struct_member_const_array_type<I> array( const std::size_t s ) const
{
return _pointers[I];
return reinterpret_cast<struct_member_array_type<I> >(
typedPointer<I>() + s * _strides[I] );
}
private:
// Store the pointers and strides for each member element.
template<std::size_t N>
void assignPointersAndStrides()
@@ -460,7 +479,8 @@ class AoSoA<MemberDataTypes<Types...>,Device,ArraySize>
// Pointers to the first element of each member.
void* _pointers[number_of_members];
// Strides for each member.
// Strides for each member. Note that these strides are computed in the
// context of the *value_type* of each member.
std::size_t _strides[number_of_members];
};
Loading