Archives de catégorie : Cours

Optimiser un code CFD (02)

La figure ci-dessus est très parlante et riche d’informations. Commençons par la partie gauche où sont cités les différents types de mémoire trouvées dans un ordinateur. La flèche ascendante juste à côté attribue les vitesses de traitement des données. On lit par exemple que le CPU est très rapide avec une vitesse de l’ordre de 1 nanoseconde, le cache memory  est à 10 ns, la RAM à 100 ns et le Disque dur à 10 ms.

Ensuite à chaque type de mémoire est affecté une estimation du prix et par conséquent la taille utilisée dans les ordinateurs. Par exemple la cache très cher et par conséquent utilisé en petite quantité. Je vous laisse le soin de lire le reste.

Maintenant, quelques définitions :

Un CPU à 2GHz : théoriquement il peut traiter 2. 10^9 byte par seconde et si on inverse le chiffre on dit qu’il traite un byte en 0.5 nanoseconde.

Si en plus le système est à 64-bit, cela veut dire que le CPU pourra traiter 8 bytes simultanément (1 byte = 8 bit) au lieu de 4 pour le 32-bit.

Coté RAM :

On trouve la SRAM (pour Static Random Access Memory). Elle est très rapide mais aussi très cher. Elle est réservée exclusivement pour le cache Memory. La DRAM (pour Dynamic Random Access Memory) moins rapide mais aussi moins cher. Elle est utilisée pour la RAM. La version SDRAM (pour Synchronous dynamic random access memory) est la plus fréquente. Son taux de transfert vers le L2 cache est de l’ordre de 528 MBps. La DDR SDRAM (pour Double Data Rate Synchronous Dynamic RAM) est encore meilleure que la précédente avec un taux de transfert vers le L2 cache de l’ordre de 1,064 MBps.

Pour terminer cet article, on va passer à la pratique. Dernièrement, dans le cadre d’un projet j’ai équipé ma salle de calcul avec des stations de calcul HP. Certaines sont du type HP Z400 et d’autres du type HP Z600. Par évidence, la Z600 devrait être plus puissante que la Z400. Donc j’ai équipé la première avec 16 Go de RAM et la seconde avec seulement 8 Go de RAM.

Pour compléter un peu les détails techniques disponibles sur la facture, j’ai fait un peu de googling et j’ai récupéré les données suivantes :

HP Z400 HPZ600
ProcesseurIntel® Xeon® à quatre cœurs série 3500, W3565 @ 3.2 GHz

L1 : 256 KB

L2 : 1 MB

L3 : 8 MB

RAM : 8 Go de mémoire DDR3 133 MHz

Technologie Intel® Hyper-Threading

Chipset Intel® X58 Express

ProcesseurIntel® Xeon® à quatre cœurs série 5600, E5620 @ 2.4 GHz

L1 : 256 KB

L2 : 1 MB

L3 : 12 MB

RAM : 16 Go de mémoire DDR3 133 MHz

Technologie Intel® QuickPath

Chipset Intel® 5520

Un peu surpris du fait que l’horloge de la Z600 (2.4 GHz) est plus petite que celle de la Z400 (3.2 GHz). Franchement je m’attendais à l’inverse. Petite compensation le cache du niveau L3 de la Z600 et plus important que celui de la Z400. J’ai aussi cherché au niveau du prix (c’est toujours un indicateur) le CPU de la Z600 est à 613,99 $ alors que celui de la Z400 est à 349,68 $. Sauf si c’est en rapport avec d’autres techniques (après tout, je ne suis qu’un utilisateur et pas vraiment un spécialiste dans la matière) le prix se justifie par la taille du L3.

Ok, tout ça c’est de la théorie, je passe à l’expérimentation. Il se trouve qu’en ce moment je suis en train de refaire les calculs du jet synthétique.  Donc après un calcul stationnaire préliminaire et un autre calcul sur trois périodes du jet, je lance simultanément le calcul sur les deux stations pour une période. J’utilise exactement le même environnement (windows 7 64-bit), le même logiciel de calcul (ANSY CFX) et le même setting (même Definition file et Result file pour l’initialisation). La grille de calcul fait un peu plus que 2. 10^6 elements.

HP Z400 HP Z600
Total wall clock time: 1.068E+05 seconds or:( 1: 5: 39: 55.000)

( Days: Hours: Minutes: Seconds )

Total wall clock time: 1.145E+05 seconds or:( 1: 7: 48: 25.000)

( Days: Hours: Minutes: Seconds )

Surprise: la Z600 consomme un peu plus de 2 heures que la Z400.

Je regrette un peu l’argent déboursé en plus pour la station Z600. Enfin, je suis curieux de voir le test avec d’autres type de calculs et d’autres logiciels. Je vous tiendrais au courant.

à suivre…

 

Optimiser un code CFD (01)

Au cours de cette série d’articles, nous allons essayer de comprendre les dessous de fonctionnement d’un ordinateur afin d’optimiser au mieux la structure d’un code CFD.

Le premier moyen pour stocker des données sur un ordinateur est le disque dur sur lequel on peut sauvegarder mais aussi effacer les données.

Le niveau suivant dans l’architecture des ordinateurs c’est la ‘Random Access Memory’ (RAM). La RAM est une mémoire temporaire volatile qui sert à stocker des données temporairement le temps de les traiter par le processeur.

Le temps de transfert des données pour ces deux moyens de stockage présente une grande différence. Pour les disques durs, il se mesure en millisecondes alors que pour la RAM c’est en nanosecondes. Le processeur lui, est beaucoup plus rapide que ces deux moyens de stockage. Par exemple un processeur à 2GHz a un cycle autour de 0.5 nanosecondes.

Quand le processeur a besoin d’une donnée, il va la chercher en premier dans la RAM ensuite s’il ne trouve pas il va au disque dur. Conclusion évidente, le processeur (qui est beaucoup plus rapide) va perdre du temps à attendre venir l’information. C’est ce qu’on appelle ‘Latency time’.

Figure 1 : Classement hiérarchique de la mémoire dans un calculateur.

Afin de réduire ce problème de ‘Latency time’, les ordinateurs sont dotés d’une mémoire intermédiaire beaucoup plus rapide que la RAM. Cette mémoire placée entre le processeur et la RAM s’appelle le ‘cache memory’. La figure 1 montre la disposition hiérarchique de la mémoire dans un ordinateur.

Time locality : le système mémoire suppose qu’un objet mémoire qui a été utilisé récemment le sera aussi dans un proche futur. De ce fait, il va le stocker dans le ‘cache memory’ en espérant ainsi gagner du temps lors du prochain appel.

Spatial locality : le système mémoire suppose aussi que si un objet mémoire a été utilisé récemment, les autres objets mémoires à côté de lui seront appelés dans un proche futur.

De ce fait, le système de la gestion de la mémoire d’un ordinateur divise l’espace mémoire en petits blocs appelés ‘cache blocks’ ou ‘cache lines’. Les données seront transféré d’une mémoire à une autre par ‘cache line’.

Le ‘cache line’ représente la plus petite unité de mémoire transférée entre la mémoire principale et le cache.

Donc, quand le processeur a besoin d’une donnée il va chercher d’abord dans le ‘cache memory’. Si le ‘Time locality et le Space locality’ ont bien fonctionné, la donnée sera présente dans le cache et le calcul sera beaucoup plus rapide. Cette action sera appelé le ‘cache hit’. Si par-contre la donnée n’est pas présente, cette action sera appelé un ‘cache miss’.

Le ‘cache hit’ nous fait gagner énormément de temps et le calcul sera plus rapide.

Le ‘cache miss’ oblige le processeur à aller chercher l’info dans la RAM.

Un concept théorique stipule que l’ordinateur passe environ 90% du temps de calcul dans 10% du code. C’est une bonne nouvelle, dans la mesure que pour rendre un code plus rapide en exécution il faut repérer ces 10%, les optimiser et s’arranger pour qu’ils soient toujours disponibles dans le cache.

En général, les ordinateurs disposent de deux niveaux de cache suivant leurs proximités du processeur et de leur vitesse (voir Tableau 1 pour un exemple: un peu ancien !).

Tableau 1 : Types de mémoire dans un ordinateur

Pour résumer, un calcul sera d’autant plus rapide qu’il n’y aura pas de ‘cache miss’. Le ‘Cache miss’ ne peut être éliminé complètement que pour les très petits programmes qui peuvent tenir dans le ‘Cache memory’. En CFD cela est impossible. Toutefois, l’optimisation d’un code CFD passe par la réduction des ‘Caches miss’ à leur niveau le plus bas possible.

Pour quelqu’un qui fait de la CFD, la taille et la vitesse du cache et de la RAM sont deux paramètres très important dans le choix d’un ordinateur.

à suivre….