Comme je suis gentil avec vous, je vous ai préparé un zip qui contient un projet Maven avec son POM,
struct-conc-lab5.zip, et les fichiers de configs pour Eclipse et IntelliJ déjà écrits.
Le but de cet exercice est de calculer la somme et le minimum d'un tableau de façon vectorisée
(en utilisant des vecteurs de valeurs).
Nous allons pour cela créer une classe fr.umlv.structconc.VectorComputation
(dans src/main/java) qui contriendra les différentes méthodes statiques.
Les tests unitaires correspondant s'appel fr.umlv.structconc.VectorComputationTest
(dans src/test/java).
De plus la classe fr.umlv.structconc.VectorComputationBenchMark (dans src/main/java)
contient les tests de perfomance JMH pour vérfier que le code que vous avez écrit est bien plus
performant qu'une simple boucle sur les données du tableau.
On cherche à écrire
FizzBuzz avec des vecteurs.
Pour rappel, FizzBuzz est un programme qui consiste à écrire sur la sortie standard
-
Les nombres de 1 à 100 en remplaçant les nombres
-
multiple de 3 par "Fizz"
-
multiple de 5 par "Buzz"
-
multiple de 15 par "FizzBuzz"
Pour résoudre le problème avec des vecteurs, on va le décomposer en deux parties,
on va résoudre le problème en remplissant un tableau d'entiers avec
-1 pour Fizz, -2 pour Buzz et -3 pour FizzBuzz puis on utilisera le code suivant
pour afficher les chaines de caractères correspondantes
Arrays.stream(fizzBuzz(19)).mapToObj(i -> switch (i) {
case -1 -> "Fizz";
case -2 -> "Buzz";
case -3 -> "FizzBuzz";
default -> "" + i;
}).forEach(System.out::println);
Donc on cherche a générer la suite d'entiers correspondant à FizzBuzz,
pour les première valeur, cela donne
-3 1 2 -1 4 -2 -1 7 8 -1 -2 11 -1 13 14 -3 16 17 -1 19 -2 -1 22 23 -1 -2 26 -1 28 29 ...
On peut remarquer qu'une fois passé les 15 premières valeurs la suite se répète
pour les valeurs négatives (c'est normal avec le module 15).
Les mêmes valeurs avec un saut de ligne à la 15ième valeur:
-3 1 2 -1 4 -2 -1 7 8 -1 -2 11 -1 13 14
-3 16 17 -1 19 -2 -1 22 23 -1 -2 26 -1 28 29 ...
En fait, on peut facilement calculer les valeurs suivantes à partir des 15 premières valeurs,
soit la valeur est negative et elle reste la même soit elle est positive et il faut l'augmenter de 15.
Reste à savoir comment mettre 15 valeurs dans un vecteur d'entiers, si on utilise des CPUs AVX2,
chaque vecteur fait 256 bites, donc 8 valeurs entières, on a donc besoin de 2 registres,
et il faudra faire attention à ne pas prendre en compte la 16ième valeur, la dernière du deuxième registre.