gko::experimental::distributed::
Partition#
Ownership map: stores, for each contiguous range of global indices, which rank owns it. Three factory helpers cover the common cases:
build_from_contiguous— explicit per-rank ranges.build_from_global_size_uniform— uniform block split of a given global size.build_from_mapping— generic per-row ownership array (e.g. the output of ParMETIS).
All distributed types in this namespace are constructed against a
Partition, and the same partition is used for the rows and columns
of a Matrix.
-
template<typename LocalIndexType = int32, typename GlobalIndexType = int64>
class Partition # Inherits from
public gko::EnablePolymorphicObject<Partition<int32, int64>>
public gko::EnablePolymorphicAssignment<Partition<int32, int64>>
Represents a partition of a range of indices [0, size) into a disjoint set of parts. The partition is stored as a set of consecutive ranges [begin, end) with an associated part ID and local index (number of indices in this part before
begin). Global indices are stored as 64 bit signed integers (int64), part-local indices use LocalIndexType, Part IDs use 32 bit signed integers (int).For example, consider the interval [0, 13) that is partitioned into the following ranges:
These ranges are distributed on three part with:[0,3), [3, 6), [6, 8), [8, 10), [10, 13).
The part ids can be queried from the get_part_ids array, and the ranges are represented as offsets, accessed by get_range_bounds, leading to the offset array:p_0 = [0, 3) + [6, 8) + [10, 13), p_1 = [3, 6), p_2 = [8, 10).
so that individual ranges are given byr = [0, 3, 6, 8, 10, 13]
[r[i], r[i + 1]). Since each part may be associated with multiple ranges, it is possible to get the starting index for each range that is local to the owning part, see get_range_starting_indices. These indices can be used to easily iterate over part local data. For example, the above partition has the following starting indiceswhich you can use to iterate only over the the second range of part 0 (the third global range) withstarting_index[0] = 0, starting_index[1] = 0, starting_index[2] = 3, // second range of part 0 starting_index[3] = 0, starting_index[4] = 5, // third range of part 0
for(int i = 0; i < r[3] - r[2]; ++i){ data[starting_index[2] + i] = val; }
- Template Parameters:
LocalIndexType – The index type used for part-local indices. To prevent overflows, no single part’s size may exceed this index type’s maximum value.
GlobalIndexType – The index type used for the global indices. Needs to be at least as large a type as LocalIndexType.
Public Functions
-
inline size_type get_size() const#
Returns the total number of elements represented by this partition.
- Returns:
number elements.
-
inline size_type get_num_ranges() const noexcept#
Returns the number of ranges stored by this partition. This size refers to the data returned by get_range_bounds().
- Returns:
number of ranges.
-
inline comm_index_type get_num_parts() const noexcept#
Returns the number of parts represented in this partition.
- Returns:
number of parts.
-
inline comm_index_type get_num_empty_parts() const noexcept#
Returns the number of empty parts within this partition.
- Returns:
number of empty parts.
-
inline const global_index_type *get_range_bounds() const noexcept#
Returns the ranges boundary array stored by this partition.
range_bounds[i]is the beginning (inclusive) andrange_bounds[i + 1]is the end (exclusive) of the ith range.- Returns:
range boundaries array.
-
inline const comm_index_type *get_part_ids() const noexcept#
Returns the part IDs of the ranges in this partition. For each range from get_range_bounds(), it stores the part ID in the interval [0, get_num_parts() - 1].
- Returns:
part ID array.
- inline const local_index_type *get_range_starting_indices(
Returns the part-local starting index for each range in this partition.
Consider the partition on
[0, 10)withThenp_1 = [0-4) + [7-10), p_2 = [4-7).
range_starting_indices[0] = 0,range_starting_indices[1] = 0,range_starting_indices[2] = 4.- Returns:
part-local starting index array.
-
inline const local_index_type *get_part_sizes() const noexcept#
Returns the part size array. part_sizes[p] stores the total number of indices in part
p.- Returns:
part size array.
-
local_index_type get_part_size(comm_index_type part) const#
Returns the size of a part given by its part ID.
Warning
Triggers a copy from device to host.
- Parameters:
part – the part ID.
- Returns:
size of part.
- inline const segmented_array<size_type> &get_ranges_by_part(
Returns the range IDs segmented by their part ID.
- Returns:
range IDs segmented by part IDs
-
bool has_connected_parts() const#
Checks if each part has no more than one contiguous range.
- Returns:
true if each part has no more than one contiguous range.
-
bool has_ordered_parts() const#
Checks if the ranges are ordered by their part index.
Implies that the partition is connected.
- Returns:
true if the ranges are ordered by their part index.
Public Static Functions
- std::shared_ptr<const Executor> exec,
- const array<comm_index_type> &mapping,
- comm_index_type num_parts,
Builds a partition from a given mapping global_index -> part_id.
- std::shared_ptr<const Executor> exec,
- const array<global_index_type> &ranges,
- const array<comm_index_type> &part_ids = {},
Builds a partition consisting of contiguous ranges, one for each part.
- Parameters:
exec – the Executor on which the partition should be built
ranges – the boundaries of the ranges representing each part. Part part_id[i] contains the indices [ranges[i], ranges[i + 1]). Has to contain at least one element. The first element has to be 0.
part_ids – the part ids of the provided ranges. If empty, then it will assume range i belongs to part i.
- Returns:
a Partition representing the given contiguous partitioning.