1#ifndef included_AMP_ArraySizeClass
2#define included_AMP_ArraySizeClass
11#include <initializer_list>
15#include "AMP/utils/Memory.h"
17#if defined( __CUDA_ARCH__ )
19 #define HOST_DEVICE __host__ __device__
20#elif defined( __HIP_DEVICE_COMPILE__ )
21 #include "hip/hip_runtime.h"
22 #define HOST_DEVICE __host__ __device__
26#if defined( __NVCC__ )
27 #define CONSTEXPR HOST_DEVICE constexpr
29#elif defined( __HIPCC__ )
30 #define CONSTEXPR HOST_DEVICE constexpr
31 #define CONSTEXPR_IF constexpr
33 #define CONSTEXPR HOST_DEVICE constexpr
34 #define CONSTEXPR_IF constexpr
36#if defined( __GNUC__ ) || defined( __clang__ )
37 #define ARRAY_INLINE HOST_DEVICE inline __attribute__( ( always_inline ) )
38#elif defined( _MSC_VER )
39 #define ARRAY_INLINE HOST_DEVICE __forceinline
41 #define ARRAY_INLINE HOST_DEVICE inline
43#if ( defined( DEBUG ) || defined( _DEBUG ) ) && !defined( NDEBUG ) && !defined( __NVCC__ ) && \
44 !defined( __HIP_DEVICE_COMPILE__ )
45 #define CHECK_ARRAY_LENGTH( i, length ) \
48 throw std::out_of_range( "Index exceeds array bounds" ); \
50 #define ARRAY_INSIST( test, msg ) \
53 throw std::out_of_range( msg ); \
56 #define CHECK_ARRAY_LENGTH( i, length ) \
59 #define ARRAY_INSIST( test, msg ) \
71class GPUFunctionTable;
72template<
class TYPE,
class FUN = FunctionTable<TYPE>,
class Allocator = AMP::HostAllocator<
void>>
77template<
class TYPE =
size_t>
91 :
i( i_ ),
j( j_ ),
k( k_ )
99 int64_t tmp = (
static_cast<int64_t
>(
j ) -
static_cast<int64_t
>(
i ) ) /
100 static_cast<int64_t
>(
k );
102 }
else if CONSTEXPR_IF ( std::is_floating_point_v<TYPE> ) {
103 double tmp =
static_cast<double>( (
j -
i ) ) /
static_cast<double>(
k );
104 return static_cast<size_t>( floor( tmp + 1e-12 ) + 1 );
105 }
else if CONSTEXPR_IF ( std::is_same_v<TYPE, std::complex<float>> ||
106 std::is_same_v<TYPE, std::complex<double>> ) {
107 double tmp = std::real( (
j -
i ) / (
k ) );
108 return static_cast<size_t>( floor( tmp + 1e-12 ) + 1 );
110 static_assert( !std::is_integral_v<TYPE>,
"Unsupported type for range" );
119 return static_cast<TYPE
>(
i + index *
k );
120 }
else if CONSTEXPR_IF ( std::is_floating_point_v<TYPE> ) {
121 return static_cast<TYPE
>(
k * (
i /
k + index ) );
122 }
else if CONSTEXPR_IF ( std::is_same_v<TYPE, std::complex<float>> ||
123 std::is_same_v<TYPE, std::complex<double>> ) {
124 return static_cast<TYPE
>(
k * (
i /
k +
static_cast<TYPE
>( index ) ) );
126 static_assert( !std::is_integral_v<TYPE>,
"Unsupported type for range" );
127 return static_cast<TYPE
>( index );
208 for (
auto it = N.begin(); ndim2 < (int) N.size(); ndim2++, ++it ) {
209 if ( *it == (TYPE) -1 )
219 for (
size_t i = 0; i <
d_ndim; i++, ++it ) {
234 for (
size_t i = 0; i <
ndim; i++ )
237 for (
unsigned long i :
d_N )
247 template<std::
size_t NDIM>
279 for (
unsigned long i :
d_N )
341 size_t index = i1 +
d_N[0] * ( i2 +
d_N[1] * ( i3 +
d_N[2] * i4 ) );
347 CONSTEXPR size_t index(
size_t i1,
size_t i2,
size_t i3,
size_t i4,
size_t i5 )
const
349 size_t index = i1 +
d_N[0] * ( i2 +
d_N[1] * ( i3 +
d_N[2] * ( i4 +
d_N[3] * i5 ) ) );
355 constexpr size_t index(
const std::array<size_t, 5> &i )
const
358 for (
size_t m = 0, N = 1; m < 5; m++ ) {
366 constexpr size_t index( std::initializer_list<size_t> i )
const
371 for (
size_t k : i ) {
379 constexpr std::array<size_t, 5>
ijk(
size_t index )
const
390 return { i0, i1, i2, i3,
index };
419 "Maximum number of dimensions exceeded" );
421 for (
int i = 0; i < x.
ndim(); i++ )
423 for (
int i = 0; i < y.
ndim(); i++ )
424 N[i + x.
ndim()] = y[i];
432 int ndim = x.
ndim() == 1 ? 1 : x.
ndim() - 1;
433 size_t dims[] = { x[1], x[2], x[3], x[4] };
443 for (
size_t i = 0; i < x.
maxDim(); i++ ) {
447 return ArraySize( std::max( Nd, 1 ), N );
454 size_t N[5] = { v * x[0], v * x[1], v * x[2], v * x[3], v * x[4] };
459 size_t N[5] = { v * x[0], v * x[1], v * x[2], v * x[3], v * x[4] };
464 int ndim = std::max( x.
ndim(), y.
ndim() );
465 size_t N[5] = { x[0] * y[0], x[1] * y[1], x[2] * y[2], x[3] * y[3], x[4] * y[4] };
470 size_t N[5] = { x[0] - v, x[1] - v, x[2] - v, x[3] - v, x[4] - v };
475 size_t N[5] = { x[0] + v, x[1] + v, x[2] + v, x[3] + v, x[4] + v };
480 size_t N[5] = { x[0] + v, x[1] + v, x[2] + v, x[3] + v, x[4] + v };
488 if ( sa[1] != sb[0] )
489 throw std::logic_error(
"Inner dimensions must match" );
490 if ( sa.
ndim() == 2 && sb.
ndim() == 1 ) {
492 }
else if ( sa.
ndim() <= 2 && sb.
ndim() <= 2 ) {
493 return { sa[0], sb[1] };
495 throw std::logic_error(
"Not finished yet" );
#define ARRAY_INSIST(test, msg)
#define CHECK_ARRAY_LENGTH(i, length)
Simple class to store the array dimensions.
constexpr size_t index(const std::array< size_t, 5 > &i) const
Get the index.
constexpr ArraySize(size_t ndim, const size_t *dims)
constexpr const size_t * end() const
Returns an iterator to the end.
constexpr ArraySize(size_t N1)
constexpr ArraySize(size_t N1, size_t N2, size_t N3, size_t N4)
constexpr ArraySize(size_t N1, size_t N2, size_t N3)
constexpr ArraySize(size_t N1, size_t N2)
ArraySize(const std::vector< size_t > &N)
constexpr size_t index(size_t i1, size_t i2, size_t i3) const
Get the index.
constexpr void setNdim(uint8_t ndim)
constexpr ArraySize()
Empty constructor.
constexpr size_t size() const
Return the number of dimensions.
constexpr size_t index(size_t i1, size_t i2) const
Get the index.
constexpr std::array< size_t, 5 > ijk(size_t index) const
Convert the index to ijk values.
constexpr size_t index(size_t i1, size_t i2, size_t i3, size_t i4, size_t i5) const
Get the index.
constexpr size_t index(std::initializer_list< size_t > i) const
Get the index.
constexpr bool operator==(const ArraySize &rhs) const
constexpr uint8_t ndim() const
Return the number of dimensions.
constexpr ArraySize(std::initializer_list< TYPE > N, int ndim=-1)
constexpr size_t index(size_t i) const
Get the index.
constexpr size_t operator[](size_t i) const
constexpr void ijk(size_t index, size_t *x) const
Convert the index to ijk values.
constexpr size_t index(size_t i1, size_t i2, size_t i3, size_t i4) const
Get the index.
constexpr bool approxEqual(const ArraySize &rhs) const
constexpr size_t length() const
Return the total number of elements in the array.
constexpr ArraySize(size_t N1, size_t N2, size_t N3, size_t N4, size_t N5)
constexpr const size_t * begin() const
Returns an iterator to the beginning.
constexpr bool operator!=(const ArraySize &rhs) const
Check if two matrices are not equal.
constexpr ArraySize(const std::array< size_t, NDIM > &N)
static constexpr uint8_t maxDim()
Maximum supported dimension.
constexpr void resize(uint8_t dim, size_t N)
Resize the dimension.
constexpr TYPE get(size_t index) const
Get the ith values in the range.
constexpr size_t size() const
Get the number of values in the range.
constexpr Range()
Empty constructor.
constexpr Range(const TYPE &i_, const TYPE &j_, const TYPE &k_=1)
Array< TYPE, FUN, Allocator > operator-(const Array< TYPE, FUN, Allocator > &a, const Array< TYPE, FUN, Allocator > &b)
constexpr ArraySize multiplySize(const ArraySize &sa, const ArraySize &sb)
constexpr ArraySize pop(const ArraySize &x)
constexpr ArraySize squeeze(const ArraySize &x)
constexpr ArraySize cat(const ArraySize &x, const ArraySize &y)
Array< TYPE, FUN, Allocator > operator*(const Array< TYPE, FUN, Allocator > &a, const Array< TYPE, FUN, Allocator > &b)
Array< TYPE, FUN, Allocator > operator+(const Array< TYPE, FUN, Allocator > &a, const Array< TYPE, FUN, Allocator > &b)