Turing : caches et mémoire

Informations générales

Les noeuds de calcul Blue Gene/Q ont chacun 16 coeurs. Ces 16 coeurs se partagent l'accès à une mémoire de 16 Gio. 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/Q.

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/Q, 2 différents niveaux existent. Le premier niveau est le plus petit mais aussi le plus rapide. Le second niveau est de taille plus importante mais est plus lent et sert de dernier niveau avant d'aller vers la mémoire centrale. Entre ces deux niveaux de cache, il y a 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.

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

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

Cache Taille Politique de remplacement Associativité
L1 16 kio-D + 16 ko-I Pseudo Least Recently Used 8-way set-associative, lignes de 64 octets
L1P prefetch 32 x 128 octets Depth stealing et Round-Robin Fully associative, lignes de 128 octets
L2 16 x 2 Mio Least Recently Used 16-way set-associative, lignes de 128 octets
DRAM 16 Gio - Lignes de 128 octets

Cache L1

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

  • 16 kio-D + 16 kio-I par coeur
  • 8-way set-associative, lignes de 64 octets
  • Remplacement par Pseudo Least Recently Used
  • 1 bus (data) dans chaque sens entre L1 et coeur de 32 octets
  • 1 bus (data) vers L1P de 32 octets (store) et 1 bus depuis L1P de 16 octets (load)
  • Protection ECC contre les erreurs de parité

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

  • Latence : 6 cycles (pour les entiers)
  • Débit depuis et vers coeur : 32 octets/cycle à 1,6 GHz (48,8 Gio/s)
  • Débit depuis L1P (lecture) : 16 octets/cycle à 1,6 GHz (24,4 Gio/s)
  • Débit vers L1P (écriture) : 32 octets/cycle à 1,6 GHz (48,8 Gio/s)

L1P (unité de prefetching)

Les caractéristiques principales du L1P (unité de prefetching) sont :

  • 32 x 128 octets par cœur
  • Fully associative, lignes de 128 octets
  • Remplacement par depth stealing et round robin
  • 1 bus (data) depuis L1 de 32 octets (store) et 1 bus vers L1 de 16 octets (load)
  • 1 bus vers switch L1P/L2 de 12 octets et 1 bus depuis switch de 32 octets
  • Maximum 16 flux en prefetching (séquentiels avec stride max de 128 octets)
  • List prefetching (possibilité d'enregistrer un pattern d'accès mémoire à rejouer, nécessité d'adapter le code)
  • Protection ECC contre les erreurs de parité

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

  • Latence : 24 cycles entre L1 et L1P
  • Débit vers L1 (load) : 16 octets/cycle à 1,6 GHz(24,4 Gio/s)
  • Débit depuis L1 (store) : 32 octets/cycle à 1,6 GHz (48,8 Gio/s)
  • Débit depuis L2 (load) : 32 octets/cycle à 800 MHz par cœurc (24,4 Gio/s)
  • Débit vers L2 (store) : 12 octets/cycle à 800 MHz par cœur (9,2 Gio/s)

Cache L2

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

  • 16 x 2 Mio par nœud de calcul
  • 16-way set-associative, 1024 sets par bloc de 2 Mio, lignes de 128 octets
  • Remplacement par Least Recently Used
  • Write-back
  • Unité de prefetching intégrée (pilotée par le L1P)
  • 16 bus (1 par bloc de 2 Mio) vers switch L1P/L2 de 32 octets et 16 bus depuis switch de 12 octets (800 MHz)
  • 2 bus vers DRAM de 16 octets (1 en load et 1 en store) (1,333 GHz)
  • Protection contre les erreurs : ECC

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

  • Latence : 82 cycles
  • Débit vers L1P (load) : 32 octets/cycle à 800 MHz par cœur (24,4 Gio/s) (max 16 x 24,4 = 390,6 Gio/s)
  • Débit depuis L1P (store) : 12 octets/cycle à 800 MHz par cœur (9,2 Gio/s) (max 16 x 9,2 = 146,5 Gio/s)
  • Débit depuis et vers DRAM : 2 x 16 octets/cycle à 1,333 GHz (40,7 Gio/s)

Mémoire centrale DRAM

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

  • 16 Gio par nœud de calcul
  • 2 bancs mémoire DDR-3 de 8 Gio
  • 2 bus vers L2 de 16 octets (1 en load et 1 en store) (à 1,333 GHz)
  • Protections contre les erreurs : ECC et Chipkill

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

  • Latence : 350 cycles
  • Débit depuis et vers L2 : 2 x 16 octets/cycle (40,7 Gio/s)

Débit mesuré

La figure suivante présente le débit mesuré sur un nœud complet avec un programme de type DAXPY (y=a*x+y sur des flottants double précision). On y voit très bien la transition lorsque l'on sort des caches L1 et L2. On y voit également que le débit est meilleur lorsque l'unité vectorielle QPX est utilisée et que l'on surcharge chaque cœur avec 2 threads.

daxpy