source: trunk/IPs/systemC/processor/Morpheo/Documentation/Source/Documents/document-cache-specification/fr/04_overview_full.tex @ 45

Last change on this file since 45 was 45, checked in by rosiere, 17 years ago
  • Documentation : specification d'un cache de donnée non bloquant
  • Modification de l'aborescence
File size: 16.6 KB
Line 
1\Section{Vue d'ensemble du cache - Modèle complet}\label{overview_full}
2Cette section à pour but de montrer les modifications par rapport au modèle de base.
3
4\printgraphonly{CACHE_overview}{.8}
5
6\subSection{Solution retenue}
7
8Dans cette section, nous allons montrer la solution retenue. Il s'agit de l'intégration dans la modèle de base vue dans la section \ref{overview_partial} des solutions données au problème vus dans la section \ref{problem}.
9
10Le problème principal est la gestion par le cache de la consistance mémoire. Nous allons implémenté la solution consistant à vérrouiller les lignes de cache. Comme nous verrouillons au niveau des lignes de cache, nous avons besoin que la section {\bf SECTION\_DCACHE\_REQ} réalise le choix de la victime.
11
12La solution abordé dans la section précédente prévoit un bit de verrouillage qui est positionné à un lorsque une requête va être émise sur le bus, et positionné à 0 lors que la réponse reviens du bus. Tous requête qui accède à cette ligne de cache n'est pas accepter. De plus nous pouvons noter lors de la selection d'une victime, le cache n'accepte pas la requête si la victime est vérrouillé.
13
14Le tableau suivant résume pour tous les cas possibles, ce que la théorie autorise, et ce que notre algorithme actuelle autorise.
15
16\begin{tabular}{l|cc}
17Cas                                                                       & théorie & algo actuel \\
18\hline
192 lectures                     adressant la même adresse                  & oui & non \\ 
202 lectures                     adressant la même ligne de cache           & oui & non \\
212 lectures                     adressant deux lignes de cache différentes & oui & oui \\
222 écritures                    adressant la même adresse                  & non & non \\
232 écritures                    adressant la même ligne de cache           & oui & non \\
242 écritures                    adressant deux lignes de cache différentes & oui & oui \\
251 lecture  suivit d'1 écriture adressant la même adresse                  & non & non \\
261 lecture  suivit d'1 écriture adressant la même ligne de cache           & oui & non \\
271 lecture  suivit d'1 écriture adressant deux lignes de cache différentes & oui & oui \\
281 écriture suivit d'1 lecture  adressant la même adresse                  & non & non \\
291 écriture suivit d'1 lecture  adressant la même ligne de cache           & oui & non \\
301 écriture suivit d'1 lecture  adressant deux lignes de cache différentes & oui & oui \\
31\end{tabular}
32
33La solution actuelle est très restrictive. Ceci est du au fait que quant le cache verrouille une ligne de cache, il ne sait pas si c'est un échec de lecture ou une écriture qui est la cause du verrouillage.
34
35Pour cela, nous modifions l'algorithme en ne proposant pas un bit de verrouillage mais deux bits de verrouillage :
36\begin{description}
37\item[Lock\_by\_read  : ] la ligne de cache à été verrouiller par une lecture. (Un échec de lecture de cette ligne de cache est en cours de traitement).
38\item[Lock\_by\_write : ] la ligne de cache à été verrouiller par une écriture. (Une écriture d'un mot de cette ligne de cache est en cours de traitement).
39\end{description}
40
41En terme d'implémentation, nous avons ajouter un banc de registre RAM\_LOCK contenant ces deux bits de verrouillage. De plus nous avons déplacer le bit de validité contenant dans RAM\_TAG jusque dans ce bloc.% Ce déplacement provoque un petit changement : précédement lors que RAM\_TAG indiqué que l'accès était un succès alors ceci signifie que l'adresse envoyé par le processeur est dans une ligne de cache ET que cette ligne de cache est valide. Maintenant RAM\_TAG ne peut plus vérifier cette deuxième condition.
42
43\subSection{Protocole}
44
45Dans cette section, nous allons voir le protocole de gestion de la consistance mémoire.
46
47\printgraphonly{CACHE_protocole}{.55}
48 
49Lors de l'arrivé d'une requête, la section {\bf SECTION\_DCACHE\_REQ} connait le type et à partir de l'adresse accède au bloc RAM\_TAG pour obtenir le numéro de banc. Avec ce dernier, le cache accède aux blocs RAM\_DATA et RAM\_LOCK.
50\begin{itemize} 
51\item Si l'accès est une écriture, comme le cache est {\it write through}, cet accès va provoquer l'émission d'une requête sur l'interconnect VCI.
52  \begin{itemize} % write
53  \item Si l'écriture fait un succès dans le cache (RAM\_TAG contient l'adresse envoyé par le processeur), alors nous testons s'il n'y a pas une requête (aussi bien de lecture que d'écriture) en cours de traitement et que l'entrée dans le cache est valide.
54    \begin{itemize}  % write hit
55    \item Si c'est le cas, alors nous n'acceptons pas cette requête d'écriture (sinon la requête d'écriture que nous evoyons risque de doubler la requête en cours de traitement).
56    \item Si aucun des bits de verrouillage n'est positionnée à 1, alors l'accès peut avoir lieu. Pour cela, nous indiquons qu'une requête d'écriture à lieu sur cette ligne de cache ({\it lock\_by\_write = 1}), puis nous chargeons les sections {\bf SECTION\_VCI\_REQ} et {\bf SECTION\_VCI\_RSP} d'effectuer la transaction avec la mémoire principale. La réception de la réponse par la section {\bf SECTION\_DCACHE\_RSP} va provoquer la mise à zéro du bit {\it lock\_by\_write}.
57    \end{itemize}
58  \item Si l'écriture fais un échec dans le cache, alors nous choisissons une victime.
59    \begin{itemize} % write miss
60    \item Si la victime n'est pas valide (les deux bits de verrouillage ne sont pas à 0), alors nous n'acceptons pas la requête d'écriture.
61    \item Si la victime est valide, alors nous verrouillons intégralement la ligne. Par intégrale, nous positionnons les bits {\it lock\_by\_write} et {\it lock\_by\_read} à 1. Le verrouillage intégrale empêche toutes lectures ultérieurs. Tous comme un succès d'écriture, la réception de la réponse va provoquer l'invalidation de la ligne de cache. Car comme le cache n'est pas write allocate, la ligne allouée ne sera pas remplit avec des données cohérentes.
62    \end{itemize}
63  \end{itemize}
64\item Si l'accès est une lecture, nous devons tester la présence dans le cache de l'adresse envoyée par le processeur.
65  \begin{itemize} % read
66  \item Si l'adresse est contenu dans le cache, alors nous devons verifier si la ligne est verrouiller ({\it lock\_by\_read} = 1). Nous n'avons pas besoin de tester si la ligne est verrouiller par une écriture. Si c'est le cas et que l'écriture été une réussite, alors la donnée est à jour dans la ligne de cache, sinon le protocole place le bit {\it lock\_by\_read} à 1.
67    \begin{itemize} % read hit
68    \item Si ligne est verrouillée alors la requête n'est pas accepté.
69    \item Si au contraire, la ligne n'est pas verrouillé, alors la requête est accepté : on lit la donnée dans le bloc RAM\_DATA et on place la requête dans la file d'attente QUEUE\_READ\_HIT. Ensuite, la section {\bf SECTION\_DCACHE\_RSP} va s'occuper d'envoyer la réponse au processeur.
70    \end{itemize}
71  \item Si l'accès en lecture fait un échec, le cache doit choisir une victime.
72    \begin{itemize}
73    \item Si la victime n'est pas valide, alors la requête n'est pas acceptée.
74    \item Si la victime est valide, la section {\bf SECTION\_DCACHE\_REQ} peut effectuer une réquête. Pour cela elle inscrit les informations dans le bloc RAM\_INFO tout en verrouillant la ligne ({\it lock\_by\_read = 1}). Ensuite la donnée est écrite dans la file QUEUE\_REQ, ce qui provoque une emission puis une reception par les sections contrôlant l'interface VCI. A reception du paquet de réponse, la section {\bf SECTION\_DCACHE\_RSP} va écrire la ligne dans le cache et déverrouiller la ligne ({\it lock\_by\_read = 0}).
75    \end{itemize}
76  \end{itemize}
77\end{itemize}
78
79\subSection{Structure interne}
80
81Dans cette section, nous allons voir comment sont structuré les ressources internes du cache non bloquant.
82
83Avant de détailler les interfaces de chaque composant, nous pouvons préciser que chaque interfaces suivent le protocole fifo. C'est a dire que pour chaque interface, il y a des blocs ``producteurs'' et des blocs ``consommateurs''. Les producteurs possède une sortie {\bf VAL} (c'est une entrée pour les consommateurs) qui indique si la requête qu'ils émettent est valide. Les consomateurs possède sortie {\bf ACK} (c'est une entrée pour les producteurs) qui indique si le consommateur peut accepter une requête. Il y a un transaction si $VAL and ACK = 1$ à la fin d'un cycle d'horloge.
84L'avantage de ce protocole de la gestion intégré du contôle de flux : si un producteur n'a plus de donnée ou un consomateur ne peux plus accepter de transaction, il suffit de positionner respectivement les signaux {\bf VAL} et {\bf ACK} à 0 pour ne pas autoriser de transaction.
85
86
87Nous allons maintenant détailler les ressources internes du cache non bloquant :
88\begin{itemize}
89\item Trois files d'attentes :
90  \begin{description}
91  \item[QUEUE\_READ\_HIT :] (figure \ref{CACHE_bloc_QUEUE_READ_HIT}) Cette file d'attente s'occupe de transmettre le plus tôt possible les requêtes de lecture ayant fait un HIT.
92    \begin{description}
93    %\item {\it Valid : } Indique si l'entrée correspondante contient une donnée valide
94    \item {\it Index : } Index vers une entrée de RAM\_INFO
95    \end{description}
96    \printgraphonly{CACHE_bloc_QUEUE_READ_HIT}{.8}
97  \item[QUEUE\_REQ :] (figure \ref{CACHE_bloc_QUEUE_REQ}) Cette file est utilisée comme tampon d'écriture et de requête de lecture ayant fait un miss. Elle attende leur envoie à la mémoire.
98    \begin{description}
99    %\item {\it Valid : } Indique si l'entrée correspondante contient une donnée valide
100    \item {\it Index : } Index vers une entrée de RAM\_INFO
101    \end{description}
102    \printgraphonly{CACHE_bloc_QUEUE_REQ}{.8}
103  \item[QUEUE\_RSP :] (figure \ref{CACHE_bloc_QUEUE_RSP}) La file est utilisée comme tampon pour les réponses provenant de la mémoire.
104    \begin{description}
105    %\item {\it Valid :} Indique si l'entrée correspondante contient une donnée valide
106    \item {\it Index :} Index vers une entrée de RAM\_INFO
107    \item {\it Line :} Contient une ligne de cache retournée par l'interface de réponse et devant être écrit dans le bloc RAM\_DATA.
108    \item {\it Error :} Indique si l'accès effectué à générée une erreur ou pas. L'erreur sera interprété par l'exception générique ``Erreur de Bus''.
109    \end{description}
110    \printgraphonly{CACHE_bloc_QUEUE_RSP}{.8}
111  \end{description}
112\item Trois blocs mémoires :
113  \begin{description}
114  \item[RAM\_TAG :] (figure \ref{CACHE_bloc_RAM_TAG}) Contient les informations pouvant identifier les adresses contenus dans cette ligne de cache
115    \begin{description}
116    \item {\it Tag :} Il s'agit de l'étiquette de l'adresse. A partir du numéro de ligne et de l'étiquette, cette RAM peut déterminer si le cache fait un succès ou non.
117    \end{description}
118    \printgraphonly{CACHE_bloc_RAM_TAG}{.8}
119  \item[RAM\_DATA :] (figure \ref{CACHE_bloc_RAM_DATA}) Contient les données de la ligne de cache
120    \begin{description}
121    \item {\it Line :} Contient la ligne de cache proprement dite
122    \end{description}
123    \printgraphonly{CACHE_bloc_RAM_DATA}{.8}
124  \item[RAM\_LOCK :] (figure \ref{CACHE_bloc_RAM_LOCK}) Contient les bits de gestions de dépendances
125    \begin{description}
126    \item {\it Valid :} Indique si la ligne correspondant contient une donnée valide.
127    \item {\it Lock\_by\_read :} Si le bit est positionné, alors il existe une requête de lecture actuellement en cours de traitement par le cache.
128    \item {\it Lock\_by\_write :} Si le bit est positionné, alors il existe une requête d'écriture actuellement en cours de traitement par le cache.
129    \end{description}
130    \printgraphonly{CACHE_bloc_RAM_LOCK}{.8}
131  \item[RAM\_INFO :] (figure \ref{CACHE_bloc_RAM_INFO}) Contient les informations relative au requête pendante. Pour plus de détails voir la section \ref{RAM_INFO}
132    \begin{description}
133    \item {\it Valid :} Indique si l'entrée correspondante contient une donnée valide
134    \item {\it Trdid, Pktid :} Identifiant de la requête. Le trdid indique le numéro de contexte du processeur qui à émit la requête. Alors que le pktid est le numéro de paquet de ce contexte. Le processeur garantie l'unicité du couple {trdid, pktid}.
135    \item {\it Address :} Adresse de la requête. Pour une identification rapide de la ligne concernée.
136    \item {\it Type :} Type de la requête (lecture, écriture, taille de l'accès, ...)
137    \item {\it Uncached :} Indique si la réponse doit modifier le cache. Dans le cadre d'une lecture par exemple.
138    \item {\it Data :} Donnée (en cas d'écriture : DCACHE.REQ\_WDATA, en cas de lecture avec succès : contenu d'un mot de la ligne de cache)
139    \end{description}
140    \printgraphonly{CACHE_bloc_RAM_INFO}{.8}
141  \end{description}
142\item  Quatre automates :
143  \begin{description}
144  \item[FSM\_DCACHE\_REQ :] (figure \ref{CACHE_automate-fsm_dcache_req}) %Cet automate gère la consommation des requêtes provenant du cache et, suivant le type d'accès et la réussite de l'accès, l'écriture dans les QUEUE\_REQ et QUEUE\_READ\_HIT
145    \printgraphonly{CACHE_automate-fsm_dcache_req}{1}
146
147  \item[FSM\_DCACHE\_RSP :] (figure \ref{CACHE_automate-fsm_dcache_rsp}) %L'automate gère la consommation de donnée de la QUEUE\_RSP et s'occupe d'écrire dans le cache les lignes chargées.
148    \printgraphonly{CACHE_automate-fsm_dcache_rsp}{.8}
149  \item[FSM\_VCI\_REQ :] (figure \ref{CACHE_automate-fsm_vci_req}) %L'automate s'occupe de consommer une donnée de QUEUE\_REQ (si la file n'est pas vide) et la lance sur l'interface VCI\_REQ (si l'interface n'est pas occupée).
150    \printgraphonly{CACHE_automate-fsm_vci_req}{.8}
151  \item[FSM\_VCI\_RSP :] (figure \ref{CACHE_automate-fsm_vci_rsp}) %L'automate s'occupe de consommer sur l'interface VCI\_RSP (si l'interface n'est pas occupée) et l'écrit dans  la file QUEUE\_RSP (si la file n'est pas pleine).
152    \printgraphonly{CACHE_automate-fsm_vci_rsp}{.8}
153  \end{description}
154\end{itemize}
155
156\subSection{RAM\_INFO en détail}\label{RAM_INFO}
157Le bloc RAM\_INFO contient les informations relative aux requêtes pendantes. Elle est accéder par trois section du cache différente : {\bf SECTION\_DCACHE\_REQ} afin d'allouer une entrée dans ce bloc et d'écrire les informations concernant la requête, {\bf SECTION\_VCI\_REQ} afin de lire les informations utilies pour créer une requête VCI, et {\bf SECTION\_DCACHE\_RSP} afin de lire les informations permettant de répondre au processeur et d'écrire dans le cache et de désallouer l'entrée de RAM\_INFO.
158
159Le numéro de l'entrée dans lequel est écrit les informations est souvent utilisé. Aussi bien dans les différentes files QUEUE\_REQ, QUEUE\_RSP et QUEUE\_READ\_HIT, que pour indexer un paquet VCI. Ceci permet de ne pas dupliquer les informations inutilement et donc d'avoir des FIFOs contenant peut d'information.
160
161Le numéro de l'entrée sert également comme identifiant de requête lors d'une transaction VCI. Parce que le cycle de vie de cette identifiant garantie son unicité sur le réseau VCI.
162
163Nous pouvons remarquer que le nombre d'entrée dans le bloc RAM\_INFO indique le nombre de requête pouvant être géré simultanément par le cache. Lorsque ce bloc est plein, aucun nouvelle requête ne peut être accepté.
164
165Le nombre d'entrée de cette mémoire est délimité par les tailles des files QUEUE\_REQ et QEUEUE\_READ\_HIT. C'est à dire, la taille de RAM\_INFO doit être comprit entre :\\
166$[ max(\{size\_QUEUE\_REQ\}, \{size\_QUEUE\_READ\_HIT\}) ; \{size\_QUEUE\_REQ\} * \{size\_QUEUE\_READ\_HIT\} ]$
167
168\subSection{Choix de la victime}
169
170Dans cette section nous allons expliquer l'algorithme de selection de la victime et les motiviations de ce choix.
171
172Le chemin entre un processeur et son cache est souvent le chemin critique d'en un processeur. Il passe par la combinatoire qui indique que le processeur demande un accès et fait un aller retour avec l'aquittement du cache de la requête.
173
174Nous avons vut que l'aquittement donner par le cache est dépendante du type et donc du contenu du cache. Suivant le protocole définit dans la figure \ref{CACHE_protocole}, l'aquittement d'une requête dépend de la validité de la victime.
175
176Pour des raisons de rapidité, nous avons décider d'implémenter un algorithme pseudo aléatoire. Par exemple un compteur de ASSOC bits ou un LFSR (Linear Feedback Shift Register) de ASSOC+1 bits (car dans un LFSR, la combinaison 0 n'est pas une combinaison valide).
177
178\subSection{Structure du pipeline}
179
180Dans cette sous section nous allons présenter succintement les étage de pipelines. Suivant le type de la requête, le temps de réponses minimal différe. Pour cela, nous posons N le nombre de cycle aller/retour jusqu'à la mémoire et M le temps nécessaire pour avoir une ligne de cache complète après réception du premier paquet. On considére M et N comme des temps moyens et les files interne comme étant vide.
181\begin{description}
182\item[Read - Hit          : ] 2 cycles.
183\item[Read - Miss         : ] 3 + N + M cycles.
184\item[Write               : ] 4 + N cycles.
185\item[Lock et Prefetch    : ] 2 cycles.
186\item[Invalidate et Flush : ] 2 cycles.
187\end{description}
188
189\printgraphonly{CACHE_pipeline}{.8}
190
Note: See TracBrowser for help on using the repository browser.