Expand description
An array that partially “patches” another array with new values.
§Background
This is meant to be the foundation of a fully data-parallel patching strategy, based on the work published in “G-ALP” from Hepkema et al.
Patching is common when an encoding almost completely covers an array save a few exceptions. In that case, rather than avoid the encoding entirely, it’s preferable to
- Replace unencodable values with fillers (zeros, frequent values, nulls, etc.)
- Wrap the array with a
PatchedArraysignaling that when the original array is executed, some of the decoded values must be overwritten.
In Vortex, the FastLanes bit-packing encoding is often the terminal node in an encoding tree, and FastLanes has an intrinsic chunking of 1024 elements. Thus, 1024 elements is pervasively a useful unit of chunking throughout Vortex, and so we use 1024 as a chunk size here as well.
§Details
To patch an array, we first divide it into a set of chunks of length 1024, and then within each chunk, we assign each position to a lane. The number of lanes depends on the width of the underlying type.
Thus, rather than sorting patch indices and values by their global offset, they are sorted primarily by their chunk, and then subsequently by their lanes.
The Patched array layout has 4 children
inner: the inner array is the one containing encoded values, including the filler values that need to be patched over at execution timelane_offsets: this is an indexing buffer that allows you to see into ranges of the other two childrenindices: An array ofu16chunk indices, indicating where within the chunk should the value be overwritten by the patch valuevalues: The child array containing the patch values, which should be inserted over the values of theinnerat the locations provided byindices
indices and values are aligned and accessed together.
chunk 0 chunk 0 chunk 0 chunk 0 chunk 0 chunk 0
lane 0 lane 1 lane 2 lane 3 lane 4 lane 5
┌────────────┬────────────┬────────────┬────────────┬────────────┬────────────┐
lane_offsets │ 0 │ 0 │ 2 │ 2 │ 3 │ 5 │ ...
└─────┬──────┴─────┬──────┴─────┬──────┴──────┬─────┴──────┬─────┴──────┬─────┘
│ │ │ │ │ │
│ │ │ │ │ │
┌─────┴────────────┘ └──────┬──────┘ ┌──────┘ └─────┐
│ │ │ │
│ │ │ │
│ │ │ │
▼────────────┬────────────┬────────────▼────────────▼────────────┬────────────▼
indices │ │ │ │ │ │ │
│ │ │ │ │ │ │
├────────────┼────────────┼────────────┼────────────┼────────────┼────────────┤
values │ │ │ │ │ │ │
│ │ │ │ │ │ │
└────────────┴────────────┴────────────┴────────────┴────────────┴────────────┘It turns out that this layout is optimal for executing patching on GPUs, because the
lane_offsets allows each thread in a warp to seek to its patches in constant time.
Structs§
- Patched
- Patched
Data - Patched
Metadata - Patched
Slots - Patched
Slots View - Borrowed view of
PatchedSlots.
Traits§
- Patched
Array Ext - Patched
Array Slots Ext - Typed array accessors for
Patched.
Type Aliases§
- Patched
Array - A
Patched-encoded Vortex array.