Chapter 5.3 : Lancement du programme



Si on lance notre programme, nous obtenons :

./simple_dot_product_best_init 
res = 3.19999e+09


Ça ne vole toujours pas très haut, mais au moins ça fonctionne.

Note : à aucun moment nous avons du spécifier où trouver Cuda pour calculer sur GPU car nvc++ se débrouille.


Si on demande à time :

time ./simple_dot_product_best_init
res = 3.19999e+09

real 0m0,424s user 0m0,223s sys 0m0,192s


On voit que le calcul est quand même très rapide, malgré les 100000000 de valeurs à calculer, et la rédution sur toutes les valeurs de nos vecteurs.

Vous aurez remarqué que le résulat est différent de l'exemple précédent, c'est balaud parce que le calcul est beaucoup plus rapide. Si l'appel à std::generate utilise std::execution::seq et non std::execution::par_unseq vous obtiendrez les mêmes résutlats que précédemment. Tout cela à cause d'une petite fourberie de la bibliothèque standard : les vecteurs sont initialisés différemment (à cause du std::execution::par_unseq il n'y a pas de garantie d'ordre noteEn fait, ce n'est pas vraiment une fourberie, c'est comme ça que ça fonctionne. Le parallelisme ne donne pas de garantie d'ordre.) et la réduction donne un résultat différent car les erreurs de calcul ne se produisent pas aux mêmes endroits. Notez que j'ai que le résultat était différent, pas qu'il était faux (d'ailleurs si vous remplaçez le float de la réduction par un double , vous obtiendrez bien 3.19999e+09, et pas 4.5e+09). Cela ne posait pas de problème avec notre produit de Hadamard, car tous les calcul étaient indépendents. De même, cela ne poserait pas de problème pour initialiser des particules.