Changeset 7806f91 for doc/theses/mike_brooks_MMath/benchmarks/list/driver.c
- Timestamp:
- Jul 25, 2025, 3:29:48 PM (2 months ago)
- Branches:
- master
- Children:
- 1eea589f, 29c6a7d
- Parents:
- 7640ff5
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
doc/theses/mike_brooks_MMath/benchmarks/list/driver.c
r7640ff5 r7806f91 6 6 #include "observation.h" 7 7 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 8 18 typedef struct B_UserItem 9 19 BFX_EXTRUSION_DECL(B_UserItem) 10 20 { 11 21 BFX_INTRUSION(B_UserItem) 12 int userdata[64];22 UDATA_T userdata[ UDATA_LEN ]; 13 23 } 14 24 B_UserItem; … … 18 28 #if defined(NDEBUG) || (defined(__cforall) && !defined(__CFA_DEBUG__)) 19 29 enum { DefaultNumNodes = 1000, DefaultExperimentDurSec = 1, DefaultCheckDonePeriod = 1000, DefaultExperimentDurOpCount = -1, DefaultSeed = 5 }; 30 const double DefaultInterleaveFrac = 0.0; 20 31 #define TRACE(tp) 21 32 #else 22 33 enum { DefaultNumNodes = 10, DefaultExperimentDurSec = 1, DefaultCheckDonePeriod = 2, DefaultExperimentDurOpCount = 20, DefaultSeed = 5 }; 34 const double DefaultInterleaveFrac = 0.5; 23 35 static const char * tp_filter 24 36 // = ""; … … 39 51 static BFX_LIST_HEAD_T(B_UserItem) lst; 40 52 41 42 53 MAYBE_EXTERN_C ( 43 54 … … 45 56 volatile unsigned int bobs_prog_inserting = 0; 46 57 volatile unsigned int bobs_prog_removing = 0; 58 volatile unsigned int bobs_prog_removing_end = 0; 47 59 volatile unsigned int bobs_prog_rollover_flag = 0; 60 // bobs_prog_rem_pos (defined after BOP_REMPROGEND_IS_REMNO_BASED) 48 61 49 62 void bobs_seek(unsigned int i) { … … 68 81 int bobs_getCurrentVal() { 69 82 B_UserItem * curUI = BFX_DEREF_POS(B_UserItem, lst, observedItem); 70 return curUI->userdata[ 17];83 return curUI->userdata[ UDATA_USE_POS ]; 71 84 } 72 85 … … 75 88 ) 76 89 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 98 MAYBE_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 77 103 unsigned int uDefaultPreemption() { 78 104 return 0; … … 81 107 int main(int argc, const char *argv[]) { 82 108 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; 85 111 86 112 unsigned int ExperimentDurSec = DefaultExperimentDurSec; … … 89 115 size_t ExperimentDurOpCount = DefaultExperimentDurOpCount; 90 116 unsigned int Seed = DefaultSeed; 117 double InterleaveFrac = DefaultInterleaveFrac; 91 118 92 119 switch (((argc - 1) < static_arg_posns) ? (argc - 1) : static_arg_posns) { 120 case 6: InterleaveFrac = atof(argv[6]); 93 121 case 5: Seed = atoi(argv[5]); 94 122 case 4: ExperimentDurOpCount = atol(argv[4]); … … 98 126 } 99 127 128 // printf("ExperimentDurSec=%d, CheckDonePeriod=%d, NumNodes=%d, ExperimentDurOpCount=%zd, Seed=%d,\n", 129 // ExperimentDurSec, CheckDonePeriod, NumNodes, ExperimentDurOpCount, Seed ); 130 100 131 if (ExperimentDurSec == 0 || CheckDonePeriod == 0 || NumNodes == 0 || ExperimentDurOpCount == 0 || Seed == 0 ) { 101 132 printf("usage: %s %s\n", argv[0], usage_args); … … 110 141 #endif 111 142 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. 112 145 #ifdef DISABLE_SHUFFLING_INDIRECTION 113 146 #define INSERTPOS(insertNum) insertNum … … 138 171 #endif 139 172 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 140 223 ui = (B_UserItem*) malloc( (size_t)NumNodes * (size_t)sizeof(B_UserItem) ); 141 224 if (!ui) { … … 152 235 memset(listedItems, 0, (size_t)NumNodes * (size_t)sizeof(BFX_LISTED_ELEM_T(B_UserItem))); 153 236 154 // Fill with demo data237 // Construct and fill with demo data 155 238 for (unsigned int i = 0; i < NumNodes; i++) { 156 239 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; 158 244 } 159 245 … … 166 252 // lst lvalue of the list head being added to / removed from 167 253 // 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) 170 256 // item lvalue of the item being added 171 257 // Logical insert number 0 and remove number n-1 are given with a distinguished hook. … … 186 272 double elapsed_sec = 0; 187 273 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}; 188 282 189 283 size_t privateOpsCompleted = 0; … … 191 285 while (elapsed_sec <= (double) ExperimentDurSec && privateOpsCompleted < ExperimentDurOpCount) { 192 286 for ( int t = 0; t < CheckDonePeriod; t += 1 ) { 193 TRACE('a') 287 TRACE('a') // insert special first 194 288 listedItems[0] = 195 289 BOP_INIT(lst, listedItems, 0, ui[INSERTPOS(0)]); 196 TRACE('b') 290 TRACE('b') // insert general 197 291 for ( int privateCurInsert = 1; 198 292 (bobs_prog_inserting = privateCurInsert, privateCurInsert < NumNodes); … … 204 298 TRACE('+') 205 299 } 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 210 308 ) { 211 309 TRACE('-') 212 BOP_REMOVE( lst, listedItems, privateCurRemove-1);310 BOP_REMOVE( lst, listedItems, removeBase[flip]+removeProgress[flip] ); 213 311 TRACE('+') 214 312 } 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 216 328 BOP_TEARDOWN(lst, listedItems, NumNodes-1); 217 329 TRACE('d') … … 222 334 TRACE('e') 223 335 bobs_prog_inserting = 0; 224 bobs_prog_removing = 0; 336 bobs_prog_removing = 0; 337 bobs_prog_removing_end = 0; 225 338 bobs_ops_completed = privateOpsCompleted; 226 339 TRACE('f') … … 245 358 free(ui); 246 359 free(listedItems); 360 #ifndef DISABLE_SHUFFLING_INDIRECTION 247 361 free(insertOrdShuf); 362 #endif 248 363 }
Note:
See TracChangeset
for help on using the changeset viewer.