La DDR4 pour le chipset X99

Comme tous les standards de mémoire précédents, la DDR4 est destinée à poursuivre l'augmentation des débits sans devoir augmenter la vitesse à laquelle les cellules mémoires fonctionnent.


Illustration de Synopsys.

A la fin des années 90, celles-ci tournaient à une fréquence de 66 à 150 MHz pour la SDR-SDRAM. Cette fréquence a progressé quelque peu lors du passage à la mémoire DDR dont les cellules évoluaient entre 100 et 300 MHz, mais il n'y a plus eu d'évolution avec les mémoires DDR2 et DDR3. Quant à la DDR4, elle se contente de 166 à 200 MHz pour les variantes standardisées par le JEDEC. Pour améliorer les performances malgré cette non évolution au niveau des cellules en elles-mêmes, des mécanismes de plus en plus complexes ont dû être mis en place. Mais pourquoi l'industrie ne peut-elle pas pousser simplement la fréquence de fonctionnement interne ?

Difficile d'augmenter la fréquence des cellules

Nous pourrions résumer la grande problématique de la DRAM à travers cette image : essayer de contrôler le niveau de remplissage de milliards de passoires réparties sur un vaste terrain, ce n'est pas simple à exécuter rapidement et à faible coût. C'est pourtant à peu de choses près ce qui se passe avec les milliards de cellules des puces mémoires et c'est en grande partie ce qui explique le mur rencontré en terme de fréquence des cellules.
Rappelons brièvement comment fonctionne la DRAM : une cellule est capable de retenir un bit à l'aide d'un transistor et d'un condensateur. Ce dernier représente la zone de stockage et physiquement il peut ressembler à un réservoir ou à un puits qui emmagasine une charge électrique. Le transistor est la porte d'accès à ce stockage.


En microélectronique, tout ce qui est bien isolé est difficile d'accès alors que tout ce qui est mal isolé peut-être accédé très rapidement, sans devoir exercer de force importante qui userait le composant. Contrairement à la Flash, ces paramètres sont très importants pour la DRAM dont la zone de stockage se trouve donc être mal isolée. Elle peut être vue comme une passoire qui se vide progressivement. La durée de vie de ce stockage est ainsi très faible (64ms max jusqu'à 85 °C, 32ms max au-delà, selon les normes actuelles), c'est pour cela qu'un rafraîchissement régulier est nécessaire (lecture puis réécriture).

Pour lire une cellule mémoire, il n'est malheureusement pas possible de simplement vérifier si le condensateur est vide (0) ou rempli (1). C'est un petit peu plus complexe que cela. Un niveau intermédiaire de charge doit être maintenu sur son canal d'accès (bit line), c'est le préchargement. Une fois que le transistor lié au condensateur est ouvert, s'il est vide, une partie de la charge du canal d'accès va s'y déverser. S'il est plein, c'est lui qui va se déverser sur le canal d'accès, un petit peu comme différents niveaux d'eau s'égalisent. Pour retrouver la donnée stockée, un amplificateur va déterminer si le niveau de charge du canal d'accès a légèrement augmenté ou légèrement baissé. En d'autres termes il ne s'agit pas de différencier facilement un 0 et un 1 mais plutôt d'arriver à distinguer un 0.45 d'un 0.55. Une différence qui est progressivement moins marquée au fur et à mesure qu'on s'éloigne du dernier rafraîchissement.
la fréquence est les timings délimitent le temps attribué aux amplificateurs pour faire la différence avec certitude entre ces niveaux très faibles. Par ailleurs, ces niveaux ont besoin d'un petit peu de temps pour se stabiliser sans quoi la différence serait encore moins marquée. Cela participe à limiter la capacité des cellules à monter en fréquence.
Un autre point concerne la taille des blocs de données, appelés banques. Plusieurs banques sont exploitées dans chaque puce mémoire de manière à faciliter le pipelining, soit la possibilité par exemple de précharger une banque pendant qu'une lecture se fait dans une autre banque de manière à ne pas perdre de temps. Plus les banques sont grosses et plus il faut de temps au signal pour s'y répandre, ce qui limite aussi la fréquence. Pour réduire ce problème, les banques de mémoire DRAM sont organisées en un maillage de sous-blocs de cellules. Une complexité de l'organisation nécessaire pour faire face à l'augmentation constante de la densité, soit de la quantité de données par banque. Augmenter le nombre de niveaux de sous-blocs pourrait permettre de faciliter la montée fréquence mais au prix d'une latence en hausse et de coûts de fabrication qui exploseraient.
Le coût de fabrication est critique pour les puces dédiées la mémoire centrale qui sont depuis longtemps devenues des produits sans valeur ajoutée, des matières premières dont la caractéristique principale est la densité. Il n'est pas envisageable pour l'industrie d'augmenter les coûts simplement pour monter quelque peu en fréquence.
Avec des objectifs différents en termes de coûts, de densité et de latence, les puces GDDR peuvent d'ailleurs monter plus haut en fréquence, jusqu'à 650 MHz. Les fabricants de barrettes mémoires peuvent également sélectionner les meilleures puces pour proposer des produits plus avancés qui montent un petit peu plus haut en performances, par exemple avec des cellules qui sont poussées jusqu'à 300 MHz au lieu de 200 MHz.

La solution jusqu'ici : le prefetch

Pour poursuivre l'augmentation du débit des mémoires, il a donc fallu trouver d'autres solutions que la fréquence de leurs cellules. L'une d'elle peut être d'élargir le bus mémoire, cela est fait depuis quelques temps à travers les contrôleurs multi-canaux mais il y a des limites à cette approche coûteuse, qui par ailleurs ne participe pas à réduire la latence.

Une autre solution est d'augmenter la fréquence du bus mémoire en mettant en place des mécanismes plus complexes pour l'alimenter. C'est le cas du prefetching. Son principe est simple, il suffit de lire un nombre plus élevé de cellules mémoires en parallèle, de placer le tout dans un petit buffer qui déversera ces données en série mais à très haute vitesse sur le bus mémoire. Avec la mémoire DDR le prefetching a été introduit à 2, il est passé à 4 avec la DDR2 et à 8 avec la DDR3. De quoi profiter du mode de transmission DDR, et doubler à deux reprises la vitesse du bus.

L'évolution logique aurait donc été pour la DDR4 de passer le prefetching à 16 pour doubler à nouveau la fréquence du bus par rapport à la fréquence des cellules, mais cela aurait eu différents désavantages.
Chaque banque mémoire simple est à la base subdivisée en petits blocs de cellules. Avec prefetching nX, chaque banque mémoire devient subdivisée en X tableaux de petits blocs de cellules mémoire. Une complexité qui augmente les coûts et la consommation avec une multiplication des voies de communication.
Par ailleurs, le prefetching augmente la plus petite quantité de données qui peut être lue, ce qui finit par réduire l'efficacité des accès mémoire. Sur un canal 64-bit classique, un prefetching de 8 signifie que les accès se font au minimum par 64 octets. Cela s'accorde assez bien aux caches des CPU et c'est déjà une valeur relativement élevée. Aller au-delà n'aurait pas été une très bonne idée.

La nouvelle solution : le bank grouping

Avec la GDDR5 et avec la DDR4 qui a suivi, le Jedec a fait le choix d'une nouvelle approche dénommée bank grouping. Elle consiste à séparer les banques mémoire en plusieurs groupes, deux pour les puces de type x16 (bus de communication de 16-bit) et 4 pour les puces de type x8/x4 rencontrées sur la plupart des modules DIMM.

Chaque groupe de banques se comporte indépendamment des autres et un second niveau de petits buffers qui alimentent le bus mémoire est mis en place. Avec plus de données à sa disposition, il est capable de supporter un bus mémoire à plus haute fréquence. Il n'est cependant pas question de doubler voire de quadrupler la vitesse du bus mémoire dans tous les cas grâce à 2 ou 4 groupes de banques mémoire travaillant en parallèle. Le bus mémoire ne monte pas aussi haut en fréquence si facilement.
Pour profiter du bank grouping, le contrôleur mémoire qui a déjà de très nombreux paramètres à gérer doit en plus faire en sorte d'alterner les accès entre différents groupes de banques. Ce n'est pas toujours possible. Les différents groupes de banques mémoires peuvent ainsi pour la plupart des niveaux de spécifications (à l'exception de la DDR4-3200) fournir plus de données que nécessaire pour alimenter le bus. De quoi permettre dans la plupart des cas de s'approcher d'un niveau d'efficacité élevé et de réduire les dégâts quand les accès mémoires ne sont pas optimaux.
Par exemple, en DDR4-2400 tel que spécifié par le Jedec, les cellules mémoire tournent à 200 MHz, ce qui indique qu'il faut à leur niveau qu'elles fournissent 12 données en parallèle au total pour alimenter le bus mémoire qui tourne, lui, à 1200 MHz en DDR. Deux groupes de banques, avec prefetch de 8 chacun, permettent de débiter jusqu'à 16 données ce qui est plus que suffisant pour alimenter le bus.
Mais si le contrôleur mémoire n'a pas bien organisé ses accès et qu'ils se font successivement dans le même groupe de banques, le bus ne sera pas alimenté correctement et la bande passante mémoire sera directement impactée. Tout cela est régi par 2 timings relativement peu connus : tCCD et tCCD_L.
Petite réflexion : pourquoi ne pas avoir multiplié autant que possible les groupes de banques pour réduire l'occurrence d'accès successifs dans un même groupe ? Nous en revenons ici au coût trop élevé que cela pourrait engendrer notamment au niveau des voies de communication. Cela augmenterait également la consommation, chaque activation de banque étant très gourmande (une restriction empêcher d'ailleurs la mémoire d'activer plus de 4 banques dans un intervalle trop court). Opter pour 2 au 4 groupes de banques, suivant le nombre de bits de communication des puces mémoire, est un compromis qui a été fait entre performances, coûts et consommation.

tCCD et tCCD_L

Ces timings représentent le délai entre deux lectures ou écritures successives. tCCD (également appelé tCCD_S) concerne les accès entre deux groupes de banques différents et tCCD_L à l'intérieur d'un même groupe.
tCCD est en principe fixé à 4 cycles pour toutes les mémoire DDR4, ce qui correspond à ce qui est nécessaire pour alimenter le bus mémoire à pleine vitesse, ni plus (il y aurait engorgement), ni moins (la bande passante serait limitée). Certains fabricants de cartes-mères peuvent cependant être tentés de tricher à ce niveau pour faciliter l'overclocking de la mémoire, en impactant directement la bande passante mémoire exploitable. De la DDR4-3000 avec un tCCD de 6 cycles affiche une bande passante exploitable identique à celle d'une éventuelle DDR4-2000, ce qui n'a aucun sens pour l'utilisateur.

De son côté, tCCD_L augmente par contre avec le niveau de spécification de la DDR4. De 4 pour la DDR4-1333 il monte jusqu'à 8 pour la DDR4-3200. Ce paramètre définit la fréquence des cellules par rapport à la fréquence du bus mémoire. Plus il est élevé plus l'impact d'une mauvaise répartition des accès mémoire sera élevé. Bien que peu mis en avant par les fabricants de mémoire, il s'agit d'un timing crucial pour la DDR4.
Le paramètre tCCD_L est défini dans le SPD des modules mémoire mais pas dans les profils XMP qui exploitent des fréquences plus élevées. Ces profils ne peuvent donc pas jouer sur ce point pour monter en fréquence, ce qui d'un côté n'est pas plus mal sur le plan des performances. Le bios des cartes-mères peut cependant décider de pousser ces valeurs à la hausse, sans forcément l'indiquer à l'utilisateur.
En guise d'exemple, la DDR4-3000 de G.Skill que nous avons testée repose sur un SPD qui suit les spécifications Jedec de type DDR4-2133, soit avec un tCCD_L de 6 cycles. Alors que le Jedec définit un tCCD_L de 7 cycles pour la DDR4-2666 et de 8 cycles pour la DDR4-3200, il reste de 6 cycles via les profils XMP 2666 et 3000 de ce kit, ce qui pousse la fréquence des cellules mémoires à 222 et 266 MHz au lieu de +/- 190 et 187 MHz.
Autant pour les performances (surtout en pratique quand il est plus difficile pour le contrôleur d'optimiser l'organisation des accès) que pour les capacités d'overclocking, il y a encore peu de recul sur l'impact de tCCD_L, valeur qui est modifiable dans certains bios. Globalement, nous pouvons cependant raisonnablement supposer qu'augmenter tCCD_L facilitera la montée en fréquence du bus alors que réduire tCDD_L facilitera la réduction de certains autres timings.