13 template<
typename... Fields, std::size_t FirstCoord, std::size_t... Coords>
16 using Rec =
Record<Fields...>;
17 if constexpr(
sizeof...(Coords) == 0)
20 using Part2 = mp_erase_c<Rec, FirstCoord, FirstCoord + 1>;
21 return mp_list<Part1, Part2>{};
29 using Part2 = mp_replace_at_c<Rec, FirstCoord, Field<FieldTag, mp_second<InnerPartition>>>;
30 return mp_list<Part1, Part2>{};
34 template<
typename Acc,
typename TagList>
46 template<
typename Acc,
typename TagList>
49 template<
typename... Fields,
typename... RCs>
52 static_assert((isRecordCoord<RCs> && ...));
53 using Initial = mp_list<Record<>,
Record<Fields...>>;
57 template<
typename RC,
typename RecordCoordForMapping1>
58 inline constexpr
bool isSelected = recordCoordCommonPrefixIsSame<RecordCoordForMapping1, RC>;
60 template<
typename RC,
typename... RecordCoordsForMapping1>
61 inline constexpr
bool isSelected<RC, mp_list<RecordCoordsForMapping1...>>
62 = (isSelected<RC, RecordCoordsForMapping1> || ...);
64 template<
typename RecordDim,
typename Selector>
67 template<
typename RecordDim, std::size_t... RCs>
73 template<
typename RecordDim,
typename... Args>
78 if constexpr(((mp_is_list<Args>::value || isRecordCoord<Args>) &&...))
80 return mp_list<GetCoordFromTags<RecordDim, Args>...>{};
86 using type = decltype(f());
99 typename TArrayExtents,
101 typename TSelectorForMapping1,
102 template<
typename...>
103 typename MappingTemplate1,
104 template<
typename...>
105 typename MappingTemplate2,
106 bool SeparateBlobs =
false>
109 static_assert(isRecord<TRecordDim>,
"Cannot split a scalar record dim");
123 using Mapping1 = MappingTemplate1<ArrayExtents, RecordDim1>;
124 using Mapping2 = MappingTemplate2<ArrayExtents, RecordDim2>;
126 static constexpr std::size_t
blobCount = SeparateBlobs ? Mapping1::blobCount + Mapping2::blobCount : 1;
127 static_assert(SeparateBlobs || Mapping1::blobCount == 1);
128 static_assert(SeparateBlobs || Mapping2::blobCount == 1);
132 static constexpr size_type m1bc =
static_cast<size_type
>(Mapping1::blobCount);
149 template<
typename... Args1,
typename... Args2>
163 if constexpr(SeparateBlobs)
173 template<std::size_t... RecordCoords>
184 if constexpr(SeparateBlobs)
185 nrAndOffset.nr += m1bc;
188 for(size_type i = 0; i < m1bc; i++)
189 nrAndOffset.offset +=
mapping1.blobSize(i);
195 template<std::size_t... RecordCoords>
200 return llama::isComputed<Mapping1, GetCoordFromTags<RecordDim1, Tags>>;
202 return llama::isComputed<Mapping2, GetCoordFromTags<RecordDim2, Tags>>;
205 template<std::size_t... RecordCoords,
typename Blobs>
215 auto* blobs2 = &blobs[0] + m1bc;
228 typename SelectorForMapping1,
229 template<
typename...>
230 typename MappingTemplate1,
231 template<
typename...>
232 typename MappingTemplate2,
233 bool SeparateBlobs =
false>
236 template<
typename ArrayExtents,
typename RecordDim>
242 template<
typename Mapping>
249 typename SelectorForMapping1,
250 template<
typename...>
251 typename MappingTemplate1,
252 template<
typename...>
253 typename MappingTemplate2,
255 inline constexpr
bool
256 isSplit<Split<ArrayExtents, RecordDim, SelectorForMapping1, MappingTemplate1, MappingTemplate2, SeparateBlobs>>
#define LLAMA_FN_HOST_ACC_INLINE
typename PartitionFoldOpImpl< Acc, TagList >::type PartitionFoldOp
auto partitionRecordDim(Record< Fields... >, RecordCoord< FirstCoord, Coords... >)
constexpr bool isSelected
ArrayExtents(Args...) -> ArrayExtents< typename internal::IndexTypeFromArgs< std::size_t, Args... >::type,(Args{}, dyn)... >
typename internal::GetTagsImpl< RecordDim, RecordCoord >::type GetTags
typename internal::GetTagImpl< RecordDim, RecordCoord >::type GetTag
Get the tag of the Field at a RecordCoord inside the record dimension tree.
typename internal::GetCoordFromTagsImpl< RecordDim, RecordCoord<>, TagsOrTagList... >::type GetCoordFromTags
typename internal::GetTypeImpl< RecordDim, RecordCoordOrTags... >::type GetType
ArrayIndex< T, rank > Index
A type list of Fields which may be used to define a record dimension.
TArrayExtents ArrayExtents
static constexpr std::size_t blobCount
mp_first< RecordDimPartitions > RecordDim1
typename ArrayExtents::Index ArrayIndex
constexpr Split()=default
constexpr auto blobNrAndOffset(ArrayIndex ai, RecordCoord< RecordCoords... >={}) const -> NrAndOffset< size_type >
decltype(internal::partitionRecordDim(RecordDim{}, NormalizedSelectorForMapping1{})) RecordDimPartitions
MappingTemplate2< ArrayExtents, RecordDim2 > Mapping2
TSelectorForMapping1 SelectorForMapping1
typename internal::ReplaceTagListsByCoords< RecordDim, SelectorForMapping1 >::type NormalizedSelectorForMapping1
constexpr Split(ArrayExtents extents)
constexpr Split(Mapping1 mapping1, Mapping2 mapping2)
constexpr auto extents() const -> ArrayExtents
constexpr auto blobSize([[maybe_unused]] size_type i) const -> size_type
MappingTemplate1< ArrayExtents, RecordDim1 > Mapping1
mp_second< RecordDimPartitions > RecordDim2
constexpr Split(std::tuple< Args1... > mappingArgs1, std::tuple< Args2... > mappingArgs2)
static constexpr auto isComputed(RecordCoord< RecordCoords... >) -> bool
constexpr auto compute(ArrayIndex ai, RecordCoord< RecordCoords... >, Blobs &blobs) const
mp_second< Acc > Part2Before
mp_first< Acc > Part1Before
mp_second< R > Part2After
mp_list< MergedRecordDims< Part1Before, Part1After >, Part2After > type
decltype(partitionRecordDim(Part2Before{}, GetCoordFromTags< Part2Before, TagList >{})) R