9.1.3 : Le main.cpp
On commence avec les includes standards :
1 2 3 4 |
#include <iostream> #include <vector> #include <numeric> #include <execution> |
Puis, CURAND :
1 |
#include <curand.h>
|
On commence la fonction principale avec le nombre d'éléments à traiter :
1 2 |
int main(void){ size_t nbElement(100000000lu); |
On définit le vecteur de valeurs :
1 |
std::vector<float> vecValue(nbElement); |
On initialise the générateur de nombre aléatoire (juste par défaut) :
1 2 3 |
//Create the generator curandGenerator_t generator; curandCreateGenerator(&generator, CURAND_RNG_PSEUDO_DEFAULT); |
On donne un graine, c'est très important car cela permet d'avoir des résultats reproductibles :
1 2 |
//Set the random seed curandSetPseudoRandomGeneratorSeed(generator, 42); |
On génére une distribution gaussienne. et on passe directement vecValue.data() :
1 2 |
//Generate a normal distribution (generator, data, size, mean, std) curandGenerateNormal(generator, (float*)vecValue.data(), nbElement, 2.0f, 1.0f); |
On détruit le générateur de nombres aléatoires :
1 2 |
//Destroy the generator curandDestroyGenerator(generator); |
On appelle un std::reduce comme des gros bourins, car on a activé -stdpar=gpu lors de la compialtion
1 2 3 4 |
float res = std::reduce(std::execution::par_unseq, vecValue.begin(), vecValue.end()); std::cout << "mean = " << (res/((float)nbElement)) << std::endl; return 0; } |
Le main.cpp complet :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
/*************************************** Auteur : Pierre Aubert Mail : pierre.aubert@lapp.in2p3.fr Licence : CeCILL-C ****************************************/ #include <iostream> #include <vector> #include <numeric> #include <execution> #include <curand.h> int main(void){ size_t nbElement(100000000lu); std::vector<float> vecValue(nbElement); //Create the generator curandGenerator_t generator; curandCreateGenerator(&generator, CURAND_RNG_PSEUDO_DEFAULT); //Set the random seed curandSetPseudoRandomGeneratorSeed(generator, 42); //Generate a normal distribution (generator, data, size, mean, std) curandGenerateNormal(generator, (float*)vecValue.data(), nbElement, 2.0f, 1.0f); //Destroy the generator curandDestroyGenerator(generator); float res = std::reduce(std::execution::par_unseq, vecValue.begin(), vecValue.end()); std::cout << "mean = " << (res/((float)nbElement)) << std::endl; return 0; } |
Le fichier main.cpp est disponible ici.