VeloGraphX
High-performance dynamic graph analytics in C++20
Loading...
Searching...
No Matches
degree_frontier_scheduler.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <algorithm>
4#include <cstddef>
5#include <cstdint>
6#include <numeric>
7#include <vector>
8
9namespace velographx {
10
16
24
26 const std::vector<std::size_t>& degrees,
27 std::size_t workers,
28 double dense_frontier_fraction = 0.08,
29 std::size_t high_degree_threshold = 64) {
31 decision.frontier_vertices = degrees.size();
32 decision.frontier_edges = std::accumulate(degrees.begin(), degrees.end(), std::size_t{0});
33 decision.average_degree = degrees.empty()
34 ? 0.0
35 : static_cast<double>(decision.frontier_edges) / static_cast<double>(degrees.size());
36
37 if (workers == 0) workers = 1;
38 const auto high_degree = static_cast<std::size_t>(std::count_if(
39 degrees.begin(), degrees.end(), [high_degree_threshold](std::size_t degree) {
40 return degree >= high_degree_threshold;
41 }));
42 const double high_degree_fraction = degrees.empty()
43 ? 0.0
44 : static_cast<double>(high_degree) / static_cast<double>(degrees.size());
45
46 if (decision.average_degree >= static_cast<double>(high_degree_threshold) ||
47 high_degree_fraction >= dense_frontier_fraction) {
49 } else if (decision.average_degree >= static_cast<double>(high_degree_threshold) * 0.25) {
51 } else {
53 }
54
55 const std::size_t work = decision.mode == FrontierScheduleMode::vertex_balanced
56 ? decision.frontier_vertices
57 : std::max(decision.frontier_vertices, decision.frontier_edges);
58 const std::size_t target_chunks = workers * 8;
59 decision.recommended_grain = std::max<std::size_t>(1, (work + target_chunks - 1) / target_chunks);
60 return decision;
61}
62
63} // namespace velographx
FrontierScheduleDecision choose_frontier_schedule(const std::vector< std::size_t > &degrees, std::size_t workers, double dense_frontier_fraction=0.08, std::size_t high_degree_threshold=64)