VeloGraphX
High-performance dynamic graph analytics in C++20
Loading...
Searching...
No Matches
partitioner.hpp
Go to the documentation of this file.
1#pragma once
2
4
5#include <algorithm>
6#include <cstddef>
7#include <optional>
8#include <utility>
9#include <vector>
10
11namespace velographx {
12
13inline std::vector<std::pair<std::size_t, std::size_t>> contiguous_partitions(
14 std::size_t n, std::size_t parts) {
15 parts = std::max<std::size_t>(1, std::min(parts, std::max<std::size_t>(1, n)));
16 std::vector<std::pair<std::size_t, std::size_t>> out;
17 out.reserve(parts);
18 for (std::size_t p = 0; p < parts; ++p) {
19 const auto begin = n * p / parts;
20 const auto end = n * (p + 1) / parts;
21 out.push_back({begin, end});
22 }
23 return out;
24}
25
27 std::size_t partition_id{0};
28 std::size_t vertex_begin{0};
29 std::size_t vertex_end{0};
30 std::optional<std::size_t> node_id;
31 std::vector<std::size_t> local_cpus;
32};
33
34inline std::vector<NumaVertexPartition> plan_numa_vertex_partitions(
35 std::size_t vertex_count, const NumaInfo& info, NumaMode mode,
36 std::size_t partitions = 0) {
37 const std::size_t topology_nodes = info.topology.empty() ? 1 : info.topology.size();
38 if (partitions == 0) partitions = topology_nodes;
39 const auto ranges = contiguous_partitions(vertex_count, partitions);
40
41 std::vector<NumaVertexPartition> result;
42 result.reserve(ranges.size());
43 for (std::size_t i = 0; i < ranges.size(); ++i) {
44 NumaVertexPartition placement;
45 placement.partition_id = i;
46 placement.vertex_begin = ranges[i].first;
47 placement.vertex_end = ranges[i].second;
48 if (mode != NumaMode::off && !info.topology.empty()) {
49 const auto& node = info.topology[i % info.topology.size()];
50 placement.node_id = node.id;
51 placement.local_cpus = node.cpus;
52 }
53 result.push_back(std::move(placement));
54 }
55 return result;
56}
57
58inline std::optional<std::size_t> numa_node_for_vertex(
59 std::size_t vertex, const std::vector<NumaVertexPartition>& partitions) noexcept {
60 for (const auto& partition : partitions) {
61 if (vertex >= partition.vertex_begin && vertex < partition.vertex_end)
62 return partition.node_id;
63 }
64 return std::nullopt;
65}
66
67} // namespace velographx
std::optional< std::size_t > numa_node_for_vertex(std::size_t vertex, const std::vector< NumaVertexPartition > &partitions) noexcept
std::vector< std::pair< std::size_t, std::size_t > > contiguous_partitions(std::size_t n, std::size_t parts)
constexpr std::size_t vertex_count(const Graph &graph)
std::vector< NumaVertexPartition > plan_numa_vertex_partitions(std::size_t vertex_count, const NumaInfo &info, NumaMode mode, std::size_t partitions=0)
std::vector< NumaNodeInfo > topology
Definition numa.hpp:23
std::optional< std::size_t > node_id
std::vector< std::size_t > local_cpus