Babel : caches et mémoire

Informations générales

Les noeuds de calcul Blue Gene/P ont chacun 4 coeurs. Ces 4 coeurs se partagent l'accès à une mémoire de 2 Go. Pour masquer les latences, càd les temps d'accès à cette dernière, plusieurs niveaux de cache sont intégrés sur les puces Blue Gene/P.

Une mémoire cache est une mémoire située entre un coeur et la mémoire centrale afin de masquer les latences. Ces mémoires intermédiaires se trouvent beaucoup plus près des coeurs et ont des temps d'accès réduits. Malheureusement, elles sont beaucoup plus chères et sont donc de taille assez limitée. Sur la Blue Gene/P, 3 différents niveaux existent. Le premier niveau est le plus petit mais aussi le plus rapide. Le deuxième niveau est en réalité une unité de prefetching dont le rôle est d'essayer de charger de manière spéculative des données avant même qu'elles soient demandées par l'application. Le troisième niveau de taille plus importante mais plus lent sert de dernier niveau avant d'aller vers la mémoire centrale.

Vous trouverez plus de détails sur les principes de fonctionnement des caches sur la page concernant l'optimisation séquentielle sur Babel et également sur Wikipedia.

Les caractéristiques principales des caches et de la mémoire sur Babel sont données dans le tableau suivant :

Cache Taille Politique de remplacement Associativité
L1 32 ko-D + 32 ko-I Round-Robin 64-way set-associative, 16 ensembles (sets), lignes de 32 octets
L2 2 x 15 x 128 octets Round-Robin Fully associative, lignes de 128 octets
L3 2 x 4 Mo Least Recently Used 8-way set-associative, lignes de 128 octets
DRAM 2 Go - Lignes de 128 octets

Cache L1

Les caractéristiques principales du cache de niveau L1 sont :

  • 32 ko-D + 32 ko-I par coeur
  • 64-way set-associative, 16 sets, lignes de 32 octets
  • Remplacement par Round-Robin
  • Write-through
  • 2 bus (data) vers L2 de 128 bits (1 en load et 1 en store)
  • max 3 requêtes de load à la fois
  • Protection contre les erreurs de parité

Ses performances sont détaillées ci-après :

  • Latence : 3 cycles pour les entiers, 4 pour les flottants
  • Débit depuis et vers coeur : 8 octets/cycle (6,3 Go/s)
  • Débit depuis L2 (lecture) : 4,6 octets/cycle (3,6 Go/s)
  • Débit vers L2 (écriture) : 5,6 octets/cycle (4,4 Go/s)

Cache L2

Les caractéristiques principales du cache de niveau L2 sont :

  • 2 x 15 x 128 octets par coeur
  • Fully associative, lignes de 128 octets
  • Remplacement par Round-Robin
  • 2 bus (data) vers L1 de 128 bits (1 en load et 1 en store)
  • 2 bus vers switch L3 de 256 bits (1 en load et 1 en store) (425 MHz)
  • jusqu'à 7 flux en prefetching (séquentiels avec stride max de 128 octets)
  • Protection contre les erreurs de parité

Ses performances sont détaillées ci-après :

  • Latence : 11 cycles pour les entiers, 12 pour les flottants
  • Débit vers L1 (lecture) : 4,6 octets/cycle (3,6 Go/s)
  • Débit depuis L1 (écriture) : 5,6 octets/cycle (4,4 Go/s)
  • Débit depuis et vers L3 : 2 x 16 octets/cycle (2 x 6,3 Go/s)

Cache L3

Les caractéristiques principales du cache de niveau L3 sont :

  • 2 x 4 Mo par noeud de calcul
  • 8-way set-associative, lignes de 128 octets
  • Remplacement par Least Recently Used
  • Write-through
  • 2 x 2 bus vers L2 de 256 bits (1 en load et 1 en store) (425 MHz)
  • 2 bus vers DRAM de 128 bits (1 en load et 1 en store) (425 MHz)
  • Protection contre les erreurs : ECC

Ses performances sont détaillées ci-après :

  • Latence : 50 cycles
  • Débit depuis et vers L2 : 2 x 2 x 16 octets/cycle (25,3 Go/s)
  • Débit depuis et vers DRAM : 2 x 16 octets/cycle (12,7 Go/s)

Mémoire centrale DRAM

Les caractéristiques principales de la mémoire centrale sont :

  • 2 Go par noeud de calcul
  • 4 bancs mémoire DDR-2 de 512 Mo (en blocs de 128 octets par banc)
  • 2 bus vers L3 de 128 bits (1 en load et 1 en store) (425 MHz)
  • Protections contre les erreurs : ECC et Chipkill

Ses performances sont détaillées ci-après :

  • Latence : 104 cycles
  • Débit depuis et vers L3 : 32 octets/cycle (12,7 Go/s)
  • Performances max si rotation entre les 4 bancs

Débit mesuré

La figure suivante présente le débit mesuré avec l'outil CacheBench dans le cas du test de lecture/modification/écriture de nombres flottants en double précision. On y voit très bien la transition lorsque l'on sort du cache L1. Les autres niveaux n'apparaissent pas dans ce test car l'unité de prefetching du cache de niveau 2 arrive à les masquer. On y voit également que le débit est meilleur lorsque l'unité double de calcul en virgule flottante (double FPU) est utilisée.

rmw_simple