• Aucun résultat trouvé

Optimisations architecturales

7.5 Optimisation de la phase de lancer de pinceaux

7.6.1 Décomposition en étapes

La phase de constitution de réponse impulsionnelle, telle que détaillée dans le chapitre5, est une phase particulièrement calculatoire. Nous en rappelons les étapes principales, pour chaque point de champ :

1. Construction d’une structure accélératrice de typeBVHpour les pinceaux re-couvrant la surface du traducteur.

2. Pour chaque échantillon du traducteur, détermination du pinceau le recou-vrant au moyen d’un parcours de la structure accélératrice.

3. Pour chaque échantillon du traducteur, inversion de l’interpolation de la pro-jection sur la surface du traducteur du point d’arrivée du rayon ultrasonore pour obtenir des coordonnées locales au pinceau recouvrant. Puis, interpo-lation des quantités utiles à la constitution de la réponse impulsionnelle par interpolations.

L’utilisation d’uneBVHen deux dimensions (voir la section5.3.2) pour la déter-mination du pinceau recouvrant un échantillon permet de réduire la complexité de cette recherche, passant d’une complexité linéaire par rapport au nombre total de pinceaux recouvrant la surface du traducteur à une complexité logarithmique.

L’opération d’exploration de la structure accélératrice présente peu de régularité puisqu’il s’agit d’une exploration d’arbre. À chaque niveau de l’arbre, des branche-ments conditionnels sont opérés, limitant les possibilités de vectorisation de cette étape.

Des mécanismes de vectorisation similaires à ceux utilisés dans la bibliothèque

Embree pour l’exploration des structures accélératrices de géométrie pourraient être

utilisés pour améliorer les performances de cette étape. Dans le cadre de nos travaux, nous n’avons pas réalisé cette optimisation en raison d’un gain potentiel faible en comparaison avec le temps de développement requis.

L’opération 3 de calcul des grandeurs de rayons associées à chaque échantillon du découpage du traducteur est quant à elle très régulière. En effet, même si la pre-mière phase de résolution polynomiale pour l’inversion d’interpolation présente des branchements conditionnels,Lambert(2015) a montré (chapitre 5) qu’il est possible d’obtenir des accélérations intéressantes en groupant des descentes de Newton par paquets.

Une fois cette inversion effectuée, les opérations d’interpolation des grandeurs de rayons sont purement calculatoires et ne présentent aucun branchement condition-nel autre que la vérification de la validité de l’inversion d’interpolation. La vectorisa-tion, à ce stade, peut donc apporter une accélération particulièrement intéressante.

7.6.2 Adaptation de l’algorithme

Pour bénéficier de l’accélération liée à l’utilisation d’instructionsSIMD, les don-nées sur lesquelles les opérations de calcul sont exécutées doivent être aligdon-nées et contigües en mémoire. En effet, les jeux d’instructions vectorielles actuels n’incluent pas de chargements de données dispersées arbitrairement en mémoire.

Considérons les étapes à vectoriser de l’algorithme de calcul des échantillons de la surface du traducteur :

1. Inversion de l’interpolation de la projection sur le traducteur de la position finale du rayon.

2. Interpolation des quantités physiques associées au rayon.

Pour la première étape, les données d’entrée sont l’interpolateur de projection du pinceau recouvrant l’échantillon et les coordonnées de l’échantillon sur la surface du traducteur. La structure de données contenant les coordonnées des échantillons du traducteur peut être organisée de sorte que les coordonnées puissent être char-gées directement par paquets. On privilégie dans ce cas le modèle dit de structure of

arrays : plutôt que de stocker les données sous forme d’un tableau de paire de

coor-données, on stocke deux tableaux de coordonnées. La dimension de ces tableaux est un multiple de la largeur des vecteurs utilisés. Ainsi, pour exploiter les instructions

AVX, on alloue des tableaux de dimension 8n avec n un entier.

Pour les interpolateurs de position, puisque l’indice du pinceau recouvrant n’est pas connu à l’avance, on ne peut aligner les données de manière à ce que les coef-ficients des polynômes interpolateurs soient directement chargés. Il nous faut donc allouer un espace mémoire où les coefficients des polynômes sont copiés avant le traitement. Pour chaque interpolateur de degré 3, on alloue 16 tableaux de largeur 8n correspondant à chacun des coefficients du polynôme interpolateur d’Hermite uti-lisé. En pratique, pour l’interpolateur de projection des positions finales des rayons, on alloue deux tableaux de 16 flottants en simple précision.

De la même manière, pour la seconde étape, on rassemble toutes les données d’entrée utilisées pour les calculs d’interpolation dans des tableaux de dimension 8n. Les données intermédiaires (en particulier les coordonnées locales au pinceau) et les données de sortie sont aussi stockées dans des tableaux de dimension 8n. À la fin du traitement, une opération de scatter (ou dispersion) des données est réalisée afin de les stocker dans les structures utilisées dans la suite du calcul.

Enfin, l’ensemble des traitements à vectoriser est regroupé dans une boucle de taille fixée et connue à la compilation, de sorte que le compilateur puisse en générer une version vectorisée.

7.6.3 Vectorisation

Le code que nous cherchons à vectoriser est principalement calculatoire et com-porte peu de branchements conditionnels, ce qui en fait un bon candidat pour les outils de vectorisation automatique. La version 4.0 de la bibliothèque OpenMP per-met de spécifier un certain nombre de règles de vectorisation autour des boucles et des fonctions à vectoriser. Parmi celles-ci, nous appliquons :

Instructions Coût scalaire Coût vectorisé Accélération théorique

SSE2 884 305 ×2.9

SSE3 884 305 ×2.9

AVX 864 145 ×6.0

AVX2 730 140 ×5.2

Table 7.4 – Accélérations théoriques de la vectorisation sur la boucle de calcul des échantillons de coin selon le jeu d’instructions

Instructions Coût scalaire Coût vectorisé Accélération théorique

SSE2 1254 375 ×3.3

SSE3 1254 375 ×3.3

AVX 1209 173 ×7.0

AVX2 1100 169 ×6.5

Table 7.5 – Accélérations théoriques de la vectorisation sur la boucle de calcul des échantillons de centre selon le jeu d’instructions

#pragma omp declare simd, qui permet de spécifier au compilateur que des

versions vectorielles d’une fonction doivent être générées afin de permettre son utilisation dans une boucle vectorisée.

#pragma omp simd, qui, lorsqu’il est placé avant une boucle, indique au com-pilateur qu’il doit tenter de la vectoriser.

#pragma omp simd aligned <DONNÉES>:<TAILLE>dont l’objectif est d’indi-quer que des données sont fournies alignées en mémoire sur un nombre spé-cifié de bits et que, par conséquent, les instructions de chargement aligné peuvent être directement utilisées, permettant de gagner en performances sur certaines architectures.

Après compilation, nous obtenons du compilateur un rapport de vectorisation donnant une prévision d’accélération basée sur les vitesses d’exécution des instruc-tions SIMDen comparaison avec leurs équivalents séquentiels et la largeur des pa-quets. Les boucles de calcul des échantillons de coin et de centre des sous-pinceaux sont séparées puisque des grandeurs différentes sont calculées dans les deux cas.

Les tables7.4et7.5résume les prévisions d’accélération obtenues sur les deux fonctions de calcul d’échantillons selon les jeux d’instructions choisis.

On constate de bonnes accélérations théoriques, particulièrement sur le calcul des échantillons de centre. En effet, pour ces échantillons, le nombre de grandeurs interpolées est plus important que pour un échantillon de coin. Ainsi, la proportion de temps de calcul effectif en rapport au temps total (calcul et lectures/écritures) est supérieure, ce qui explique les accélérations supérieures.

La différence de coût scalaire entre AVX etAVX2 s’explique par l’apparition en

AVX2des instructionsFMAqui regroupent une multiplication et une addition en une instruction unique. Puisque les codes d’interpolation font apparaître de nombreuses opérations de multiplications suivies d’additions, un gain d’environ 10% sur les ver-sions scalaires est observable.