From d2c47b54445f633a2c9191adba39263e695b2fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9ophile=20Bastian?= Date: Thu, 14 Sep 2023 15:23:14 +0200 Subject: [PATCH] Palmed: image tests --- manuscrit/30_palmed/00_intro.tex | 1 + manuscrit/30_palmed/10_resource_models.tex | 20 +++++++++++++++++++ manuscrit/30_palmed/main.tex | 3 +++ manuscrit/assets/imgs/30_palmed/hedgehog.jpg | Bin 0 -> 17433 bytes 4 files changed, 24 insertions(+) create mode 100644 manuscrit/30_palmed/00_intro.tex create mode 100644 manuscrit/30_palmed/10_resource_models.tex create mode 100644 manuscrit/assets/imgs/30_palmed/hedgehog.jpg diff --git a/manuscrit/30_palmed/00_intro.tex b/manuscrit/30_palmed/00_intro.tex new file mode 100644 index 0000000..8759996 --- /dev/null +++ b/manuscrit/30_palmed/00_intro.tex @@ -0,0 +1 @@ +\todo{Introduction} diff --git a/manuscrit/30_palmed/10_resource_models.tex b/manuscrit/30_palmed/10_resource_models.tex new file mode 100644 index 0000000..b81c7a6 --- /dev/null +++ b/manuscrit/30_palmed/10_resource_models.tex @@ -0,0 +1,20 @@ +\section{Resource models} + +As we saw earlier in \qtodo{ref}, the behaviour of a CPU's backend can be, +throughput-wise, characterized by the behaviour of its ports. Thus, a +throughput model of the backend consists in a mapping of the ISA's instructions +to execution ports of the backend, called a \emph{port mapping}. + +The mapping, however, is not direct: we also saw in \qtodo{ref} that +instructions are themselves broken down into a number of \uops{}, which all +have to be executed. Each of those \uops{} are then scheduled on one of the +compatible execution ports of the CPU. A port mapping, thus, is actually a +tripartite graph: a first layer mapping instructions to \uops{}, followed by a +second layer mapping \uops{} to ports. In +\autoref{fig:port_mapping_excerpt_skx_tri}, + +\begin{figure} + \centering + %\includegraphics{../assets/imgs/30_palmed/p0156_tri} + \includegraphics[width=0.2\textwidth]{hedgehog.jpg} +\end{figure} diff --git a/manuscrit/30_palmed/main.tex b/manuscrit/30_palmed/main.tex index a92d05b..19c6a65 100644 --- a/manuscrit/30_palmed/main.tex +++ b/manuscrit/30_palmed/main.tex @@ -1 +1,4 @@ \chapter{Palmed: automatically modelling the backend} + +\input{00_intro.tex} +\input{10_resource_models.tex} diff --git a/manuscrit/assets/imgs/30_palmed/hedgehog.jpg b/manuscrit/assets/imgs/30_palmed/hedgehog.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de1ab7452c062b2c6f2acf17f3d220a205f2dff1 GIT binary patch literal 17433 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 nR=S+