GPU Workshop Sample Code
 All Data Structures Namespaces Files Functions Variables Macros Pages
simpleRandom.cu
Go to the documentation of this file.
1 
4 
5 #include "../include/mycuda.h"
6 #include "../include/mycuda_random.h"
7 
8 
9 using namespace mycuda;
10 
11 
13 
14 int verify( float * z, int n, float * q, float * d, int nq ) {
15  printf( " Expected Realized\n" );
16  printf( "================================\n" );
17  for (int i=0; i<nq; i++) {
18  int n_realized=0;
19  for (int j=0; j<n; j++) {
20  if ( ( i==0 || z[j]>q[i-1] ) && z[j]<=q[i] ) n_realized++;
21  }
22  printf( "Quantile %d: %9.6f %9.6f\n", i, d[i], float(n_realized)/n );
23  }
24  return 0;
25 }
26 
27 
28 
29 
30 int main () {
31 
32  const int blocksize = 64;
33  const int gridsize = 64;
34  const int n = 1<<20;
35  const int seed = 27853;
36 
37  float * z = mapped_malloc<float>(n);
38  curandState_t * state = device_malloc<curandState>(blocksize*gridsize);
39  mycuda_random::random_init <<< gridsize, blocksize >>> ( state, seed, blocksize*gridsize );
40 
41 
42 
43  // Generate some uniform randoms
44  mycuda_random::random_uniform <<< gridsize, blocksize >>> ( z, state, n );
45  cudaDeviceSynchronize();
46 
47  // Print a few...
48  printf( "\n\nUniform\n==============\n" );
49  for (int i=0; i<50; i++) printf( "%8.4f\n", z[i] );
50 
51  // Check quantiles
52  float q[10], d[10];
53  for (int i=0;i<10;i++) {
54  q[i] = (i+1)*0.10;
55  d[i] = 0.10;
56  }
57  verify( z, n, q, d, 10 );
58 
59 
60  // Generate some normal randoms
61  mycuda_random::random_normal <<< gridsize, blocksize >>> ( z, state, n );
62  cudaDeviceSynchronize();
63 
64  // Print a few...
65  printf( "\n\nNormal\n==============\n" );
66  for (int i=0; i<50; i++) printf( "%8.4f\n", z[i] );
67 
68  // Check quantiles
69  for (int i=0;i<10;i++) {
70  q[i] = mycuda_random::norm_cdf_inv( (i+1)*0.10f );
71  d[i] = 0.10;
72  }
73  verify( z, n, q, d, 10 );
74 }
75 
76 
77 
78 
79 
80