



Next: Résultats Up: Les accès mémoire Previous: Les accès mémoire Contents
Ordre de boucles
Dans le cas d'une simulation de fluide ou de beaucoup d'autres algorithmes, on travaille avec des données multidimensionnelles, mais l'organisation des données en mémoire, pour la plupart des ordinateurs, est monodimensionnelle. Pour les données à deux dimensions, par exemple une matrice, les données sont traditionnellement rangées par ligne (on peut parfois trouver une organisation selon les colonnes comme en Fortran par exemple). Avec cet ordre de données, dans une grille de par
,
le nombre de colonnes et
le nombre de lignes, l'indice de la cellule
est alors
. Pour trois dimensions on garde cet ordre pour chaque plan, et les plans sont stockés consécutivement.
L'ordre d'accès mémoire dépend de quelle variable est incrémentée le plus souvent. Pour des données 2D, il y a deux façons pour itérer toutes les données en deux boucles. Si est incrémenté par la boucle à l'extérieur et
est incrémenté par la boucle à l'intérieur,
changera le plus souvent. Les boucles parcouront les cellules
,
,
,
, ...,
,
,
,
, .... Ces cellules correspondent aux adresses
,
,
,
, ...,
,
,
,
, ...(Voir Figure 9). Inverser les boucles et mettre
à l'intérieur touche les adresses
,
,
,
, ...,
,
,
, ..., une séquence qui est beaucoup plus conforme au matériel (Voir Figure 8).
|
|
Pour les données à trois dimensions, on doit faire la même chose. On préfère itérer selon puis
, et finalement selon
.
Alors, il est très important de mettre les boucles dans le bon ordre.
for(x = 0; x < N; x++) {
for(y = 0; y < N; y++) {
for(z = 0; z < N; z++) {
Il faut changer l'ordre pour mettre dans la boucle intérieur :
for(z = 0; z < N; z++) {
for(y = 0; y < N; y++) {
for(x = 0; x < N; x++) {
Cet ordre chargera les données d'une façon linéaire dans la mémoire ce qui optimisera les accès.




Next: Résultats Up: Les accès mémoire Previous: Les accès mémoire Contents Michael Ash 2005-09-21