From 94818536cd71795f1b1de68ca20db7283a4c8e42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Constantin=20F=C3=BCrst?= Date: Sun, 4 Feb 2024 16:42:16 +0100 Subject: [PATCH] improve the section on qdp in state chapter and use (redone) graphic for simple query --- thesis/content/20_state.tex | 25 ++++++++++++++++--------- thesis/images/simple-query-graphic.pdf | Bin 0 -> 28917 bytes 2 files changed, 16 insertions(+), 9 deletions(-) create mode 100644 thesis/images/simple-query-graphic.pdf diff --git a/thesis/content/20_state.tex b/thesis/content/20_state.tex index 679e030..f0dc8e8 100644 --- a/thesis/content/20_state.tex +++ b/thesis/content/20_state.tex @@ -29,16 +29,23 @@ % Kapitel wird in der Regel zuerst geschrieben und ist das Einfachste % (oder das Schwerste weil erste). -\todo{write introductory paragraph} +This chapter introduces the relevant technologies and concepts for this thesis. The goal of this thesis is to apply the \glsentrylong{dsa} to the concept of \glsentrylong{qdp}, therefore we will familiarize ourselves with both of these terms. We also give background on \glsentrylong{hbm}, which is a secondary memory technology to the \glsentryshort{dram} used in current computers. \section{\glsentrylong{hbm}} \label{sec:state:hbm} -\glsentrylong{hbm} is a novel memory technology that promises an increase in peak bandwidth. It consists of stacked \glsentryshort{dram} dies \cite[p. 1]{hbm-arch-paper} and is gradually being integrated into server processors, with the Intel® Xeon® Max Series \cite{intel:xeonmaxbrief} being one recent example. \gls{hbm} on these systems can be configured in different memory modes, most notably, HBM Flat Mode and HBM Cache Mode \cite{intel:xeonmaxbrief}. The former gives applications direct control, requiring code changes, while the latter utilizes the \gls{hbm} as a cache for the system's \glsentryshort{dram}-based main memory \cite{intel:xeonmaxbrief}. \par +\glsentrylong{hbm} is an emerging memory technology that promises an increase in peak bandwidth. It consists of stacked \glsentryshort{dram} dies \cite[p. 1]{hbm-arch-paper} and is gradually being integrated into server processors, with the Intel® Xeon® Max Series \cite{intel:xeonmaxbrief} being one recent example. \gls{hbm} on these systems can be configured in different memory modes, most notably, HBM Flat Mode and HBM Cache Mode \cite{intel:xeonmaxbrief}. The former gives applications direct control, requiring code changes, while the latter utilizes the \gls{hbm} as a cache for the system's \glsentryshort{dram}-based main memory \cite{intel:xeonmaxbrief}. \par \section{\glsentrylong{qdp}} -\todo{write this section} +\begin{figure}[ht] + \centering + \includegraphics[width=0.7\textwidth]{images/simple-query-graphic.pdf} + \caption{Illustration of a simple query in (a) and the corresponding pipeline in (b). Taken from \cite[Fig. 1]{dimes-prefetching}.} + \label{fig:qdp-simple-query} +\end{figure} + +\gls{qdp} introduces a targeted strategy for optimizing database performance by intelligently prefetching relevant data. To achieve this, \gls{qdp} analyses queries, splitting them into distinct sub-tasks, resulting in the so-called query execution plan. An example of a query and a corresponding plan is depicted in Figure \ref{fig:qdp-simple-query}. From this plan, \gls{qdp} determines columns in the database used in subsequent tasks. Once identified, the system proactively copies these columns into faster memory during the execution of the pipeline. For the example (Figure \ref{fig:qdp-simple-query}), column \texttt{b} is accessed in \(SCAN_b\) and \(PROJECT_{b<-a}\) and column \texttt{a} is only accessed for \(SCAN_a\). Therefore, only column \texttt{b} will be chosen for prefetching in this scenario. \cite{dimes-prefetching} \par \section{\glsentrylong{dsa}} @@ -48,7 +55,7 @@ Introduced with the \(4^{th}\) generation of Intel Xeon Scalable Processors, the \subsection{Hardware Architecture} \label{subsection:dsa-hwarch} -\begin{figure}[H] +\begin{figure}[ht] \centering \includegraphics[width=0.9\textwidth]{images/block-dsa-hwarch.pdf} \caption{\glsentrylong{dsa} Internal Architecture \cite[Fig. 1 (a)]{intel:analysis}. Shows the components that the chip is made up of, how they are connected and which outside components the \glsentryshort{dsa} communicates with.} @@ -59,11 +66,11 @@ The \gls{dsa} chip is directly integrated into the processor and attaches via th \subsubsection{Architectural Components} -\textsc{Component \rom{1} \glsentrylong{dsa:wq}:} \gls{dsa:wq}s provide the means to submit tasks to the device and will be described in more detail shortly. They are marked yellow in Figure \ref{fig:dsa-internal-block}. A \gls{dsa:wq} is accessible through so-called portals, light blue in Figure \ref{fig:dsa-internal-block}, which are mapped memory regions. Submission of work is done by writing a descriptor to one of these. A descriptor is 64 bytes in size and may contain one specific task (task descriptor) or the location of a task array in memory (batch descriptor). Through these portals, the submitted descriptor reaches a queue. There are two possible queue types with different submission methods and use cases. The \gls{dsa:swq} is intended to provide synchronized access to multiple processes and each group may only have one attached. A \gls{pcie-dmr}, which guarantees implicit synchronization, is generated via \gls{x86:enqcmd} and communicates with the device before writing \cite[Sec. 3.3.1]{intel:dsaspec}. This may result in higher submission cost, compared to the \gls{dsa:dwq} to which a descriptor is submitted via \gls{x86:movdir64b} \cite[Sec. 3.3.2]{intel:dsaspec}. \par +\textsc{Component \rom{1}, \glsentrylong{dsa:wq}:} \gls{dsa:wq}s provide the means to submit tasks to the device and will be described in more detail shortly. They are marked yellow in Figure \ref{fig:dsa-internal-block}. A \gls{dsa:wq} is accessible through so-called portals, light blue in Figure \ref{fig:dsa-internal-block}, which are mapped memory regions. Submission of work is done by writing a descriptor to one of these. A descriptor is 64 bytes in size and may contain one specific task (task descriptor) or the location of a task array in memory (batch descriptor). Through these portals, the submitted descriptor reaches a queue. There are two possible queue types with different submission methods and use cases. The \gls{dsa:swq} is intended to provide synchronized access to multiple processes and each group may only have one attached. A \gls{pcie-dmr}, which guarantees implicit synchronization, is generated via \gls{x86:enqcmd} and communicates with the device before writing \cite[Sec. 3.3.1]{intel:dsaspec}. This may result in higher submission cost, compared to the \gls{dsa:dwq} to which a descriptor is submitted via \gls{x86:movdir64b} \cite[Sec. 3.3.2]{intel:dsaspec}. \par -\textsc{Component \rom{2} Engine:} An Engine is the processing-block that connects to memory and performs the described task. To handle the different descriptors, each Engine has two internal execution paths. One for a task and the other for a batch descriptor. Processing a task descriptor is straightforward, as all information required to complete the operation are contained within \todo{cite this}. For a batch, the \gls{dsa} reads the batch descriptor, then fetches all task descriptors from memory and processes them \cite[Sec. 3.8]{intel:dsaspec}. An Engine can coordinate with the operating system in case it encounters a page fault, waiting on its resolution, if configured to do so, while otherwise, an error will be generated in this scenario \cite[Sec. 2.2, Block on Fault]{intel:dsaspec}. \par +\textsc{Component \rom{2}, Engine:} An Engine is the processing-block that connects to memory and performs the described task. To handle the different descriptors, each Engine has two internal execution paths. One for a task and the other for a batch descriptor. Processing a task descriptor is straightforward, as all information required to complete the operation are contained within \todo{cite this}. For a batch, the \gls{dsa} reads the batch descriptor, then fetches all task descriptors from memory and processes them \cite[Sec. 3.8]{intel:dsaspec}. An Engine can coordinate with the operating system in case it encounters a page fault, waiting on its resolution, if configured to do so, while otherwise, an error will be generated in this scenario \cite[Sec. 2.2, Block on Fault]{intel:dsaspec}. \par -\textsc{Component \rom{3} Groups:} Groups tie Engines and \glsentrylong{dsa:wq}s together, indicated by the dotted blue line around the components of Group 0 in Figure \ref{fig:dsa-internal-block}. This means, that tasks from one \gls{dsa:wq} may be processed from multiple Engines and vice-versa, depending on the configuration. This flexibility is achieved through the Group Arbiter, represented by the orange block in Figure \ref{fig:dsa-internal-block}, which connects the two components according to the user-defined configuration. \par +\textsc{Component \rom{3}, Groups:} Groups tie Engines and \glsentrylong{dsa:wq}s together, indicated by the dotted blue line around the components of Group 0 in Figure \ref{fig:dsa-internal-block}. This means, that tasks from one \gls{dsa:wq} may be processed from multiple Engines and vice-versa, depending on the configuration. This flexibility is achieved through the Group Arbiter, represented by the orange block in Figure \ref{fig:dsa-internal-block}, which connects the two components according to the user-defined configuration. \par \subsubsection{Virtual Address Resolution} @@ -81,7 +88,7 @@ Ordering of operations is only guaranteed for a configuration with one \gls{dsa: \subsection{Software View} \label{subsec:state:dsa-software-view} -\begin{figure}[H] +\begin{figure}[h] \centering \includegraphics[width=0.5\textwidth]{images/block-dsa-swarch.pdf} \caption{\glsentrylong{dsa} Software View \cite[Fig. 1 (b)]{intel:analysis}. Illustrating the software stack and internal interactions from user applications, through the driver to the portal for work submission.} @@ -99,7 +106,7 @@ With some limitations, like lacking support for \gls{dsa:dwq} submission, this l As mentioned in Subsection \ref{subsec:state:dsa-software-view}, \gls{intel:dml} offers a high level interface for interacting with the hardware accelerator, specifically Intel \gls{dsa}. Opting for the C++ interface, we will now demonstrate its usage by example of a simple memcopy implementation for the \gls{dsa}. \par -\begin{figure}[H] +\begin{figure}[h] \centering \includegraphics[width=0.9\textwidth]{images/nsd-dsamemcpy.pdf} \caption{\glsentrylong{dml} Memcpy Implementation Pseudocode. Performs copy operation of a block of memory from source to destination. The \glsentryshort{dsa} executing this copy can be selected with the parameter \texttt{node}, and the template parameter \texttt{path} elects whether to run on hardware (Intel \glsentryshort{dsa}) or software (CPU).} diff --git a/thesis/images/simple-query-graphic.pdf b/thesis/images/simple-query-graphic.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0f15a850edd8aa7b4f3d279505eb099c968b4947 GIT binary patch literal 28917 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