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….

 

Ce contenu a été publié dans Cours. Vous pouvez le mettre en favoris avec ce permalien.