Changes in tests/PRNG.cfa [4246869:20cf96d]
- File:
-
- 1 edited
-
tests/PRNG.cfa (modified) (19 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tests/PRNG.cfa
r4246869 r20cf96d 1 // 1 // -*- Mode: C -*- 2 // 2 3 // Cforall Version 1.0.0 Copyright (C) 2021 University of Waterloo 3 // 4 // PRNG.c -- high-perforamnce pseudo-random numbers 5 // 6 // The contents of this file are covered under the licence agreement in the 7 // file "LICENCE" distributed with Cforall. 8 // 4 // 5 // PRNG.c -- 6 // 9 7 // Author : Peter A. Buhr 10 8 // Created On : Wed Dec 29 09:38:12 2021 11 9 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T hu May 25 15:39:52 202313 // Update Count : 42210 // Last Modified On : Tue Nov 22 22:51:12 2022 11 // Update Count : 381 14 12 // 15 13 … … 17 15 #include <stdlib.hfa> // PRNG 18 16 #include <clock.hfa> 17 #include <thread.hfa> 19 18 #include <limits.hfa> // MAX 20 19 #include <math.hfa> // sqrt 21 20 #include <malloc.h> // malloc_stats 22 21 #include <locale.h> // setlocale 23 #include <thread.hfa>24 22 #include <mutex_stmt.hfa> 25 23 26 #define xstr(s) str(s) 27 #define str(s) #s 28 29 #if defined( __x86_64__ ) || defined( __aarch64__ ) // 64-bit architecture 24 #ifdef __x86_64__ // 64-bit architecture 30 25 #define PRNG PRNG64 31 26 #else // 32-bit architecture 32 27 #define PRNG PRNG32 33 28 #endif // __x86_64__ 34 35 //#define TIME36 29 37 30 #ifdef TIME // use -O2 -nodebug … … 45 38 #endif // TIME 46 39 47 static void avgstd( size_t trials, size_t buckets[] ) {48 size_t min = MAX, max = 0;40 void avgstd( unsigned int buckets[] ) { 41 unsigned int min = MAX, max = 0; 49 42 double sum = 0.0, diff; 50 43 for ( i; BUCKETS ) { … … 61 54 } // for 62 55 double std = sqrt( sum / BUCKETS ); 63 mutex( sout ) sout | "trials" | trials| "buckets" | BUCKETS56 mutex( sout ) sout | "trials" | TRIALS | "buckets" | BUCKETS 64 57 | "min" | min | "max" | max 65 58 | "avg" | wd(0,1, avg) | "std" | wd(0,1, std) | "rstd" | wd(0,1, (avg == 0 ? 0.0 : std / avg * 100)) | "%"; … … 67 60 68 61 69 size_t seed = 1009;62 unsigned int seed = 1009; 70 63 71 64 thread T1 {}; 72 65 void main( T1 & ) { 73 size_t * buckets = calloc( BUCKETS );// too big for task stack74 for ( TRIALS / 50 ) {66 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 67 for ( TRIALS / 100 ) { 75 68 buckets[rand() % BUCKETS] += 1; // concurrent 76 69 } // for 77 avgstd( TRIALS / 50,buckets );70 avgstd( buckets ); 78 71 free( buckets ); 79 72 } // main … … 83 76 PRNG prng; 84 77 if ( seed != 0 ) set_seed( prng, seed ); 85 size_t * buckets = calloc( BUCKETS );// too big for task stack78 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 86 79 for ( TRIALS ) { 87 80 buckets[prng( prng ) % BUCKETS] += 1; // concurrent 88 81 } // for 89 avgstd( TRIALS,buckets );82 avgstd( buckets ); 90 83 free( buckets ); 91 84 } // main … … 93 86 thread T3 {}; 94 87 void main( T3 & th ) { 95 size_t * buckets = calloc( BUCKETS );// too big for task stack96 for ( TRIALS / 5) {88 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 89 for ( TRIALS ) { 97 90 buckets[prng() % BUCKETS] += 1; // concurrent 98 91 } // for 99 avgstd( TRIALS / 5,buckets );92 avgstd( buckets ); 100 93 free( buckets ); 101 94 } // main … … 103 96 thread T4 {}; 104 97 void main( T4 & th ) { 105 size_t * buckets = calloc( BUCKETS );// too big for task stack98 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 106 99 for ( TRIALS ) { 107 buckets[prng( th ) % BUCKETS] += 1; // concurrent108 } // for 109 avgstd( TRIALS,buckets );100 buckets[prng( th ) % BUCKETS] += 1; // concurrent 101 } // for 102 avgstd( buckets ); 110 103 free( buckets ); 111 104 } // main … … 115 108 static void dummy( thread$ & th ) __attribute__(( noinline )); 116 109 static void dummy( thread$ & th ) { 117 size_t * buckets = (size_t *)calloc( BUCKETS, sizeof(size_t) ); // too big for task stack118 for ( size_t i = 0; i < TRIALS; i += 1 ) {110 unsigned int * buckets = (unsigned int *)calloc( BUCKETS, sizeof(unsigned int) ); // too big for task stack 111 for ( unsigned int i = 0; i < TRIALS; i += 1 ) { 119 112 buckets[prng( th ) % BUCKETS] += 1; // sequential 120 113 } // for 121 avgstd( TRIALS,buckets );114 avgstd( buckets ); 122 115 free( buckets ); 123 116 } // dummy 124 117 125 126 118 int main() { 127 // setlocale( LC_NUMERIC, getenv( "LANG" ) ); // causes leaked storage message 128 129 // only works on the current pthread thread 130 // locale_t loc = newlocale( LC_NUMERIC_MASK, getenv( "LANG" ), (locale_t)0p ); 131 // if ( loc == (locale_t)0p ) abort( "newlocale" ); 132 // uselocale( loc ); 119 // causes leaked storage message 120 // setlocale( LC_NUMERIC, getenv( "LANG" ) ); // print digit separator 133 121 134 122 enum { TASKS = 4 }; 135 123 Time start; 136 137 124 #ifdef TIME // too slow for test and generates non-repeatable results 138 125 #if 1 139 sout | "glib rand" | nl | nl; 140 141 size_t rseed; 126 unsigned int rseed; 142 127 if ( seed != 0 ) rseed = seed; 143 128 else rseed = rdtscl(); … … 145 130 146 131 sout | sepDisable; 147 sout | nl | wd(26, "rand()" ) | wd(12, "rand(5)") | wd(12, "rand(0,5)" );148 for ( 20 ) { 149 sout | wd( 26, rand()) | nonl;150 sout | wd(1 2, rand() % 5) | nonl;151 sout | wd(1 2, rand() % (5 - 0 + 1) + 0);132 sout | wd(13, "rand()" ) | wd(10, "rand(5)") | wd(13, "rand(0,5)" ); 133 for ( 20 ) { 134 sout | wd(13, rand()) | nonl; 135 sout | wd(10, rand() % 5) | nonl; 136 sout | wd(13, rand() % (5 - 0 + 1) + 0); 152 137 } // for 153 138 sout | sepEnable; … … 157 142 STARTTIME; 158 143 { 159 size_t * buckets = calloc( BUCKETS );// too big for task stack160 for ( i; TRIALS / 5) {144 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 145 for ( i; TRIALS / 10 ) { 161 146 buckets[rand() % BUCKETS] += 1; // sequential 162 147 } // for 163 avgstd( TRIALS / 5,buckets );148 avgstd( buckets ); 164 149 free( buckets ); 165 150 } 166 ENDTIME( " x 5" );151 ENDTIME( " x 10 " ); 167 152 168 153 sout | nl | "Concurrent"; … … 174 159 } // wait for threads to complete 175 160 } 176 ENDTIME( " x 50 " );161 ENDTIME( " x 100 " ); 177 162 #endif // 0 178 163 #endif // TIME 179 180 sout | nl | "CFA " xstr(PRNG_NAME);181 182 164 #if 1 183 165 PRNG prng; … … 186 168 187 169 sout | sepDisable; 188 sout | nl | wd( 26, "PRNG()" ) | wd(12, "PRNG(5)") | wd(12, "PRNG(0,5)" );189 for ( 20 ) { 190 sout | wd( 26, prng( prng )) | nonl; // cascading => side-effect functions called in arbitary order191 sout | wd(1 2, prng( prng, 5 )) | nonl;192 sout | wd(1 2, prng( prng, 0, 5 ));170 sout | nl | wd(13, "PRNG()" ) | wd(10, "PRNG(5)") | wd(13, "PRNG(0,5)" ); 171 for ( 20 ) { 172 sout | wd(13, prng( prng )) | nonl; // cascading => side-effect functions called in arbitary order 173 sout | wd(10, prng( prng, 5 )) | nonl; 174 sout | wd(13, prng( prng, 0, 5 )); 193 175 } // for 194 176 sout | sepEnable; … … 198 180 STARTTIME; 199 181 { 200 size_t * buckets = calloc( BUCKETS );// too big for task stack182 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 201 183 for ( TRIALS ) { 202 184 buckets[prng( prng ) % BUCKETS] += 1; // sequential 203 185 } // for 204 avgstd( TRIALS,buckets );186 avgstd( buckets ); 205 187 free( buckets ); 206 188 } … … 221 203 222 204 sout | sepDisable; 223 sout | nl | wd( 26, "prng()" ) | wd(12, "prng(5)") | wd(12, "prng(0,5)" );224 for ( 20 ) { 225 sout | wd( 26, prng()) | nonl; // cascading => side-effect functions called in arbitary order226 sout | wd(1 2, prng( 5 )) | nonl;227 sout | wd(1 2, prng( 0, 5 ));205 sout | nl | wd(13, "prng()" ) | wd(10, "prng(5)") | wd(13, "prng(0,5)" ); 206 for ( 20 ) { 207 sout | wd(13, prng()) | nonl; // cascading => side-effect functions called in arbitary order 208 sout | wd(10, prng( 5 )) | nonl; 209 sout | wd(13, prng( 0, 5 )); 228 210 } // for 229 211 sout | sepEnable; … … 233 215 STARTTIME; 234 216 { 235 size_t * buckets = calloc( BUCKETS );// too big for task stack236 for ( TRIALS / 5) {217 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 218 for ( TRIALS ) { 237 219 buckets[prng() % BUCKETS] += 1; 238 220 } // for 239 avgstd( TRIALS / 5,buckets );221 avgstd( buckets ); 240 222 free( buckets ); 241 223 } 242 ENDTIME( " x 5 ");224 ENDTIME(); 243 225 244 226 sout | nl | "Concurrent"; … … 250 232 } // wait for threads to complete 251 233 } 252 ENDTIME( " x 5 ");234 ENDTIME(); 253 235 #endif // 0 254 236 #if 1 … … 257 239 258 240 sout | sepDisable; 259 sout | nl | wd( 26, "prng(t)" ) | wd(12, "prng(t,5)") | wd(12, "prng(t,0,5)" );260 for ( 20 ) { 261 sout | wd( 26, prng( th )) | nonl; // cascading => side-effect functions called in arbitary order262 sout | wd(1 2, prng( th, 5 )) | nonl;263 sout | wd(1 2, prng( th, 0, 5 ));241 sout | nl | wd(13, "prng(t)" ) | wd(10, "prng(t,5)") | wd(13, "prng(t,0,5)" ); 242 for ( 20 ) { 243 sout | wd(13, prng( th )) | nonl; // cascading => side-effect functions called in arbitary order 244 sout | wd(10, prng( th, 5 )) | nonl; 245 sout | wd(13, prng( th, 0, 5 )); 264 246 } // for 265 247 sout | sepEnable; … … 284 266 #endif // 0 285 267 // malloc_stats(); 286 // freelocale( loc );287 268 } // main 288 269
Note:
See TracChangeset
for help on using the changeset viewer.