Changes in / [c831073:d859a30]
- Location:
- tests
- Files:
-
- 2 edited
-
.expect/PRNG.x64.txt (modified) (2 diffs)
-
PRNG.cfa (modified) (16 diffs)
Legend:
- Unmodified
- Added
- Removed
-
tests/.expect/PRNG.x64.txt
rc831073 rd859a30 1 2 CFA xoshiro256pp3 1 4 2 PRNG() PRNG(5) PRNG(0,5) … … 58 56 59 57 Sequential 60 trials 20000000 buckets 100000 min 139 max 265 avg 200.0 std 14.1 rstd 7.0%58 trials 100000000 buckets 100000 min 875 max 1146 avg 1000.0 std 31.6 rstd 3.2% 61 59 62 60 Concurrent 63 trials 20000000 buckets 100000 min 139 max 265 avg 200.0 std 14.1 rstd 7.0%64 trials 20000000 buckets 100000 min 139 max 265 avg 200.0 std 14.1 rstd 7.0%65 trials 20000000 buckets 100000 min 139 max 265 avg 200.0 std 14.1 rstd 7.0%66 trials 20000000 buckets 100000 min 139 max 265 avg 200.0 std 14.1 rstd 7.0%61 trials 100000000 buckets 100000 min 875 max 1146 avg 1000.0 std 31.6 rstd 3.2% 62 trials 100000000 buckets 100000 min 875 max 1146 avg 1000.0 std 31.6 rstd 3.2% 63 trials 100000000 buckets 100000 min 875 max 1146 avg 1000.0 std 31.6 rstd 3.2% 64 trials 100000000 buckets 100000 min 875 max 1146 avg 1000.0 std 31.6 rstd 3.2% 67 65 68 66 prng(t) prng(t,5) prng(t,0,5) -
tests/PRNG.cfa
rc831073 rd859a30 8 8 // Created On : Wed Dec 29 09:38:12 2021 9 9 // Last Modified By : Peter A. Buhr 10 // Last Modified On : Sat Apr 15 16:44:31 202311 // Update Count : 4 1910 // 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 … … 131 126 enum { TASKS = 4 }; 132 127 Time start; 133 134 128 #ifdef TIME // too slow for test and generates non-repeatable results 135 129 #if 1 136 sout | "glib rand" | nl | nl; 137 138 size_t rseed; 130 unsigned int rseed; 139 131 if ( seed != 0 ) rseed = seed; 140 132 else rseed = rdtscl(); … … 142 134 143 135 sout | sepDisable; 144 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)" ); 145 137 for ( 20 ) { 146 138 sout | wd(26, rand()) | nonl; … … 154 146 STARTTIME; 155 147 { 156 size_t * buckets = calloc( BUCKETS );// too big for task stack157 for ( i; TRIALS / 5) {148 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 149 for ( i; TRIALS / 10 ) { 158 150 buckets[rand() % BUCKETS] += 1; // sequential 159 151 } // for 160 avgstd( TRIALS / 5,buckets );152 avgstd( buckets ); 161 153 free( buckets ); 162 154 } 163 ENDTIME( " x 5" );155 ENDTIME( " x 10 " ); 164 156 165 157 sout | nl | "Concurrent"; … … 171 163 } // wait for threads to complete 172 164 } 173 ENDTIME( " x 50 " );165 ENDTIME( " x 100 " ); 174 166 #endif // 0 175 167 #endif // TIME 176 177 sout | nl | "CFA " xstr(PRNG_NAME);178 179 168 #if 1 180 169 PRNG prng; … … 195 184 STARTTIME; 196 185 { 197 size_t * buckets = calloc( BUCKETS );// too big for task stack186 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 198 187 for ( TRIALS ) { 199 188 buckets[prng( prng ) % BUCKETS] += 1; // sequential 200 189 } // for 201 avgstd( TRIALS,buckets );190 avgstd( buckets ); 202 191 free( buckets ); 203 192 } … … 230 219 STARTTIME; 231 220 { 232 size_t * buckets = calloc( BUCKETS );// too big for task stack233 for ( TRIALS / 5) {221 unsigned int * buckets = calloc( BUCKETS ); // too big for task stack 222 for ( TRIALS ) { 234 223 buckets[prng() % BUCKETS] += 1; 235 224 } // for 236 avgstd( TRIALS / 5,buckets );225 avgstd( buckets ); 237 226 free( buckets ); 238 227 } 239 ENDTIME( " x 5 ");228 ENDTIME(); 240 229 241 230 sout | nl | "Concurrent"; … … 247 236 } // wait for threads to complete 248 237 } 249 ENDTIME( " x 5 ");238 ENDTIME(); 250 239 #endif // 0 251 240 #if 1
Note:
See TracChangeset
for help on using the changeset viewer.