Tweaks and add more planned sections
All checks were successful
Tests / Clang total: 1096, passed: 1096
Clang |Total|New|Outstanding|Fixed|Trend
|:-:|:-:|:-:|:-:|:-:
|0|0|0|0|:clap:
Tests / SIMD fallback total: 1096, passed: 1096
Tests / Release [gcc] total: 1096, passed: 1096
GNU C Compiler (gcc) |Total|New|Outstanding|Fixed|Trend
|:-:|:-:|:-:|:-:|:-:
|0|0|0|0|:clap:
Tests / Release [gcc,aarch64] total: 824, passed: 824
Tests / Coverage total: 823, passed: 823
weaselab/conflict-set/pipeline/head This commit looks good
All checks were successful
Tests / Clang total: 1096, passed: 1096
Clang |Total|New|Outstanding|Fixed|Trend
|:-:|:-:|:-:|:-:|:-:
|0|0|0|0|:clap:
Tests / SIMD fallback total: 1096, passed: 1096
Tests / Release [gcc] total: 1096, passed: 1096
GNU C Compiler (gcc) |Total|New|Outstanding|Fixed|Trend
|:-:|:-:|:-:|:-:|:-:
|0|0|0|0|:clap:
Tests / Release [gcc,aarch64] total: 824, passed: 824
Tests / Coverage total: 823, passed: 823
weaselab/conflict-set/pipeline/head This commit looks good
This commit is contained in:
@@ -770,7 +770,7 @@ template <class NodeT> int getChildGeqSimd(NodeT *self, int child) {
|
|||||||
|
|
||||||
// cachegrind says the plain loop is fewer instructions and more mis-predicted
|
// cachegrind says the plain loop is fewer instructions and more mis-predicted
|
||||||
// branches. Microbenchmark says plain loop is faster. It's written in this
|
// branches. Microbenchmark says plain loop is faster. It's written in this
|
||||||
// weird "generic" way though in case someday we can use the simd
|
// weird "generic" way though so that someday we can use the simd
|
||||||
// implementation easily if we want.
|
// implementation easily if we want.
|
||||||
if constexpr (std::is_same_v<NodeT, Node3>) {
|
if constexpr (std::is_same_v<NodeT, Node3>) {
|
||||||
Node3 *n = (Node3 *)self;
|
Node3 *n = (Node3 *)self;
|
||||||
|
@@ -71,6 +71,13 @@ See figure \ref{fig:tree} for an example tree after inserting
|
|||||||
$\{ART\} \rightarrow 4$.
|
$\{ART\} \rightarrow 4$.
|
||||||
Each node shows its partial prefix annotated with $max$ or $max,point,range$.
|
Each node shows its partial prefix annotated with $max$ or $max,point,range$.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\caption{}
|
||||||
|
\label{fig:tree}
|
||||||
|
\centering
|
||||||
|
\includegraphics{tree.tikz}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
\subsection{Checking point reads} \label{Checking point reads}
|
\subsection{Checking point reads} \label{Checking point reads}
|
||||||
|
|
||||||
The algorithm for checking point reads follows directly from the definitions of the \emph{point} and \emph{range} fields.
|
The algorithm for checking point reads follows directly from the definitions of the \emph{point} and \emph{range} fields.
|
||||||
@@ -90,7 +97,7 @@ Checking range reads is more involved. Logically the idea is to partition the ra
|
|||||||
The max version of a single point is $v$ as described in \ref{Checking point reads}.
|
The max version of a single point is $v$ as described in \ref{Checking point reads}.
|
||||||
The max version of a prefix range is the $max$ of the node associated with the prefix if such a node exists, and $range$ of the next node with a $range$ field otherwise.
|
The max version of a prefix range is the $max$ of the node associated with the prefix if such a node exists, and $range$ of the next node with a $range$ field otherwise.
|
||||||
If there is no next node with a range field, then we ignore that subrange in our max version calculation.
|
If there is no next node with a range field, then we ignore that subrange in our max version calculation.
|
||||||
The max version among all versions and max versions of subranges in this partition is the max version of the whole range, which we compare to $r$.
|
The max version among all max versions of subranges in this partition is the max version of the whole range, which we compare to $r$.
|
||||||
|
|
||||||
Let's start with partitioning the range in the case where the beginning of the range is a prefix of the end of the range.
|
Let's start with partitioning the range in the case where the beginning of the range is a prefix of the end of the range.
|
||||||
We'll be able to use this as a subroutine in the general case.
|
We'll be able to use this as a subroutine in the general case.
|
||||||
@@ -109,7 +116,7 @@ Recall that the range $[a_{0}\dots a_{k} 0, a_{0}\dots a_{k} 1)$ is equivalent t
|
|||||||
\begin{align*}
|
\begin{align*}
|
||||||
\dots \quad \cup \quad & [a_{0}\dots a_{k} 0, a_{0}\dots a_{k} 1) \quad \cup \\
|
\dots \quad \cup \quad & [a_{0}\dots a_{k} 0, a_{0}\dots a_{k} 1) \quad \cup \\
|
||||||
& [a_{0}\dots a_{k} 1, a_{0}\dots a_{k} 2) \quad \cup \\
|
& [a_{0}\dots a_{k} 1, a_{0}\dots a_{k} 2) \quad \cup \\
|
||||||
& \dots \\
|
& \dots \quad \cup \\
|
||||||
& [a_{0}\dots a_{k} (a_{k+1}-1), a_{0}\dots a_{k+1})
|
& [a_{0}\dots a_{k} (a_{k+1}-1), a_{0}\dots a_{k+1})
|
||||||
\end{align*}
|
\end{align*}
|
||||||
|
|
||||||
@@ -126,7 +133,7 @@ Let's now consider a range where begin is not a prefix of end.
|
|||||||
\]
|
\]
|
||||||
|
|
||||||
Let $i$ be the lowest index such that $a_{i} \neq b_{i}$.
|
Let $i$ be the lowest index such that $a_{i} \neq b_{i}$.
|
||||||
For brevity we will elide the common prefix up until $i$ in the following discussion.
|
For brevity we will elide the common prefix up until $i$ in the following discussion so that our range is denoted as $[a_{i}\dots a_{m}, b_{i}\dots b_{n})$.
|
||||||
We'll start with partitioning this range coarsely:
|
We'll start with partitioning this range coarsely:
|
||||||
|
|
||||||
\begin{align*}
|
\begin{align*}
|
||||||
@@ -152,7 +159,7 @@ Otherwise we'll partition this into
|
|||||||
& [a_{i}\dots 255, a_{i}\dots (a_{m-1} + 1) )
|
& [a_{i}\dots 255, a_{i}\dots (a_{m-1} + 1) )
|
||||||
\end{align*}
|
\end{align*}
|
||||||
|
|
||||||
and repeat starting at \footnote{This doesn't explicitly describe how to handle the case where $a_{m-1} = 255$. In this case we would skip to the largest $j < m$ such that $a_{j} \neq 255$. We know $j \geq i$ since if $a_{i} = 255$ then the range is inverted.}
|
and repeat \footnote{This doesn't explicitly describe how to handle the case where $a_{m-1} = 255$. In this case we would skip to the largest $j < m$ such that $a_{j} \neq 255$. We know $j \geq i$ since if $a_{i} = 255$ then the range is inverted.} starting at
|
||||||
\[
|
\[
|
||||||
\dots \quad \cup \quad [a_{i}\dots (a_{m-1} + 1), a_{i}\dots (a_{m-1} + 2))
|
\dots \quad \cup \quad [a_{i}\dots (a_{m-1} + 1), a_{i}\dots (a_{m-1} + 2))
|
||||||
\]
|
\]
|
||||||
@@ -180,12 +187,11 @@ A point write of $k$ at version $v$ simply sets $max \gets v$ \footnote{Recall t
|
|||||||
A range write of $[b, e)$ at version $v$ performs a point write of $b$ at $v$, and then inserts a node at $e$ with $range$ set to $v$, and $point$ set such that the result of checking a read of $e$ is unaffected.
|
A range write of $[b, e)$ at version $v$ performs a point write of $b$ at $v$, and then inserts a node at $e$ with $range$ set to $v$, and $point$ set such that the result of checking a read of $e$ is unaffected.
|
||||||
Nodes along the search path to $e$ that are a strict prefix of $e$ get $max$ set to $v$, and all nodes between $b$ and $e$ are removed.
|
Nodes along the search path to $e$ that are a strict prefix of $e$ get $max$ set to $v$, and all nodes between $b$ and $e$ are removed.
|
||||||
|
|
||||||
\begin{figure}
|
\section{Evaluation}
|
||||||
\caption{}
|
|
||||||
\label{fig:tree}
|
\section{Testing}
|
||||||
\centering
|
|
||||||
\includegraphics{tree.tikz}
|
\section{Conclusion}
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
\printbibliography
|
\printbibliography
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user