• Aucun résultat trouvé

Master Informatique - 1` ere ann´ ee Ann´ ee 2021-2022

N/A
N/A
Protected

Academic year: 2022

Partager "Master Informatique - 1` ere ann´ ee Ann´ ee 2021-2022"

Copied!
2
0
0

Texte intégral

(1)

TP HPC 1

Master Informatique - 1` ere ann´ ee Ann´ ee 2021-2022

L’objectif de ce TP est de tester l’int´erˆet des routines AVX sur le cas simple du calcul d’un produit scalaire. On rappelle que le produit scalaire de deux vecteurs u et v de dimension n se calcule de la mani`ere suivante :

s=

n

X

i=1

ui×vi

Exercice 1

R´ecup´erez la version initiale du fichier source (ps.cpp) joint `a cet ´enonc´e. Vous aurez `a le compl´eter progressivement au cours de ce TP.

Ce fichier contient une fonction nomm´ee ps float(int size) qui, `a ce stade, effectue le produit scalaire s´equentiel entre deux vecteurs r´eels de taillesize. Ces vecteurs sont cr´e´es et initialis´es dans la fonction et le produit scalaire est effectu´e plusieurs fois via une boucle, afin de pouvoir avoir des temps de calcul significatifs. Les param`etres permettant de jouer sur le temps de calcul, d´efinis comme des constantes dans le fichier source, sont alors :

— NBle nombre de fois que le calcul du produit scalaire sera ´evalu´e ;

— SIZE la taille des vecteurs `a utiliser. Sa valeur devra n´ecessairement ˆetre un multiple de 8.

Travail `a r´ealiser : mettez en place dans la fonction ps float() le code permettant de mesurer le temps de calcul des NB´evaluations du produit scalaire. Le temps obtenu sera affich´e `a l’´ecran, sous la

forme : temps ps float seq = XXX secondes - ps = YYY

o`u XXXsera remplac´e par le temps de calcul obtenu etYYYpar la valeur du produit scalaire calcul´e.

Vous ferez diff´erents tests sur votre machine pour r´egler les param`etresNBetSIZE1de mani`ere `a ce que le temps de calcul n’exc`ede pas quelques secondes.

Exercice 2

Dans cet exercice, vous allez ˆetre amen´es `a compl´eter la fonctionps floatde telle sorte qu’elle effectue le calcul du produit scalaire `a l’aide des routines AVX. Vous allez proc´eder en suivant les diff´erentes ´etapes ci-apr`es :

1. Comme pour la version s´equentielle, le produit scalaire vectoriel sera calcul´eNBfois. A chaque tour de boucle, la valeur du produit scalaire (la somme du produit des composantes) sera remis `a 0.

Ici, il faudra cependant utiliser une variable de type m256pour stocker le r´esultat des 8 sommes qui seront faites en parall`eles.

Application : Cr´eez la variable qui contiendra les sommes, ajoutez la boucle desNB´evaluations et initialisez la variable `a chaque entr´ee dans la boucle. Vous utiliserez l’intrinsic mm256 setzero ps en vous r´ef´erant `a la documentation ;

2. Les types vectoriels comme m256 contiennent plusieurs valeurs accol´ees dans la largeur de la donn´ee. Il peut ˆetre utile, lors d’op´erations de mise au point, d’afficher ces valeurs. Il faut alors ´ecrire une fonction sp´ecifique, le C++ ne pouvant les prendre en charge directement avec l’op´erateur<<.

1. Il est conseill´e de ne pas utiliser une taille trop grande des vecteurs, qui provoquerait alors des d´efauts de cache et une baisse notable des performances

1

(2)

Application : Compl´etez le code la fonctionprintf(std::string s, m256 *v)pr´evue dans le fichier source, de telle sorte qu’elle affiche les 8 valeurs r´eelles contenues dans son second pa- ram`etre. Le param´etresrepr´esentera le message qui sera affich´e devant les 8 valeurs, pour indiquer leur signification. Vous modifierez ensuite votre code mani`ere `a ce qu’il affiche le contenu de la somme uniquement au premier tour de boucle, apr`es son initialisation (normalement, 8 z´eros ...).

Testez avant de poursuivre ...

3. Compl´etez `a pr´esent votre fonction afin qu’elle calcule effectivement la somme vectorielle des composantes des 2 vecteurs. Lesinstrinsics`a utiliser sont mm256 mul ps et mm256 add ps; 4. A la sortie du calcul, vous disposez de la somme vectorielle du produit des diff´erentes composantes ;

Il faut `a pr´esent sommer les valeurs contenues dans cette somme vectorielle pour obtenir la valeur du produit scalaire final. Compl´eter votre code en ce sens et faites afficher la valeur obtenue pour v´erifier qu’elle est bien identique `a celle calcul´ee avec le produit scalaire s´equentiel ;

5. Enfin, compl´etez votre code de mani`ere `a pouvoir ´evaluer le temps de calcul de la partie vectorielle de la fonction, l’afficher avec le mˆeme format que pour la partie s´equentielle et enfin afficher l’acc´el´eration obtenue.

Exercice 3

D´eveloppez les fonctionsprintd(std::string s, m256d *v)etps double(int size)sur le mod`ele des fonctions similaires de l’exercice pr´ec´edent.

Exercice 4

Faire de mˆeme pour des vecteurs d’entiers.

2

Références

Documents relatifs

On admet pour l’instant qu’` a part le point stationnaire, tous les autres points de la courbe sont bir´ eguliers3. La courbe admet-elle une branche infinie lorsque t

Vous utiliserez cette fonction pour afficher tous les noeuds isol´ es d’une matrice d’adjacence pour les fichiers se trouvant dans le dossier Data.

Associ´ e ` a la remarque pr´ ec´ edente concernant la pile, cela signifie que lorsque vous empilez un sommet, son pr´ ed´ ecesseur dans l’ordre de parcours doit ˆ etre pr´

Vous vous assurerez que cette archive contient bien votre nom dans son intitul´ e (ce qui doit ˆ etre le cas avec les directives qui vous sont donn´ ees ci-dessous pour nommer

Le premier param` etre repr´ esente le nom qu’aura le fichier (extension .svg), le second param` etre repr´ esentera la variable de type fichier qui sera intialis´ ee par la fonction

Dans cette premi` ere partie, vous allez mettre en place les fonctions permettant d’initialiser la grille support au labyrinthe, de dessiner cette grille au format SVG et

Cette fonction sera appel´ ee apr` es construction du graphe de parcours, pour demander les cases de d´ epart et d’arriv´ ee dans le labyrinthe. Calcul

Dans un anneau principal, tout id´ eal premier non-nul est maximal (et donc, pour les id´ eaux non-nuls, les notions de premier et de maximal