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