Changeset 6e1e2d0 for tests/PRNG.cfa


Ignore:
Timestamp:
May 1, 2023, 4:19:09 PM (3 years ago)
Author:
caparsons <caparson@…>
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.
Message:

resolved merge conflicts

File:
1 edited

Legend:

Unmodified
Added
Removed
  • tests/PRNG.cfa

    ra50fdfb r6e1e2d0  
    88// Created On       : Wed Dec 29 09:38:12 2021
    99// Last Modified By : Peter A. Buhr
    10 // Last Modified On : Wed Dec 21 20:39:59 2022
    11 // Update Count     : 406
     10// Last Modified On : Sun Apr 23 22:02:09 2023
     11// Update Count     : 420
    1212//
    1313
     
    1515#include <stdlib.hfa>                                                                   // PRNG
    1616#include <clock.hfa>
    17 #include <thread.hfa>
    1817#include <limits.hfa>                                                                   // MAX
    1918#include <math.hfa>                                                                             // sqrt
    2019#include <malloc.h>                                                                             // malloc_stats
    2120#include <locale.h>                                                                             // setlocale
     21#include <thread.hfa>
    2222#include <mutex_stmt.hfa>
    2323
    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
    2528#define PRNG PRNG64
    2629#else                                                                                                   // 32-bit architecture
    2730#define PRNG PRNG32
    2831#endif // __x86_64__
     32
     33//#define TIME
    2934
    3035#ifdef TIME                                                                                             // use -O2 -nodebug
     
    3843#endif // TIME
    3944
    40 void avgstd( unsigned int buckets[] ) {
    41         unsigned int min = MAX, max = 0;
     45static void avgstd( size_t trials, size_t buckets[] ) {
     46        size_t min = MAX, max = 0;
    4247        double sum = 0.0, diff;
    4348        for ( i; BUCKETS ) {
     
    5459        } // for
    5560        double std = sqrt( sum / BUCKETS );
    56         mutex( sout ) sout | "trials"  | TRIALS | "buckets" | BUCKETS
     61        mutex( sout ) sout | "trials"  | trials | "buckets" | BUCKETS
    5762                | "min" | min | "max" | max
    5863                | "avg" | wd(0,1, avg) | "std" | wd(0,1, std) | "rstd" | wd(0,1, (avg == 0 ? 0.0 : std / avg * 100)) | "%";
     
    6469thread T1 {};
    6570void main( T1 & ) {
    66         unsigned int * buckets = calloc( BUCKETS );                     // too big for task stack
    67         for ( TRIALS / 100 ) {
     71        size_t * buckets = calloc( BUCKETS );                           // too big for task stack
     72        for ( TRIALS / 50 ) {
    6873                buckets[rand() % BUCKETS] += 1;                                 // concurrent
    6974        } // for
    70         avgstd( buckets );
     75        avgstd( TRIALS / 50, buckets );
    7176        free( buckets );
    7277} // main
     
    7681        PRNG prng;
    7782        if ( seed != 0 ) set_seed( prng, seed );
    78         unsigned int * buckets = calloc( BUCKETS );                     // too big for task stack
     83        size_t * buckets = calloc( BUCKETS );                           // too big for task stack
    7984        for ( TRIALS ) {
    8085                buckets[prng( prng ) % BUCKETS] += 1;                   // concurrent
    8186        } // for
    82         avgstd( buckets );
     87        avgstd( TRIALS, buckets );
    8388        free( buckets );
    8489} // main
     
    8691thread T3 {};
    8792void main( T3 & th ) {
    88         unsigned int * buckets = calloc( BUCKETS );                     // too big for task stack
    89         for ( TRIALS ) {
     93        size_t * buckets = calloc( BUCKETS );                           // too big for task stack
     94        for ( TRIALS / 5 ) {
    9095                buckets[prng() % BUCKETS] += 1;                                 // concurrent
    9196        } // for
    92         avgstd( buckets );
     97        avgstd( TRIALS / 5, buckets );
    9398        free( buckets );
    9499} // main
     
    96101thread T4 {};
    97102void main( T4 & th ) {
    98         unsigned int * buckets = calloc( BUCKETS );                     // too big for task stack
     103        size_t * buckets = calloc( BUCKETS );                           // too big for task stack
    99104        for ( TRIALS ) {
    100                 buckets[prng( th ) % BUCKETS] += 1;     // concurrent
    101         } // for
    102         avgstd( buckets );
     105                buckets[prng( th ) % BUCKETS] += 1;                             // concurrent
     106        } // for
     107        avgstd( TRIALS, buckets );
    103108        free( buckets );
    104109} // main
     
    108113static void dummy( thread$ & th ) __attribute__(( noinline ));
    109114static void dummy( thread$ & th ) {
    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 ) {
     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 ) {
    112117                buckets[prng( th ) % BUCKETS] += 1;                             // sequential
    113118        } // for
    114         avgstd( buckets );
     119        avgstd( TRIALS, buckets );
    115120        free( buckets );
    116121} // dummy
     
    118123
    119124int 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
    122128        // locale_t loc = newlocale( LC_NUMERIC_MASK, getenv( "LANG" ), (locale_t)0p );
    123129        // if ( loc == (locale_t)0p ) abort( "newlocale" );
     
    126132        enum { TASKS = 4 };
    127133        Time start;
     134
    128135#ifdef TIME                                                                                             // too slow for test and generates non-repeatable results
    129136#if 1
    130         unsigned int rseed;
     137        sout | "glib rand" | nl | nl;
     138
     139        size_t rseed;
    131140        if ( seed != 0 ) rseed = seed;
    132141        else rseed = rdtscl();
     
    134143
    135144        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)" );
    137146        for ( 20 ) {
    138147                sout | wd(26, rand()) | nonl;
     
    146155        STARTTIME;
    147156        {
    148                 unsigned int * buckets = calloc( BUCKETS );             // too big for task stack
    149                 for ( i; TRIALS / 10 ) {
     157                size_t * buckets = calloc( BUCKETS );                   // too big for task stack
     158                for ( i; TRIALS / 5 ) {
    150159                        buckets[rand() % BUCKETS] += 1;                         // sequential
    151160                } // for
    152                 avgstd( buckets );
     161                avgstd( TRIALS / 5, buckets );
    153162                free( buckets );
    154163        }
    155         ENDTIME( " x 10 " );
     164        ENDTIME( " x 5 " );
    156165
    157166        sout | nl | "Concurrent";
     
    163172                } // wait for threads to complete
    164173        }
    165         ENDTIME( " x 100 " );
     174        ENDTIME( " x 50 " );
    166175#endif // 0
    167176#endif // TIME
     177
     178        sout | nl | "CFA " xstr(PRNG_NAME);
     179
    168180#if 1
    169181        PRNG prng;
     
    184196        STARTTIME;
    185197        {
    186                 unsigned int * buckets = calloc( BUCKETS );             // too big for task stack
     198                size_t * buckets = calloc( BUCKETS );                   // too big for task stack
    187199                for ( TRIALS ) {
    188200                        buckets[prng( prng ) % BUCKETS] += 1;           // sequential
    189201                } // for
    190                 avgstd( buckets );
     202                avgstd( TRIALS, buckets );
    191203                free( buckets );
    192204        }
     
    219231        STARTTIME;
    220232        {
    221                 unsigned int * buckets = calloc( BUCKETS );             // too big for task stack
    222                 for ( TRIALS ) {
     233                size_t * buckets = calloc( BUCKETS );                   // too big for task stack
     234                for ( TRIALS / 5 ) {
    223235                        buckets[prng() % BUCKETS] += 1;
    224236                } // for
    225                 avgstd( buckets );
     237                avgstd( TRIALS / 5, buckets );
    226238                free( buckets );
    227239        }
    228         ENDTIME();
     240        ENDTIME( " x 5 " );
    229241
    230242        sout | nl | "Concurrent";
     
    236248                } // wait for threads to complete
    237249        }
    238         ENDTIME();
     250        ENDTIME( " x 5 " );
    239251#endif // 0
    240252#if 1
Note: See TracChangeset for help on using the changeset viewer.