Ignore:
Timestamp:
Jul 25, 2025, 3:29:48 PM (2 months ago)
Author:
Mike Brooks <mlbrooks@…>
Branches:
master
Children:
1eea589f, 29c6a7d
Parents:
7640ff5
Message:

Add code for reproducing performance numbers in thesis draft of 16a843

File:
1 edited

Legend:

Unmodified
Added
Removed
  • doc/theses/mike_brooks_MMath/benchmarks/list/driver.c

    r7640ff5 r7806f91  
    66#include "observation.h"
    77
     8#ifdef TINY_USER_ITEMS
     9  #define UDATA_T char
     10  #define UDATA_LEN 1
     11  #define UDATA_USE_POS 0
     12#else
     13  #define UDATA_T int
     14  #define UDATA_LEN 64
     15  #define UDATA_USE_POS 17
     16#endif
     17
    818typedef struct B_UserItem
    919    BFX_EXTRUSION_DECL(B_UserItem)
    1020{
    1121    BFX_INTRUSION(B_UserItem)
    12     int userdata[64];
     22    UDATA_T userdata[ UDATA_LEN ];
    1323}
    1424B_UserItem;
     
    1828#if defined(NDEBUG) || (defined(__cforall) && !defined(__CFA_DEBUG__))
    1929    enum { DefaultNumNodes = 1000, DefaultExperimentDurSec = 1, DefaultCheckDonePeriod = 1000, DefaultExperimentDurOpCount = -1, DefaultSeed = 5 };
     30    const double DefaultInterleaveFrac = 0.0;
    2031    #define TRACE(tp)
    2132#else
    2233    enum { DefaultNumNodes = 10, DefaultExperimentDurSec = 1, DefaultCheckDonePeriod = 2, DefaultExperimentDurOpCount = 20, DefaultSeed = 5 };
     34    const double DefaultInterleaveFrac = 0.5;
    2335    static const char * tp_filter
    2436    // = "";
     
    3951static BFX_LIST_HEAD_T(B_UserItem) lst;
    4052
    41 
    4253MAYBE_EXTERN_C (
    4354
     
    4556    volatile unsigned int bobs_prog_inserting     = 0;
    4657    volatile unsigned int bobs_prog_removing      = 0;
     58    volatile unsigned int bobs_prog_removing_end  = 0;
    4759    volatile unsigned int bobs_prog_rollover_flag = 0;
     60    //                    bobs_prog_rem_pos         (defined after BOP_REMPROGEND_IS_REMNO_BASED)
    4861
    4962    void bobs_seek(unsigned int i) {
     
    6881    int bobs_getCurrentVal() {
    6982        B_UserItem * curUI = BFX_DEREF_POS(B_UserItem, lst, observedItem);
    70         return curUI->userdata[17];
     83        return curUI->userdata[ UDATA_USE_POS ];
    7184    }
    7285
     
    7588)
    7689
     90
     91// Remove progress end (number) is based (upon) remove-number
     92// True when an OP's REMELEM used remNo to choose which element to remove
     93// False otherwise; notably including when REMELEM just bases upon first/last
     94// Default to false.
     95#ifndef BOP_REMPROGEND_IS_REMNO_BASED
     96#define BOP_REMPROGEND_IS_REMNO_BASED false
     97#endif
     98MAYBE_EXTERN_C (
     99    volatile unsigned int const * bobs_prog_rem_pos
     100        = BOP_REMPROGEND_IS_REMNO_BASED ? & bobs_prog_removing_end : & bobs_prog_removing;
     101)
     102
    77103unsigned int uDefaultPreemption() {
    78104        return 0;
     
    81107int main(int argc, const char *argv[]) {
    82108
    83     const char * usage_args = "[ExperimentDurSec [CheckDonePeriod [NumNodes [ExperimentDurOpCount [Seed]]]]]";
    84     const int static_arg_posns = 5;
     109    const char * usage_args = "[ExperimentDurSec [CheckDonePeriod [NumNodes [ExperimentDurOpCount [Seed [InterleaveFrac]]]]]]";
     110    const int static_arg_posns = 6;
    85111
    86112    unsigned int ExperimentDurSec     = DefaultExperimentDurSec;
     
    89115    size_t       ExperimentDurOpCount = DefaultExperimentDurOpCount;
    90116    unsigned int Seed                 = DefaultSeed;
     117    double       InterleaveFrac       = DefaultInterleaveFrac;
    91118
    92119    switch (((argc - 1) < static_arg_posns) ? (argc - 1) : static_arg_posns) {
     120      case 6: InterleaveFrac = atof(argv[6]);
    93121      case 5: Seed = atoi(argv[5]);
    94122      case 4: ExperimentDurOpCount = atol(argv[4]);
     
    98126    }
    99127
     128    // printf("ExperimentDurSec=%d, CheckDonePeriod=%d, NumNodes=%d, ExperimentDurOpCount=%zd, Seed=%d,\n",
     129    //     ExperimentDurSec, CheckDonePeriod, NumNodes, ExperimentDurOpCount, Seed );
     130
    100131    if (ExperimentDurSec == 0 || CheckDonePeriod == 0 || NumNodes == 0 || ExperimentDurOpCount == 0 || Seed == 0 ) {
    101132        printf("usage: %s %s\n", argv[0], usage_args);
     
    110141  #endif
    111142
     143    // Shuffling makes listed items' physical order in memory different from their order within to the list.
     144    // Affects insertion: next item to insert picked through insertOrdShuf.
    112145  #ifdef DISABLE_SHUFFLING_INDIRECTION
    113146    #define INSERTPOS(insertNum) insertNum
     
    138171  #endif
    139172
     173    // Interleaving affects the list position where an element-oriented operation occurs: at an end vs. in the middle.
     174    // Perterbs the sequence of logical insert/remove numbers presented to the OP cartridge, e.g. from [0 1 2 3 4 5 6]
     175    // to [3 0 4 1 5 2 6], which is [mid end mid end mid end solo], for a perfect-alternation interleave; except that the
     176    // end/mid interleave is atually selected randomly.
     177  #ifdef DISABLE_INTERLEAVING
     178    #define nextInterleave 0
     179    printf("interleave key %x\n", 0);
     180  #else
     181    const unsigned int INTRL_KEYLEN = 64;
     182    unsigned char interleaveKey[INTRL_KEYLEN];
     183    unsigned char nextInterleavePos = 0;
     184    {
     185        unsigned int numOnes = INTRL_KEYLEN * InterleaveFrac;
     186        unsigned int numZeros = INTRL_KEYLEN - numOnes;
     187        // generate randomly drawn 0/1
     188        memset( interleaveKey         , 0, numZeros );  // zeros then ones
     189        memset( interleaveKey+numZeros, 1, numOnes );
     190        for (unsigned int i = 0; i < 64; i++) { // shuffle it
     191            unsigned int nodesRemaining = 64 - i;
     192            unsigned int swapWith = i + rand() % nodesRemaining;
     193            unsigned char tempValue = interleaveKey[swapWith];
     194            interleaveKey[swapWith] = interleaveKey[i];
     195            interleaveKey[i] = tempValue;
     196        }
     197        #define nextInterleave (interleaveKey[nextInterleavePos = (nextInterleavePos + 1) % 64])
     198    }
     199    {
     200        unsigned int z = 0, o = 0;
     201        for ( int i = 0; i < INTRL_KEYLEN; i++ ) {
     202            if (interleaveKey[i]) o++;
     203            else z++;
     204        }
     205        // printf("Interleaving with %u in middle and %u at end\n", o, z);
     206    }
     207    // printf("interleave key begins %016llx\n", *(unsigned long long*)interleaveKey);
     208    // printf("interleave key begins %016llx\n", *(unsigned long long*)(interleaveKey+8));
     209    // printf("sample interleave value %d\n", nextInterleave);
     210    // printf("sample interleave value %d\n", nextInterleave);
     211    // printf("sample interleave value %d\n", nextInterleave);
     212    // printf("sample interleave value %d\n", nextInterleave);
     213    // printf("sample interleave value %d\n", nextInterleave);
     214    // printf("sample interleave value %d\n", nextInterleave);
     215    // printf("sample interleave value %d\n", nextInterleave);
     216    // printf("sample interleave value %d\n", nextInterleave);
     217    // printf("sample interleave value %d\n", nextInterleave);
     218    // printf("sample interleave value %d\n", nextInterleave);
     219    // printf("sample interleave value %d\n", nextInterleave);
     220    // printf("sample interleave value %d\n", nextInterleave);
     221  #endif
     222
    140223    ui = (B_UserItem*) malloc( (size_t)NumNodes * (size_t)sizeof(B_UserItem) );
    141224    if (!ui) {
     
    152235    memset(listedItems, 0, (size_t)NumNodes * (size_t)sizeof(BFX_LISTED_ELEM_T(B_UserItem)));
    153236
    154     // Fill with demo data
     237    // Construct and fill with demo data
    155238    for (unsigned int i = 0; i < NumNodes; i++) {
    156239        B_UserItem * curUI = & ui[INSERTPOS(i)];
    157         curUI->userdata[17] = i;
     240      #ifdef __cforall
     241        (*curUI){};
     242      #endif
     243        curUI->userdata[ UDATA_USE_POS ] = i;
    158244    }
    159245
     
    166252    //   lst    lvalue of the list head being added to / removed from
    167253    //   iters  array of ADD return values, in logical-insert order; on ADD, is valid at [0..insNo)
    168     //   insNo  counter of the ADD calls (logical insert number)
    169     //   remNo  counter of the REM calls (logical remove number)
     254    //   insNo  interleave-perterbed counter of the ADD calls (logical insert number)
     255    //   remNo  interleave-perterbed counter of the REM calls (logical remove number)
    170256    //   item   lvalue of the item being added
    171257    // Logical insert number 0 and remove number n-1 are given with a distinguished hook.
     
    186272    double elapsed_sec = 0;
    187273    clock_t start = clock();
     274 
     275    const unsigned int numMiddleNodes = (NumNodes-1) * InterleaveFrac;
     276    const unsigned int numEndNodes = NumNodes - numMiddleNodes - 1;
     277
     278    // printf("Running with %u in the middle and %u at end\n", numMiddleNodes, numEndNodes);
     279
     280    const unsigned int removeBase[] = {0, numEndNodes};
     281    const unsigned int removeLimit[] = {numEndNodes, numMiddleNodes};
    188282
    189283    size_t privateOpsCompleted = 0;
     
    191285    while (elapsed_sec <= (double) ExperimentDurSec && privateOpsCompleted < ExperimentDurOpCount) {
    192286        for ( int t = 0; t < CheckDonePeriod; t += 1 ) {
    193             TRACE('a')
     287            TRACE('a')              // insert special first
    194288            listedItems[0] =
    195289                BOP_INIT(lst, listedItems, 0, ui[INSERTPOS(0)]);
    196             TRACE('b')
     290            TRACE('b')              // insert general
    197291            for ( int privateCurInsert = 1;
    198292                  (bobs_prog_inserting = privateCurInsert, privateCurInsert < NumNodes);
     
    204298                TRACE('+')
    205299            }
    206             TRACE('c')
    207             for ( int privateCurRemove = 1;
    208                   (bobs_prog_removing = privateCurRemove, privateCurRemove < NumNodes);
    209                   privateCurRemove += 1
     300            TRACE('c')              // remove general
     301            int removeProgress[] = { 0, 0 };
     302            for ( int flip = 0;
     303                  (bobs_prog_removing = removeProgress[0] + removeProgress[1] + 1,
     304                     bobs_prog_removing_end = removeProgress[0] + 1,
     305                     flip = nextInterleave,
     306                     removeProgress[0] < removeLimit[0] && removeProgress[1] < removeLimit[1] );
     307                  removeProgress[flip] += 1
    210308                ) {
    211309                TRACE('-')
    212                 BOP_REMOVE( lst, listedItems, privateCurRemove-1 );
     310                BOP_REMOVE( lst, listedItems, removeBase[flip]+removeProgress[flip] );
    213311                TRACE('+')
    214312            }
    215             TRACE('D')
     313            TRACE('X')              // remove imbalanced
     314            // most work done under general; it stops when either flip-side's work finishes
     315            // now drain any any stragglers so both flip-sides' work finishes
     316            for ( int flip = 0; flip < 2; flip ++ ) {
     317                for ( ; (bobs_prog_removing = removeProgress[0] + removeProgress[1] + 1,
     318                         bobs_prog_removing_end = removeProgress[0] + 1,
     319                         removeProgress[flip] < removeLimit[flip] )
     320                      ;  removeProgress[flip] += 1
     321                    ) {
     322                    TRACE('-')
     323                    BOP_REMOVE( lst, listedItems, removeBase[flip]+removeProgress[flip] );
     324                    TRACE('+')
     325                }
     326            }
     327            TRACE('D')              // remove special last
    216328            BOP_TEARDOWN(lst, listedItems, NumNodes-1);
    217329            TRACE('d')
     
    222334            TRACE('e')
    223335            bobs_prog_inserting = 0;
    224             bobs_prog_removing = 0;           
     336            bobs_prog_removing = 0;
     337            bobs_prog_removing_end = 0;
    225338            bobs_ops_completed = privateOpsCompleted;
    226339            TRACE('f')
     
    245358    free(ui);
    246359    free(listedItems);
     360  #ifndef DISABLE_SHUFFLING_INDIRECTION
    247361    free(insertOrdShuf);
     362  #endif
    248363}
Note: See TracChangeset for help on using the changeset viewer.