xlog_cuda/
wcoj_metadata.rs1use std::collections::BTreeMap;
2
3use cudarc::driver::DeviceRepr;
4
5use crate::memory::TrackedCudaSlice;
6
7pub const WCOJ_HG_BLOCK_WORK_UNIT_DEFAULT: u32 = 1024;
8
9pub type VertexId = u8;
11
12pub type HeatDist = Vec<f64>;
14
15#[derive(Debug, Clone, PartialEq)]
17pub struct RootMetadata {
18 pub column_permutation: Vec<u8>,
20 pub sorted_layout_signature: LayoutSignature,
22 pub heat_distribution: HeatDist,
24}
25
26#[derive(Debug, Clone, PartialEq, Eq)]
28pub struct LayoutSignature {
29 pub relation_id: u32,
31 pub key_columns: Vec<usize>,
33 pub row_count: u32,
35}
36
37pub struct WcojRelationMetadata<K: DeviceRepr> {
38 pub unique_keys: TrackedCudaSlice<K>,
39 pub fan_out: TrackedCudaSlice<u32>,
40 pub prefix_sum: TrackedCudaSlice<u32>,
41 pub per_candidate_root: BTreeMap<VertexId, RootMetadata>,
43 pub total: u64,
44 pub key_count: u32,
45 pub row_count: u32,
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq)]
54pub enum WcojRootAggValue {
55 Y,
57 Z,
59}
60
61#[derive(Debug, Clone, Copy, PartialEq, Eq)]
67pub enum Wcoj4CycleRootAggValue {
68 X,
70 Y,
72 Z,
74}
75
76pub struct WcojTriangleHgWorkPlanU32 {
77 pub xy_work_prefix: TrackedCudaSlice<u32>,
78 pub xy_yz_start: TrackedCudaSlice<u32>,
79 pub xy_yz_end: TrackedCudaSlice<u32>,
80 pub xy_xz_start: TrackedCudaSlice<u32>,
81 pub xy_xz_end: TrackedCudaSlice<u32>,
82 pub block_counts: TrackedCudaSlice<u32>,
83 pub block_offsets: TrackedCudaSlice<u32>,
84 pub scratch_x: TrackedCudaSlice<u32>,
85 pub scratch_y: TrackedCudaSlice<u32>,
86 pub scratch_z: TrackedCudaSlice<u32>,
87 pub total_work: u32,
88 pub block_work_unit: u32,
89 pub row_count: u32,
90}
91
92pub struct WcojTriangleHgCountPhaseU32 {
93 pub total_rows_device: TrackedCudaSlice<u32>,
94 pub total_rows: u32,
95}
96
97pub struct WcojTriangleHgWorkPlanU64 {
98 pub xy_work_prefix: TrackedCudaSlice<u32>,
99 pub xy_yz_start: TrackedCudaSlice<u32>,
100 pub xy_yz_end: TrackedCudaSlice<u32>,
101 pub xy_xz_start: TrackedCudaSlice<u32>,
102 pub xy_xz_end: TrackedCudaSlice<u32>,
103 pub block_counts: TrackedCudaSlice<u32>,
104 pub block_offsets: TrackedCudaSlice<u32>,
105 pub total_work: u32,
106 pub block_work_unit: u32,
107 pub row_count: u32,
108}
109
110pub struct WcojCycle4HgWorkPlanU32 {
111 pub e1_work_prefix: TrackedCudaSlice<u32>,
112 pub e2_work_prefix: TrackedCudaSlice<u32>,
113 pub e1_e2_start: TrackedCudaSlice<u32>,
114 pub e1_e2_end: TrackedCudaSlice<u32>,
115 pub block_counts: TrackedCudaSlice<u32>,
116 pub block_offsets: TrackedCudaSlice<u32>,
117 pub total_work: u32,
118 pub block_work_unit: u32,
119 pub row_count: u32,
120}
121
122pub struct WcojCycle4HgWorkPlanU64 {
123 pub e1_work_prefix: TrackedCudaSlice<u32>,
124 pub e2_work_prefix: TrackedCudaSlice<u32>,
125 pub e1_e2_start: TrackedCudaSlice<u32>,
126 pub e1_e2_end: TrackedCudaSlice<u32>,
127 pub block_counts: TrackedCudaSlice<u32>,
128 pub block_offsets: TrackedCudaSlice<u32>,
129 pub total_work: u32,
130 pub block_work_unit: u32,
131 pub row_count: u32,
132}
133
134impl<K: DeviceRepr> WcojRelationMetadata<K> {
135 pub fn metadata_bytes(&self) -> u64 {
136 let key_bytes = self.unique_keys.len() as u64 * std::mem::size_of::<K>() as u64;
137 let fan_out_bytes = self.fan_out.len() as u64 * std::mem::size_of::<u32>() as u64;
138 let prefix_bytes = self.prefix_sum.len() as u64 * std::mem::size_of::<u32>() as u64;
139 key_bytes
140 .saturating_add(fan_out_bytes)
141 .saturating_add(prefix_bytes)
142 }
143}