multi_index_transform.hpp Source File#
multi_index_transform.hpp
Go to the documentation of this file.
1022// Implementation of "Merge" transformation primitive that uses magic-number-division to do lowering
1028// dividend would be bit-wise interpreted as uint32_t and magic number division implementation for
1174// Implementation of "Merge" transformation primitive that uses magic-number-division to do lowering
1180// dividend would be bit-wise interpreted as uint32_t and magic number division implementation for
1333// Implementation of "Merge" transformation primitive that uses division and mod. It is supposed to
1334// be used for low_lengths that are known at compile time and are power of 2, otherwise performance
2035 __host__ __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx&) const
Definition utility/math.hpp:13
Definition ck.hpp:268
__host__ __device__ constexpr auto container_reduce(const Container &x, Reduce reduce, Init init, Number< IBegin >=Number< 0 >{}, Number< IEnd >=Number< Container::Size()>{}, Number< IStep >=Number< 1 >{})
Definition utility/container_helper.hpp:111
__host__ __device__ constexpr auto generate_tuple(F &&f, Number< N >)
Definition tuple_helper.hpp:21
__host__ __device__ constexpr auto make_tuple(Xs &&... xs)
Definition utility/tuple.hpp:211
__host__ __device__ constexpr auto container_reverse_exclusive_scan(const Array< TData, NSize > &x, Reduce f, TData init)
Definition utility/container_helper.hpp:213
__host__ __device__ void print_multi_index(const Tuple< Xs... > &x)
Definition statically_indexed_array_multi_index.hpp:147
index_t KPad_
Definition multi_index_transform.hpp:1581
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:1639
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:1694
__host__ __device__ void Print() const
Definition multi_index_transform.hpp:1738
index_t IWTildeSliceBegin_
Definition multi_index_transform.hpp:1578
index_t IHTildeSliceBegin_
Definition multi_index_transform.hpp:1578
index_t WRatio_
Definition multi_index_transform.hpp:1579
index_t WTildeSlice_
Definition multi_index_transform.hpp:1577
index_t WTilde_
Definition multi_index_transform.hpp:1576
__host__ __device__ constexpr auto CalculateLowerIndexN(const UpIdx &idx_up) const
Definition multi_index_transform.hpp:1646
__host__ __device__ constexpr ConvBwdDataImplicitGemmOutTransform(index_t N, index_t Ho, index_t Wo, index_t K, index_t XDot, index_t HTilde, index_t WTilde, index_t WTildeSlice, index_t HWTildeSlice, index_t IHTildeSliceBegin, index_t IWTildeSliceBegin, index_t HRatio, index_t WRatio, index_t XDotSlice_K, index_t K0, index_t MPadded, index_t K1, index_t MPad, index_t KPad)
Definition multi_index_transform.hpp:1591
Tuple< index_t, index_t, index_t > up_lengths_
Definition multi_index_transform.hpp:1582
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:1716
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:1718
Tuple< index_t, index_t, index_t, index_t > low_lengths_magic_divisor_multiplier_
Definition multi_index_transform.hpp:1585
Tuple< index_t, index_t, index_t, index_t > low_lengths_magic_divisor_shift_
Definition multi_index_transform.hpp:1587
index_t XDot_
Definition multi_index_transform.hpp:1575
index_t XDotSlice_K_
Definition multi_index_transform.hpp:1580
MultiIndex< 4 > LowerIndex
Definition multi_index_transform.hpp:1571
index_t HRatio_
Definition multi_index_transform.hpp:1579
__host__ __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &idx_up) const
Definition multi_index_transform.hpp:1725
__host__ __device__ ConvBwdDataImplicitGemmOutTransform()=default
static constexpr auto I2
Definition multi_index_transform.hpp:1568
static constexpr auto I0
Definition multi_index_transform.hpp:1566
index_t MPad_
Definition multi_index_transform.hpp:1581
__host__ __device__ constexpr auto CalculateLowerIndexK(const UpIdx &idx_up) const
Definition multi_index_transform.hpp:1668
index_t TildeSlice_
Definition multi_index_transform.hpp:1577
MultiIndex< 3 > UpperIndex
Definition multi_index_transform.hpp:1572
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:1641
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:1643
index_t HTilde_
Definition multi_index_transform.hpp:1576
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:1736
static constexpr auto I3
Definition multi_index_transform.hpp:1569
__host__ __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &, LowIdx &idx_low, const UpIdx &idx_up, Number< Hack >) const
Definition multi_index_transform.hpp:1705
static constexpr auto I1
Definition multi_index_transform.hpp:1567
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:447
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:459
__host__ __device__ constexpr Embed()=default
__host__ __device__ constexpr Embed(const UpLengths &up_lengths, const Coefficients &coefficients)
Definition multi_index_transform.hpp:396
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:402
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:404
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:454
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:406
__host__ __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >) const
Definition multi_index_transform.hpp:427
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:445
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:409
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:1789
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &) const
Definition multi_index_transform.hpp:1764
__host__ static __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &, LowIdx &, const UpIdx &, Number< Hack >)
Definition multi_index_transform.hpp:1778
__host__ __device__ constexpr Freeze()=default
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:1801
__host__ __device__ constexpr Freeze(const LowerIndex &low_idx)
Definition multi_index_transform.hpp:1755
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:1757
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:1759
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:1787
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:1796
__host__ static __device__ constexpr auto GetUpperLengths()
Definition multi_index_transform.hpp:1761
__host__ __device__ constexpr Insert()=default
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:1828
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:1854
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:1830
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:1856
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &, const UpIdx &) const
Definition multi_index_transform.hpp:1835
decltype(make_tuple(UpperLength{})) UpLengths
Definition multi_index_transform.hpp:1817
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:1863
__host__ __device__ constexpr Insert(const UpperLength &up_length)
Definition multi_index_transform.hpp:1823
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:1868
__host__ static __device__ void UpdateLowerIndex(LowIdxDiff &, const UpIdxDiff &, LowIdx &, const UpIdx &, Number< Hack >)
Definition multi_index_transform.hpp:1847
__host__ __device__ constexpr auto GetUpperLengths() const
Definition multi_index_transform.hpp:1832
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:217
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:251
__host__ __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &idx_up) const
Definition multi_index_transform.hpp:260
__host__ __device__ constexpr LeftPad(const LowLength &low_length, const LeftPadLength &left_pad_length)
Definition multi_index_transform.hpp:207
decltype(make_tuple(LowLength{}+LeftPadLength{})) UpLengths
Definition multi_index_transform.hpp:200
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:220
__host__ static __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >)
Definition multi_index_transform.hpp:234
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:213
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:265
__host__ __device__ constexpr LeftPad()=default
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:215
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:253
Definition magic_division.hpp:27
__host__ static __device__ constexpr uint32_t CalculateMagicShift(uint32_t divisor)
Definition magic_division.hpp:64
static __device__ constexpr uint32_t DoMagicDivision(uint32_t dividend, uint32_t multiplier, uint32_t shift)
Definition magic_division.hpp:127
__host__ static __device__ constexpr uint32_t CalculateMagicMultiplier(uint32_t divisor)
Definition magic_division.hpp:57
__host__ __device__ void UpdateLowerIndex_2(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >) const
Definition multi_index_transform.hpp:822
LowLengths low_lengths_
Definition multi_index_transform.hpp:493
decltype(container_reverse_exclusive_scan(LowLengths{}, math::multiplies{}, Number< 1 >{})) LowLengthsScan
Definition multi_index_transform.hpp:487
__host__ __device__ void UpdateLowerIndex_1b(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >) const
Definition multi_index_transform.hpp:680
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:969
static constexpr index_t NDimLow
Definition multi_index_transform.hpp:482
MultiIndex< NDimLow > LowerIndex
Definition multi_index_transform.hpp:484
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:974
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:967
MultiIndex< 1 > UpperIndex
Definition multi_index_transform.hpp:485
__host__ __device__ constexpr Merge_v1_carry_check()=default
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:508
__host__ __device__ constexpr Merge_v1_carry_check(const LowLengths &low_lengths)
Definition multi_index_transform.hpp:499
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:510
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:512
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:983
__host__ __device__ void Print() const
Definition multi_index_transform.hpp:988
__host__ __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &idx_up_new, Number< Hack >) const
Definition multi_index_transform.hpp:952
LowLengthsScan low_lengths_scan_
Definition multi_index_transform.hpp:494
__host__ __device__ void UpdateLowerIndex_1a(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >) const
Definition multi_index_transform.hpp:537
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:515
decltype(make_tuple(container_reduce(LowLengths{}, math::multiplies{}, Number< 1 >{}))) UpLengths
Definition multi_index_transform.hpp:490
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:1138
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:1136
MultiIndex< 1 > UpperIndex
Definition multi_index_transform.hpp:1040
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:1077
LowLengthsMagicDivisorShift low_lengths_magic_divisor_shift_
Definition multi_index_transform.hpp:1055
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:1143
UpLengths up_lengths_
Definition multi_index_transform.hpp:1056
decltype(generate_tuple( lambda_merge_generate_MagicDivision_calculate_magic_multiplier< LowLengths >{}, Number< NDimLow >{})) LowLengthsMagicDivisorMultipiler
Definition multi_index_transform.hpp:1045
static constexpr index_t NDimLow
Definition multi_index_transform.hpp:1037
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:1075
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:1153
LowLengthsMagicDivisorMultipiler low_lengths_magic_divisor_multiplier_
Definition multi_index_transform.hpp:1054
__host__ __device__ constexpr Merge_v2_magic_division()=default
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:1073
__host__ __device__ constexpr Merge_v2_magic_division(const LowLengths &low_lengths)
Definition multi_index_transform.hpp:1060
LowLengths low_lengths_
Definition multi_index_transform.hpp:1053
decltype(make_tuple(container_reduce(LowLengths{}, math::multiplies{}, Number< 1 >{}))) UpLengths
Definition multi_index_transform.hpp:1042
__host__ __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &, LowIdx &idx_low, const UpIdx &idx_up_new, Number< Hack >) const
Definition multi_index_transform.hpp:1105
MultiIndex< NDimLow > LowerIndex
Definition multi_index_transform.hpp:1039
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:1080
decltype(generate_tuple( lambda_merge_generate_MagicDivision_calculate_magic_shift< LowLengths >{}, Number< NDimLow >{})) LowLengthsMagicDivisorShift
Definition multi_index_transform.hpp:1049
__host__ __device__ void Print() const
Definition multi_index_transform.hpp:1158
LowLengths low_lengths_
Definition multi_index_transform.hpp:1208
__host__ __device__ void Print() const
Definition multi_index_transform.hpp:1315
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:1310
decltype(container_reverse_exclusive_scan(LowLengths{}, math::multiplies{}, Number< 1 >{})) LowLengthsScan
Definition multi_index_transform.hpp:1194
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:1293
MultiIndex< 1 > UpperIndex
Definition multi_index_transform.hpp:1192
decltype(generate_tuple( lambda_merge_generate_MagicDivision_calculate_magic_shift< LowLengthsScan >{}, Number< NDimLow >{})) LowLengthsScanMagicDivisorShift
Definition multi_index_transform.hpp:1204
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:1295
LowLengthsScanMagicDivisorShift low_lengths_scan_magic_divisor_shift_
Definition multi_index_transform.hpp:1211
UpLengths up_lengths_
Definition multi_index_transform.hpp:1212
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:1238
MultiIndex< NDimLow > LowerIndex
Definition multi_index_transform.hpp:1191
LowLengthsScanMagicDivisorMultipiler low_lengths_scan_magic_divisor_multiplier_
Definition multi_index_transform.hpp:1210
decltype(generate_tuple( lambda_merge_generate_MagicDivision_calculate_magic_multiplier< LowLengthsScan >{}, Number< NDimLow >{})) LowLengthsScanMagicDivisorMultipiler
Definition multi_index_transform.hpp:1200
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:1233
__host__ __device__ constexpr Merge_v2r2_magic_division(const LowLengths &low_lengths)
Definition multi_index_transform.hpp:1216
__host__ __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &, LowIdx &idx_low, const UpIdx &idx_up_new, Number< Hack >) const
Definition multi_index_transform.hpp:1263
LowLengthsScan low_lengths_scan_
Definition multi_index_transform.hpp:1209
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:1235
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:1300
decltype(make_tuple(container_reduce(LowLengths{}, math::multiplies{}, Number< 1 >{}))) UpLengths
Definition multi_index_transform.hpp:1197
static constexpr index_t NDimLow
Definition multi_index_transform.hpp:1189
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:1231
__host__ __device__ constexpr Merge_v2r2_magic_division()=default
UpLengths up_lengths_
Definition multi_index_transform.hpp:1352
MultiIndex< 1 > UpperIndex
Definition multi_index_transform.hpp:1342
__host__ __device__ constexpr Merge_v3_division_mod(const LowLengths &low_lengths)
Definition multi_index_transform.hpp:1356
__host__ __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &, LowIdx &idx_low, const UpIdx &idx_up_new, Number< Hack >) const
Definition multi_index_transform.hpp:1394
decltype(make_tuple(container_reduce(LowLengths{}, math::multiplies{}, Number< 1 >{}))) UpLengths
Definition multi_index_transform.hpp:1347
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:1421
__host__ __device__ void Print() const
Definition multi_index_transform.hpp:1442
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:1437
__host__ __device__ constexpr Merge_v3_division_mod()=default
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:1365
LowLengthsScan low_lengths_scan_
Definition multi_index_transform.hpp:1351
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:1367
LowLengths low_lengths_
Definition multi_index_transform.hpp:1350
MultiIndex< NDimLow > LowerIndex
Definition multi_index_transform.hpp:1341
decltype(container_reverse_exclusive_scan(LowLengths{}, math::multiplies{}, Number< 1 >{})) LowLengthsScan
Definition multi_index_transform.hpp:1344
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:1372
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:1369
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:1423
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:1428
static constexpr index_t NDimLow
Definition multi_index_transform.hpp:1339
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:2087
__host__ __device__ constexpr Modulo(const Modulus &modulus, const UpLength &up_length)
Definition multi_index_transform.hpp:2075
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:2118
__host__ __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &up_idx, Number< Hack >) const
Definition multi_index_transform.hpp:2101
decltype(make_tuple(UpLength{})) UpLengths
Definition multi_index_transform.hpp:2068
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:2127
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:2132
__host__ __device__ constexpr Modulo()=default
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:2080
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:2084
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:2082
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:2120
__host__ static __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >)
Definition multi_index_transform.hpp:142
__host__ __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &idx_up) const
Definition multi_index_transform.hpp:168
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:121
decltype(make_tuple(LowLength{}+LeftPadLength{}+RightPadLength{})) UpLengths
Definition multi_index_transform.hpp:104
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:161
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:128
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:123
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:125
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:159
__host__ __device__ constexpr Pad()=default
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:175
__host__ __device__ constexpr Pad(const LowLength &low_length, const LeftPadLength &left_pad_length, const RightPadLength &right_pad_length)
Definition multi_index_transform.hpp:112
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:66
__host__ __device__ constexpr PassThrough()=default
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:28
__host__ static __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >)
Definition multi_index_transform.hpp:49
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:75
decltype(make_tuple(LowLength{})) UpLengths
Definition multi_index_transform.hpp:17
__host__ static __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up)
Definition multi_index_transform.hpp:35
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:32
__host__ __device__ constexpr PassThrough(const LowLength &low_length)
Definition multi_index_transform.hpp:23
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:30
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:68
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:80
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:344
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:356
__host__ static __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up)
Definition multi_index_transform.hpp:311
decltype(make_tuple(LowLength{}+RightPadLength{})) UpLengths
Definition multi_index_transform.hpp:288
__host__ __device__ constexpr RightPad(const LowLength &low_length, const RightPadLength &right_pad_length)
Definition multi_index_transform.hpp:296
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:306
__host__ __device__ constexpr RightPad()=default
__host__ static __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >)
Definition multi_index_transform.hpp:325
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:308
__host__ __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &idx_up) const
Definition multi_index_transform.hpp:351
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:342
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:304
RightPadLength right_pad_length_
Definition multi_index_transform.hpp:292
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:1991
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:2029
__host__ __device__ constexpr Slice(const LowLength &, const SliceBegin &slice_begin, const SliceEnd &slice_end)
Definition multi_index_transform.hpp:1980
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:1996
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:2027
decltype(make_tuple(SliceEnd{} - SliceBegin{})) UpLengths
Definition multi_index_transform.hpp:1972
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:1993
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:2040
__host__ __device__ constexpr Slice()=default
__host__ static __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >)
Definition multi_index_transform.hpp:2010
__host__ __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &) const
Definition multi_index_transform.hpp:2035
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:1989
Definition utility/tuple.hpp:186
Definition utility/tuple.hpp:117
decltype(container_reverse_exclusive_scan(UpLengths{}, math::multiplies{}, Number< 1 >{})) UpLengthsScan
Definition multi_index_transform.hpp:1464
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:1479
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:1538
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:1526
__host__ __device__ constexpr UnMerge()=default
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:1481
UpLengthsScan up_lengths_scan_
Definition multi_index_transform.hpp:1468
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:1483
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:1533
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:1524
__host__ __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >) const
Definition multi_index_transform.hpp:1513
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:1486
__host__ __device__ constexpr UnMerge(const UpLengths &up_lengths)
Definition multi_index_transform.hpp:1472
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:1939
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:1899
__host__ static __device__ constexpr bool IsLinearTransform()
Definition multi_index_transform.hpp:1937
__host__ __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &idx_diff_up, LowIdx &idx_low, const UpIdx &, Number< Hack >) const
Definition multi_index_transform.hpp:1920
__host__ __device__ constexpr Vectorize()=default
__host__ __device__ constexpr Vectorize(const VectorSize &vector_size, const UpLength &up_length)
Definition multi_index_transform.hpp:1893
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:1903
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:1901
decltype(make_tuple(UpLength{})) UpLengths
Definition multi_index_transform.hpp:1886
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:1906
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:1946
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:1951
__host__ static __device__ constexpr bool IsValidUpperIndexAlwaysMappedToValidLowerIndex()
Definition multi_index_transform.hpp:2209
__host__ static __device__ constexpr index_t GetNumOfLowerDimension()
Definition multi_index_transform.hpp:2161
__host__ static __device__ constexpr bool IsValidUpperIndexMappedToValidLowerIndex(const UpIdx &)
Definition multi_index_transform.hpp:2216
__host__ static __device__ constexpr index_t GetNumOfUpperDimension()
Definition multi_index_transform.hpp:2163
__host__ __device__ void UpdateLowerIndex(LowIdxDiff &idx_diff_low, const UpIdxDiff &, LowIdx &idx_low, const UpIdx &idx_up, Number< Hack >) const
Definition multi_index_transform.hpp:2192
__host__ __device__ constexpr const auto & GetUpperLengths() const
Definition multi_index_transform.hpp:2165
__host__ __device__ constexpr Xor(const LowLengths &low_lengths)
Definition multi_index_transform.hpp:2159
__host__ __device__ constexpr void CalculateLowerIndex(LowIdx &idx_low, const UpIdx &idx_up) const
Definition multi_index_transform.hpp:2168
__host__ static __device__ constexpr bool IsKnownAtCompileTime()
Definition multi_index_transform.hpp:2221
Definition is_known_at_compile_time.hpp:14
Definition multi_index_transform.hpp:1004
__host__ __device__ constexpr auto operator()(Number< I > i) const
Definition multi_index_transform.hpp:1006
Definition multi_index_transform.hpp:1014
__host__ __device__ constexpr auto operator()(Number< I > i) const
Definition multi_index_transform.hpp:1016
Definition utility/math.hpp:34
Definition functional2.hpp:33