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.