@@ -27,71 +27,6 @@ use crate::patches::Patches;
2727use crate :: stats:: ArrayStats ;
2828use crate :: validity:: Validity ;
2929
30- /// An array that partially "patches" another array with new values.
31- ///
32- /// # Background
33- ///
34- /// This is meant to be the foundation of a fully data-parallel patching strategy, based on the
35- /// work published in ["G-ALP" from Hepkema et al.](https://ir.cwi.nl/pub/35205/35205.pdf)
36- ///
37- /// Patching is common when an encoding almost completely covers an array save a few exceptions.
38- /// In that case, rather than avoid the encoding entirely, it's preferable to
39- ///
40- /// * Replace unencodable values with fillers (zeros, frequent values, nulls, etc.)
41- /// * Wrap the array with a `PatchedArray` signaling that when the original array is executed,
42- /// some of the decoded values must be overwritten.
43- ///
44- /// In Vortex, the FastLanes bit-packing encoding is often the terminal node in an encoding tree,
45- /// and FastLanes has an intrinsic chunking of 1024 elements. Thus, 1024 elements is pervasively
46- /// a useful unit of chunking throughout Vortex, and so we use 1024 as a chunk size here
47- /// as well.
48- ///
49- /// # Details
50- ///
51- /// To patch an array, we first divide it into a set of chunks of length 1024, and then within
52- /// each chunk, we assign each position to a lane. The number of lanes depends on the width of
53- /// the underlying type.
54- ///
55- /// Thus, rather than sorting patch indices and values by their global offset, they are sorted
56- /// primarily by their chunk, and then subsequently by their lanes.
57- ///
58- /// The Patched array layout has 4 children
59- ///
60- /// * `inner`: the inner array is the one containing encoded values, including the filler values
61- /// that need to be patched over at execution time
62- /// * `lane_offsets`: this is an indexing buffer that allows you to see into ranges of the other
63- /// two children
64- /// * `indices`: An array of `u16` chunk indices, indicating where within the chunk should the value
65- /// be overwritten by the patch value
66- /// * `values`: The child array containing the patch values, which should be inserted over
67- /// the values of the `inner` at the locations provided by `indices`
68- ///
69- /// `indices` and `values` are aligned and accessed together.
70- ///
71- /// ```text
72- ///
73- /// chunk 0 chunk 0 chunk 0 chunk 0 chunk 0 chunk 0
74- /// lane 0 lane 1 lane 2 lane 3 lane 4 lane 5
75- /// ┌────────────┬────────────┬────────────┬────────────┬────────────┬────────────┐
76- /// lane_offsets │ 0 │ 0 │ 2 │ 2 │ 3 │ 5 │ ...
77- /// └─────┬──────┴─────┬──────┴─────┬──────┴──────┬─────┴──────┬─────┴──────┬─────┘
78- /// │ │ │ │ │ │
79- /// │ │ │ │ │ │
80- /// ┌─────┴────────────┘ └──────┬──────┘ ┌──────┘ └─────┐
81- /// │ │ │ │
82- /// │ │ │ │
83- /// │ │ │ │
84- /// ▼────────────┬────────────┬────────────▼────────────▼────────────┬────────────▼
85- /// indices │ │ │ │ │ │ │
86- /// │ │ │ │ │ │ │
87- /// ├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
88- /// values │ │ │ │ │ │ │
89- /// │ │ │ │ │ │ │
90- /// └────────────┴────────────┴────────────┴────────────┴────────────┴────────────┘
91- /// ```
92- ///
93- /// It turns out that this layout is optimal for executing patching on GPUs, because the
94- /// `lane_offsets` allows each thread in a warp to seek to its patches in constant time.
9530/// The inner array containing the base unpatched values.
9631pub ( super ) const INNER_SLOT : usize = 0 ;
9732/// The lane offsets array for locating patches within lanes.
0 commit comments