Gestion du cache CPU

### Généralités sur le cache CPU

Afin d'améliorer la vitesse d'exécution des programmes, certains CPUs de la famille des 68000 sont capable de "cacher" les accès mémoire.
Les caches sont toujours appelés à l'aide d'adresses logiques, incluant le code fonctionnel de l'accès. Cela signifie que des accès en mode utilisateur ou superviseur crééent des entrées différentes dans le cache (consultez les documentations Motorola pour plus d'informations).

Voici un bref aperçu sur les CPUs de la famille des 68000:

- 68000 pas de cache
- 68010
  - Prefetch d'instructions
    Prefetch de 2 mots, registre de décodage à un mot
  - Mode boucle
    activé quand une instruction de taille un mot est suivie d'un DBcc. Le processeur ne va pas rechercher plus d'instructions jusqu'à la fin de la boucle.
- 68020
  - Prefetch d'instructions
    un mot long
  - Cache d'instructions
    16 lignes * 16 octets = 256 octets
    peut être activé/désactivé par l'intermédiaire du CACR
- 68030
  - Prefetch d'instructions
    un mot long
  - Cache d'instructions
    16 lignes * 16 octets = 256 octets
    peut être activé/désactivé par l'intermédiaire du CACR
  - Cache de données
    16 lignes * 16 octets = 256 octets
    peut être activé/désactivé par l'intermédiaire du CACR
    Toujours "writethrough" (les octets écrits sont placés dans le cache pour relecture ultérieure)
    mode allocation écriture sélectionnable.
- 68040
  - Prefetch d'instructions
    un mot long
  - Cache d'instructions
    16 lignes * 16 octets = 256 octets
    peut être activé/désactivé par l'intermédiaire du CACR
  - Cache de données
    16 lignes * 16 octets = 256 octets
    peut être activé/désactivé par l'intermédiaire du CACR
    modes copyback ou writethrough (contrôlé par le MMU)
- 68060
  - Prefetch d'instructions
    un mot long
  - Cache d'instructions
    512 lignes * 16 octets = 8192 octets
    peut être activé/désactivé et réduit à la moitié par l'intermédiaire du CACR
  - Cache de branchement
    peut être activé/désactivé par le CACR
    pas affecté par les réglages MMU!
  - Diffusion Superscalaire
    peut être activée/désactivée par le CACR
  - Cache de données
    512 lignes * 16 octets = 256 octets
    peut être activé/désactivé et réduit à la moitié par l'intermédiaire du CACR
    modes copyback ou writethrough (contrôlé par le MMU)
  - Push Buffer
    peut être désactivé par l'intermédiaire du PCR
  - Store Buffer
    peut être désactivé par l'intermédiaire du CACR
    Les pages ne doivent pas être non cachées sérialisées (précis)

#### Gestion du cache dans WHDLoad

La première chose importante est de comprendre que les caches sur 68030..68060 sont controlés par le registre de contrôle de cache (CACR) et le MMU (quand WHDLoad utilise et contrôle le MMU)!
Dans le CACR les caches sont activés ou désactivés globalement. Les pages simples MMU (4 kilo-octets avec WHDLoad) possèdent un état décrivant comment elles sont cachées.
Sur le 68030 une page mémoire peut être cachable ou non cachable. Sur un 68040/68060 elle peut être cachable "writethrough", cachable "copyback" (pas d'écriture mémoire immédiate), non cachable (imprécis) ou non cachable sérialisé (précis).

Si le MMU n'est pas utilisé par WHDLoad, seulement le registre CACR sera modifié.

#### Réglages de cache par défaut

Par défaut, les zones utilisées par WHDLoad, le slave et l'extension mémoire, sont marquées en tant que cachable, copyback. La mémoire de base (chip) est marquée comme non cachable, et les caches donnée et instruction sont activés dans le CACR. Ainsi, le programme situé dans la zone de mémoire de base fonctionne sans caches mais WHDLoad et le slave utilisent les caches pour une performance optimale.

#### Contrôle du cache par programme

Il existe deux fonctions resload pour contrôler les caches: resload_SetCACR et resload_SetCPU. resload_SetCACR est la vieille routine, et peut être complètement remplacée par resload_SetCPU (WHDLoad retravaille les arguments passés à resload_SetCACR de façon interne et appelle resload_SetCPU). Cependant, l'utilisation de resload_SetCACR est recommandée pour tous les progammeurs qui ne connaissent pas tout sur les caches et leur comportement dans le système Amiga. En utilisant resload_SetCACR, le cache instruction et donnée peuvent être activés ou désactivés séparément. resload_SetCACR affecte uniquement la cachabilité de la mémoire de base.

#### Contrôle du cache par l'utilisateur

Si le programmeur a bien travaillé, alors l'utilisateur n'a rien à faire à propos des caches parce que les réglages sont déjà effectués dans le slave.
Néanmoins, il peut y avoir deux raisons pour justifier un changement manuel des réglages du cache. D'abord pour faire fonctionner un install qui ne fonctionne pas bien parce qu'il tourne trop vite (ex: erreurs graphiques) et ensuite pour faire tourner plus vite un programme installé.

Pour faire fonctionner un programme qui plante, l'option NoCache peut être utilisée. Cette option désactive tous les caches et marque toute la mémoire comme non cachable sérialisée (precis). Si la machine possède de la mémoire chip 32 bits, cela restera plus rapide que sur un A500 de base.

Pour améliorer la vitesse d'un programme installé, certaines options peuvent être positionnées pour activer les caches. Ces options sont prioritaires par rapport aux réglages du slave. Sur un 68020, l'option Cache peut être positionnée. Sur un 68030, l'option DCache peut être également utilisée, et elle inclut l'option Cache. Sur un 68060 il y a des options supplémentaires: BranchCache, StoreBuffer et SuperScalar. L'option ChipNoCache/S permet d'améliorer les performances sur68040 et 68060, voir ci-dessous.

#### Cachabilité de la mémoire chip

La cachabilité peut être réglée non seulement par le processeur lui-même (CACR) et les réglages MMU, mais également par du matériel externe. Le processeur signale sur le bus quand il tente de cacher un accès. De même, un périphérique externe peut envoyer un signal au processeur (après qu'une adresse ait été placée sur le bus d'adresse pendant un accès mémoire) lui demandant à ce qu'un accès ne soit pas caché.
Le mécanisme qui signale au processeur que la mémoire est cachable ou non est (d'après ce que je sais) utilisé sur tous les Amigas et cartes CPU qui contiennent un CPU 68030 ou supérieur (parce qu'ils possèdent un cache de données). Les zones affectées sont la totalité de la mémoire chip et l'espace mémoire des entrées-sorties (Cia/Custom/Horloge temps réel) qui ne doivent pas être cachés par le cache de données. Cela est nécessaire afin d'éviter les incohérences, par exemple à cause des mécanismes DMA.
La réaction du processeur sur un rejet de cachabilité pour une adresse dépend des types de processeurs. Sur le 68030 il n'y a pas d'impact sur la vitesse d'accès, les données ne sont pas cachées, c'est tout. Sur le 68040, les accès en lecture sont effectuées sans perte de vitesse mais les accès en écriture (copyback) sont annulés et redémarrés sans cachabilité, ce qui donne des accés 5 fois plus lents par rapport à des adresses non cachables. Sur le 68060, les accès en lecture et écriture sont annulés et redémarrés. Les accès lecture seront 3 fois plus lents, et les accès écriture seront 5 fois plus lents.
Les problèmes cités ci-dessus sont liés aux accès donnée. Les accès instruction ne sont pas affectés et sont aussi cachables dans la mémoire chip. Il existe des matériels (buggés) qui ne tolèrent pas que les instructions soient cachés dans la mémoire chip. Sur de tels matériels, l'option ChipNoCache/S doit être utilisée pour éviter un gros ralentissement de l'exécution (les accès instruction seront 2 fois plus lents).

Vous pouvez tester ce comportement sur votre machine en exécutant Speed.Slave contenu dans le répertoire `src/memory-speed` de l'archive de développement.

#### Allocation écriture

L'allocation écriture contrôle la gestion du cache sur 68030 quand un défaut de cache se produit sur une opération d'écriture. L'allocation écriture doit être activée quand des parties du programme fonctionnent en mode utilisateur. Si le programme installé fonctionne uniquement en mode superviseur alors l'allocation écriture peut être désactivée, ce qui donne un léger avantage en termes de performances.

#### Cache de branchement

Le cache de branchement est disponible uniquement sur le 68060. C'est une sorte de cache instructions pour les instructions de branchement. Mais la différence avec le cache d'instructions c'est qu'il n'est pas affecté par les réglages MMU! Cela signifie que même si la page souhaitée est marquée comme non cachable, les instructions de branchement seront cachées si le cache de branchement est activé.

Lisez le Manuel Utilisateur des Microprocesseurs Motorola pour des informations supplémentaires. Si vous avez des corrections ou des ajouts à faire sur cette page, contactez moi SVP.