



Next: Parallélisme Up: Optimisation de lancer de Previous: Calcul des adresses Contents
Accès mémoire
Dans la partie 5.2, nous avons vu tout l'intérêt d'organiser correctement les accès mémoire. Malheureusement pour notre lancer de rayon, le parcours d'un rayon dans le cube touchant des valeurs d'une manière assez aléatoire il n'est pas possible d'optimiser les accès mémoire.
while (x, y, z) in cube
calculer l'adresse de (x, y, z)
charger valeur à l'adresse // 1
totale = totale + valeur // 2
if totale > max
stop
calculer les prochains (x, y, z)
Chaque étape dépend du résultat de l'étape précédente. La ligne la plus coûteuse est la ligne 1
à cause de l'accès mémoire. La seule ligne qui dépend directement de son résultat est la ligne 2
. Une boucle qui met toutes les autres lignes entre elles peut faire son calcul plus rapidement. Le processeur peut exécuter les autres lignes pendant qu'il attend l'accès mémoire.
calculer l'adresse de (x, y, z)
while (x, y, z) in cube
charger valeur à l'adresse // 1
calculer les prochains (x, y, z)
if totale > max
stop
calculer l'adresse de (x, y, z)
totale = totale + valeur
Cette boucle fait le même calcul mais elle est beaucoup moins coûteuse.
Dans les tests sur nos données, avec toutes les optimisations détaillées ici, on a amélioré la vitesse de l'algorithme de lancer de rayons d'un facteur de l'ordre de 3.
Michael Ash 2005-09-21