Changes in tests/PRNG.cfa [e6d8d11:ae7a085c]
- File:
-
- 1 edited
-
tests/PRNG.cfa (modified) (17 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tests/PRNG.cfa
re6d8d11 rae7a085c 8 8 // Created On : Wed Dec 29 09:38:12 2021 9 9 // Last Modified By : Peter A. Buhr 10 // Last Modified On : Sun Apr 23 22:02:09 202311 // Update Count : 4 2010 // Last Modified On : Wed Dec 21 20:39:59 2022 11 // Update Count : 406 12 12 // 13 13 … … 15 15 #include <stdlib.hfa> // PRNG 16 16 #include <clock.hfa> 17 #include <thread.hfa> 17 18 #include <limits.hfa> // MAX 18 19 #include <math.hfa> // sqrt 19 20 #include <malloc.h> // malloc_stats 20 21 #include <locale.h> // setlocale 21 #include <thread.hfa>22 22 #include <mutex_stmt.hfa> 23 23 24 #define xstr(s) str(s) 25 #define str(s) #s 26 27 #if defined( __x86_64__ ) || defined( __aarch64__ ) // 64-bit architecture 24 #ifdef __x86_64__ // 64-bit architecture 28 25 #define PRNG PRNG64 29 26 #else // 32-bit architecture 30 27 #define PRNG PRNG32 31 28 #endif // __x86_64__ 32 33 //#define TIME34 29 35 30 #ifdef TIME // use -O2 -nodebug … … 43 38 #endif // TIME 44 39 45 static void avgstd( size_t trials, size_t buckets[] ) {46 size_t min = MAX, max = 0;40 void avgstd( unsigned int buckets[] ) { 41 unsigned int min = MAX, max = 0; 47 42 double sum = 0.0, diff; 48 43 for ( i; BUCKETS ) { … … 59 54 } // for 60 55 double std = sqrt( sum / BUCKETS ); 61 mutex( sout ) sout | "trials" | trials| "buckets" | BUCKETS56 mutex( sout ) sout | "trials" | TRIALS | "buckets" | BUCKETS 62 57 | "min" | min | "max" | max 63 58 | "avg" | wd(0,1, avg) | "std" | wd(0,1, std) | "rstd" | wd(0,1, (avg == 0 ? 0.0 : std / avg * 100)) | "%"; … … 69 64 thread T1 {}; 70 65 void main( T1 & ) { 71 size_t * buckets = calloc( BUCKETS );// too big for task stack72 for ( TRIALS / 50 ) {66 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 67 for ( TRIALS / 100 ) { 73 68 buckets[rand() % BUCKETS] += 1; // concurrent 74 69 } // for 75 avgstd( TRIALS / 50,buckets );70 avgstd( buckets ); 76 71 free( buckets ); 77 72 } // main … … 81 76 PRNG prng; 82 77 if ( seed != 0 ) set_seed( prng, seed ); 83 size_t * buckets = calloc( BUCKETS );// too big for task stack78 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 84 79 for ( TRIALS ) { 85 80 buckets[prng( prng ) % BUCKETS] += 1; // concurrent 86 81 } // for 87 avgstd( TRIALS,buckets );82 avgstd( buckets ); 88 83 free( buckets ); 89 84 } // main … … 91 86 thread T3 {}; 92 87 void main( T3 & th ) { 93 size_t * buckets = calloc( BUCKETS );// too big for task stack94 for ( TRIALS / 5) {88 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 89 for ( TRIALS ) { 95 90 buckets[prng() % BUCKETS] += 1; // concurrent 96 91 } // for 97 avgstd( TRIALS / 5,buckets );92 avgstd( buckets ); 98 93 free( buckets ); 99 94 } // main … … 101 96 thread T4 {}; 102 97 void main( T4 & th ) { 103 size_t * buckets = calloc( BUCKETS );// too big for task stack98 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 104 99 for ( TRIALS ) { 105 buckets[prng( th ) % BUCKETS] += 1; // concurrent106 } // for 107 avgstd( TRIALS,buckets );100 buckets[prng( th ) % BUCKETS] += 1; // concurrent 101 } // for 102 avgstd( buckets ); 108 103 free( buckets ); 109 104 } // main … … 113 108 static void dummy( thread$ & th ) __attribute__(( noinline )); 114 109 static void dummy( thread$ & th ) { 115 size_t * buckets = (size_t *)calloc( BUCKETS, sizeof(size_t) ); // too big for task stack116 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 ) { 117 112 buckets[prng( th ) % BUCKETS] += 1; // sequential 118 113 } // for 119 avgstd( TRIALS,buckets );114 avgstd( buckets ); 120 115 free( buckets ); 121 116 } // dummy … … 123 118 124 119 int main() { 125 // setlocale( LC_NUMERIC, getenv( "LANG" ) ); // causes leaked storage message 126 127 // only works on the current pthread thread 120 // causes leaked storage message 121 // setlocale( LC_NUMERIC, getenv( "LANG" ) ); // print digit separator 128 122 // locale_t loc = newlocale( LC_NUMERIC_MASK, getenv( "LANG" ), (locale_t)0p ); 129 123 // if ( loc == (locale_t)0p ) abort( "newlocale" ); … … 132 126 enum { TASKS = 4 }; 133 127 Time start; 134 135 128 #ifdef TIME // too slow for test and generates non-repeatable results 136 129 #if 1 137 sout | "glib rand" | nl | nl; 138 139 size_t rseed; 130 unsigned int rseed; 140 131 if ( seed != 0 ) rseed = seed; 141 132 else rseed = rdtscl(); … … 143 134 144 135 sout | sepDisable; 145 sout | nl |wd(26, "rand()" ) | wd(12, "rand(5)") | wd(12, "rand(0,5)" );136 sout | wd(26, "rand()" ) | wd(12, "rand(5)") | wd(12, "rand(0,5)" ); 146 137 for ( 20 ) { 147 138 sout | wd(26, rand()) | nonl; … … 155 146 STARTTIME; 156 147 { 157 size_t * buckets = calloc( BUCKETS );// too big for task stack158 for ( i; TRIALS / 5) {148 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 149 for ( i; TRIALS / 10 ) { 159 150 buckets[rand() % BUCKETS] += 1; // sequential 160 151 } // for 161 avgstd( TRIALS / 5,buckets );152 avgstd( buckets ); 162 153 free( buckets ); 163 154 } 164 ENDTIME( " x 5" );155 ENDTIME( " x 10 " ); 165 156 166 157 sout | nl | "Concurrent"; … … 172 163 } // wait for threads to complete 173 164 } 174 ENDTIME( " x 50 " );165 ENDTIME( " x 100 " ); 175 166 #endif // 0 176 167 #endif // TIME 177 178 sout | nl | "CFA " xstr(PRNG_NAME);179 180 168 #if 1 181 169 PRNG prng; … … 196 184 STARTTIME; 197 185 { 198 size_t * buckets = calloc( BUCKETS );// too big for task stack186 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 199 187 for ( TRIALS ) { 200 188 buckets[prng( prng ) % BUCKETS] += 1; // sequential 201 189 } // for 202 avgstd( TRIALS,buckets );190 avgstd( buckets ); 203 191 free( buckets ); 204 192 } … … 231 219 STARTTIME; 232 220 { 233 size_t * buckets = calloc( BUCKETS );// too big for task stack234 for ( TRIALS / 5) {221 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 222 for ( TRIALS ) { 235 223 buckets[prng() % BUCKETS] += 1; 236 224 } // for 237 avgstd( TRIALS / 5,buckets );225 avgstd( buckets ); 238 226 free( buckets ); 239 227 } 240 ENDTIME( " x 5 ");228 ENDTIME(); 241 229 242 230 sout | nl | "Concurrent"; … … 248 236 } // wait for threads to complete 249 237 } 250 ENDTIME( " x 5 ");238 ENDTIME(); 251 239 #endif // 0 252 240 #if 1
Note:
See TracChangeset
for help on using the changeset viewer.