annotate VMS.h @ 109:659299627e70

counters done
author Nina Engelhardt
date Tue, 02 Aug 2011 17:16:12 +0200
parents 3bc3b89630c7
children 724c7a0b687f
rev   line source
Me@42 1 /*
Me@42 2 * Copyright 2009 OpenSourceStewardshipFoundation.org
Me@42 3 * Licensed under GNU General Public License version 2
Me@42 4 *
Me@42 5 * Author: seanhalle@yahoo.com
Me@42 6 *
Me@42 7 */
Me@42 8
Me@42 9 #ifndef _VMS_H
Me@42 10 #define _VMS_H
msach@76 11 #define _GNU_SOURCE
Me@42 12
Me@42 13 #include "VMS_primitive_data_types.h"
Me@55 14 #include "Queue_impl/PrivateQueue.h"
Me@42 15 #include "Histogram/Histogram.h"
Me@50 16 #include "DynArray/DynArray.h"
Me@50 17 #include "Hash_impl/PrivateHash.h"
Me@50 18 #include "vmalloc.h"
engelhardt@108 19 #include "Counters/Counters.h"
Me@50 20
Me@42 21 #include <pthread.h>
Me@50 22 #include <sys/time.h>
Me@42 23
Me@50 24
Me@50 25 //=============================== Debug ===================================
Me@55 26 //
msach@76 27 //When SEQUENTIAL is defined, VMS does sequential exe in the main thread
msach@76 28 // It still does co-routines and all the mechanisms are the same, it just
msach@76 29 // has only a single thread and animates VPs one at a time
Me@45 30 //#define SEQUENTIAL
Me@42 31
Me@55 32 //#define USE_WORK_STEALING
Me@55 33
msach@76 34 //turns on the probe-instrumentation in the application -- when not
msach@76 35 // defined, the calls to the probe functions turn into comments
Me@52 36 #define STATS__ENABLE_PROBES
Me@60 37 //#define TURN_ON_DEBUG_PROBES
Me@52 38
msach@76 39 //These defines turn types of bug messages on and off
msach@76 40 // be sure debug messages are un-commented (next block of defines)
Me@68 41 #define dbgAppFlow TRUE /* Top level flow of application code -- general*/
Me@60 42 #define dbgProbes FALSE /* for issues inside probes themselves*/
Me@60 43 #define dbgB2BMaster FALSE /* in coreloop, back to back master VPs*/
Me@60 44 #define dbgRqstHdlr FALSE /* in request handler code*/
Me@52 45
msach@76 46 //Comment or un- the substitute half to turn on/off types of debug message
Me@55 47 #define DEBUG( bool, msg) \
Nina@109 48 if( bool){ printf(msg); fflush(stdin);}
Me@55 49 #define DEBUG1( bool, msg, param) \
Nina@109 50 if(bool){printf(msg, param); fflush(stdin);}
Me@55 51 #define DEBUG2( bool, msg, p1, p2) \
Nina@109 52 if(bool) {printf(msg, p1, p2); fflush(stdin);}
Me@45 53
msach@76 54 #define ERROR(msg) printf(msg);
msach@76 55 #define ERROR1(msg, param) printf(msg, param);
msach@76 56 #define ERROR2(msg, p1, p2) printf(msg, p1, p2);
Me@50 57
Me@50 58 //=========================== STATS =======================
Me@50 59
Me@45 60 //when MEAS__TIME_STAMP_SUSP is defined, causes code to be inserted and
Me@42 61 // compiled-in that saves the low part of the time stamp count just before
engelhardt@108 62 // suspending a processor and just after resuming that processor. It is
Me@42 63 // saved into a field added to VirtProcr. Have to sanity-check for
Me@42 64 // rollover of low portion into high portion.
Me@65 65 //#define MEAS__TIME_STAMP_SUSP
Me@65 66 //#define MEAS__TIME_MASTER
Nina@109 67 //#define MEAS__TIME_PLUGIN
Nina@109 68 //#define MEAS__TIME_MALLOC
Me@68 69 //#define MEAS__TIME_MASTER_LOCK
Nina@109 70 //#define MEAS__NUM_TIMES_TO_RUN 100000
Me@42 71
Me@55 72 //For code that calculates normalization-offset between TSC counts of
Me@55 73 // different cores.
Nina@109 74 //#define NUM_TSC_ROUND_TRIPS 10
Me@45 75
engelhardt@108 76 #define MEAS__PERF_COUNTERS
Me@50 77
Me@50 78 //========================= Hardware related Constants =====================
Me@42 79 //This value is the number of hardware threads in the shared memory
Me@42 80 // machine
engelhardt@108 81 #define NUM_CORES 2
Me@42 82
Me@55 83 // tradeoff amortizing master fixed overhead vs imbalance potential
Me@55 84 // when work-stealing, can make bigger, at risk of losing cache affinity
Me@55 85 #define NUM_SCHED_SLOTS 5
Me@42 86
Me@45 87 #define MIN_WORK_UNIT_CYCLES 20000
Me@45 88
Me@53 89 #define MASTERLOCK_RETRIES 10000
Me@42 90
Me@54 91 // stack size in virtual processors created
msach@78 92 #define VIRT_PROCR_STACK_SIZE 0x8000 /* 32K */
Me@42 93
Me@54 94 // memory for VMS__malloc
Me@54 95 #define MALLOC_ADDITIONAL_MEM_FROM_OS_SIZE 0x10000000 /* 256M */
Me@42 96
msach@78 97 #define CACHE_LINE 64
msach@79 98 #define PAGE_SIZE 4096
msach@78 99
Me@50 100
Me@50 101 //==============================
Me@42 102
Me@42 103 #define SUCCESS 0
Me@42 104
Me@55 105 #define writeVMSQ writePrivQ
Me@55 106 #define readVMSQ readPrivQ
Me@64 107 #define makeVMSQ makeVMSPrivQ
Me@55 108 #define numInVMSQ numInPrivQ
Me@55 109 #define VMSQueueStruc PrivQueueStruc
Me@42 110
Me@42 111
Me@50 112
Me@50 113 //===========================================================================
Me@50 114 typedef unsigned long long TSCount;
Me@50 115
Me@50 116 typedef struct _SchedSlot SchedSlot;
Me@50 117 typedef struct _VMSReqst VMSReqst;
Me@50 118 typedef struct _VirtProcr VirtProcr;
Me@50 119 typedef struct _IntervalProbe IntervalProbe;
Me@55 120 typedef struct _GateStruc GateStruc;
Me@55 121
Me@42 122
Me@42 123 typedef VirtProcr * (*SlaveScheduler) ( void *, int ); //semEnv, coreIdx
Me@42 124 typedef void (*RequestHandler) ( VirtProcr *, void * ); //prWReqst, semEnv
Me@42 125 typedef void (*VirtProcrFnPtr) ( void *, VirtProcr * ); //initData, animPr
Me@42 126 typedef void VirtProcrFn ( void *, VirtProcr * ); //initData, animPr
Me@50 127 typedef void (*ResumePrFnPtr) ( VirtProcr *, void * );
Me@50 128
Me@50 129
Me@50 130 //============= Requests ===========
Me@50 131 //
Me@50 132
Me@50 133 enum VMSReqstType //avoid starting enums at 0, for debug reasons
Me@50 134 {
Me@50 135 semantic = 1,
Me@50 136 createReq,
Me@50 137 dissipate,
Me@50 138 VMSSemantic //goes with VMSSemReqst below
Me@50 139 };
Me@50 140
Me@50 141 struct _VMSReqst
Me@50 142 {
Me@50 143 enum VMSReqstType reqType;//used for dissipate and in future for IO requests
Me@50 144 void *semReqData;
Me@50 145
Me@50 146 VMSReqst *nextReqst;
Me@50 147 };
Me@50 148 //VMSReqst
Me@50 149
Me@50 150 enum VMSSemReqstType //These are equivalent to semantic requests, but for
Me@50 151 { // VMS's services available directly to app, like OS
Me@50 152 createProbe = 1, // and probe services -- like a VMS-wide built-in lang
Me@50 153 openFile,
Me@50 154 otherIO
Me@50 155 };
Me@42 156
Me@42 157 typedef struct
Me@50 158 { enum VMSSemReqstType reqType;
Me@50 159 VirtProcr *requestingPr;
Me@50 160 char *nameStr; //for create probe
Me@42 161 }
Me@50 162 VMSSemReq;
Me@42 163
Me@42 164
Me@50 165 //==================== Core data structures ===================
Me@50 166
Me@42 167 struct _SchedSlot
Me@42 168 {
Me@42 169 int workIsDone;
Me@42 170 int needsProcrAssigned;
Me@42 171 VirtProcr *procrAssignedToSlot;
Me@42 172 };
Me@42 173 //SchedSlot
Me@42 174
Me@62 175 /*WARNING: re-arranging this data structure could cause VP switching
Me@64 176 * assembly code to fail -- hard-codes offsets of fields
Me@62 177 */
Me@42 178 struct _VirtProcr
Me@42 179 { int procrID; //for debugging -- count up each time create
Me@42 180 int coreAnimatedBy;
Me@42 181 void *startOfStack;
Me@42 182 void *stackPtr;
Me@42 183 void *framePtr;
Me@42 184 void *nextInstrPt;
Me@42 185
Me@42 186 void *coreLoopStartPt; //allows proto-runtime to be linked later
Me@42 187 void *coreLoopFramePtr; //restore before jmp back to core loop
Me@42 188 void *coreLoopStackPtr; //restore before jmp back to core loop
Me@42 189
Me@42 190 void *initialData;
Me@42 191
Me@42 192 SchedSlot *schedSlot;
Me@42 193 VMSReqst *requests;
Me@42 194
msach@76 195 void *semanticData; //this livesUSE_GNU here for the life of VP
Me@53 196 void *dataRetFromReq;//values returned from plugin to VP go here
Me@42 197
Me@50 198 //=========== MEASUREMENT STUFF ==========
Me@42 199 #ifdef MEAS__TIME_STAMP_SUSP
Me@42 200 unsigned int preSuspTSCLow;
Me@42 201 unsigned int postSuspTSCLow;
Me@42 202 #endif
Me@65 203 #ifdef MEAS__TIME_MASTER /* in VirtProcr because multiple masterVPs*/
msach@76 204 unsigned int startMasterTSCLow;USE_GNU
Me@42 205 unsigned int endMasterTSCLow;
Me@42 206 #endif
engelhardt@108 207 #ifdef MEAS__PERF_COUNTERS //
engelhardt@108 208 CounterRecord** counter_history;
engelhardt@108 209 PrivDynArrayInfo* counter_history_array_info;
engelhardt@108 210 #endif
Me@65 211 //========================================
Me@50 212
Me@50 213 float64 createPtInSecs; //have space but don't use on some configs
Me@42 214 };
Me@42 215 //VirtProcr
Me@42 216
Me@42 217
Me@62 218 /*WARNING: re-arranging this data structure could cause VP-switching
Me@62 219 * assembly code to fail -- hard-codes offsets of fields
Me@62 220 * (because -O3 messes with things otherwise)
Me@62 221 */
Me@42 222 typedef struct
Me@42 223 {
Me@42 224 SlaveScheduler slaveScheduler;
Me@42 225 RequestHandler requestHandler;
Me@42 226
Me@42 227 SchedSlot ***allSchedSlots;
Me@55 228 VMSQueueStruc **readyToAnimateQs;
Me@42 229 VirtProcr **masterVPs;
Me@42 230
Me@42 231 void *semanticEnv;
Me@42 232 void *OSEventStruc; //for future, when add I/O to BLIS
Me@50 233 MallocProlog *freeListHead;
Me@50 234 int32 amtOfOutstandingMem; //total currently allocated
Me@42 235
msach@73 236 void *coreLoopReturnPt;//addr to jump to to re-enter coreLoop
Me@42 237
Me@50 238 int32 setupComplete;
msach@71 239 volatile int32 masterLock;
Me@42 240
Me@50 241 int32 numMasterInARow[NUM_CORES];//detect back-to-back masterVP
Me@59 242 GateStruc *workStealingGates[ NUM_CORES ]; //concurrent work-steal
Me@55 243 int32 workStealingLock;
Me@55 244
Me@50 245 int32 numProcrsCreated; //gives ordering to processor creation
Me@50 246
Me@50 247 //=========== MEASUREMENT STUFF =============
Me@50 248 IntervalProbe **intervalProbes;
Me@53 249 PrivDynArrayInfo *dynIntervalProbesInfo;
Me@50 250 HashTable *probeNameHashTbl;
Me@50 251 int32 masterCreateProbeID;
Me@50 252 float64 createPtInSecs;
Me@68 253 Histogram **measHists;
Me@68 254 PrivDynArrayInfo *measHistsInfo;
Me@65 255 #ifdef MEAS__TIME_PLUGIN
Me@68 256 Histogram *reqHdlrLowTimeHist;
Me@68 257 Histogram *reqHdlrHighTimeHist;
Me@65 258 #endif
Me@65 259 #ifdef MEAS__TIME_MALLOC
Me@65 260 Histogram *mallocTimeHist;
Me@65 261 Histogram *freeTimeHist;
Me@65 262 #endif
Me@65 263 #ifdef MEAS__TIME_MASTER_LOCK
Me@65 264 Histogram *masterLockLowTimeHist;
Me@65 265 Histogram *masterLockHighTimeHist;
Me@65 266 #endif
engelhardt@108 267 #ifdef MEAS__PERF_COUNTERS
engelhardt@108 268 int cycles_counter_fd[NUM_CORES];
engelhardt@108 269 int instrs_counter_fd[NUM_CORES];
engelhardt@108 270 #endif
Me@42 271 }
Me@42 272 MasterEnv;
Me@42 273
Me@55 274 //========================= Extra Stuff Data Strucs =======================
Me@54 275 typedef struct
Me@54 276 {
Me@42 277
Me@54 278 }
Me@54 279 VMSExcp;
Me@50 280
Me@55 281 struct _GateStruc
Me@55 282 {
Me@55 283 int32 gateClosed;
Me@55 284 int32 preGateProgress;
Me@55 285 int32 waitProgress;
Me@55 286 int32 exitProgress;
Me@55 287 };
Me@55 288 //GateStruc
Me@50 289
Me@50 290 //======================= OS Thread related ===============================
Me@42 291
Me@42 292 void * coreLoop( void *paramsIn ); //standard PThreads fn prototype
Me@42 293 void * coreLoop_Seq( void *paramsIn ); //standard PThreads fn prototype
Me@42 294 void masterLoop( void *initData, VirtProcr *masterPr );
Me@42 295
Me@42 296
Me@50 297 typedef struct
Me@50 298 {
Me@50 299 void *endThdPt;
Me@50 300 unsigned int coreNum;
Me@50 301 }
Me@50 302 ThdParams;
Me@42 303
Me@42 304 pthread_t coreLoopThdHandles[ NUM_CORES ]; //pthread's virt-procr state
Me@42 305 ThdParams *coreLoopThdParams [ NUM_CORES ];
Me@42 306 pthread_mutex_t suspendLock;
Me@42 307 pthread_cond_t suspend_cond;
Me@42 308
Me@50 309
Me@50 310
Me@50 311 //===================== Global Vars ===================
Me@50 312
Me@42 313 volatile MasterEnv *_VMSMasterEnv;
Me@42 314
Me@50 315
Me@50 316
Me@50 317
Me@50 318 //=========================== Function Prototypes =========================
Me@50 319
Me@53 320
Me@53 321 //========== Setup and shutdown ==========
Me@42 322 void
Me@42 323 VMS__init();
Me@42 324
Me@42 325 void
Me@42 326 VMS__init_Seq();
Me@42 327
Me@42 328 void
Me@42 329 VMS__start_the_work_then_wait_until_done();
Me@42 330
Me@42 331 void
Me@42 332 VMS__start_the_work_then_wait_until_done_Seq();
Me@42 333
msach@76 334 inline VirtProcr *
Me@42 335 VMS__create_procr( VirtProcrFnPtr fnPtr, void *initialData );
Me@42 336
Me@53 337 void
Me@53 338 VMS__dissipate_procr( VirtProcr *procrToDissipate );
Me@53 339
Me@50 340 //Use this to create processor inside entry point & other places outside
Me@50 341 // the VMS system boundary (IE, not run in slave nor Master)
Me@50 342 VirtProcr *
Me@50 343 VMS_ext__create_procr( VirtProcrFnPtr fnPtr, void *initialData );
Me@50 344
Me@53 345 void
Me@53 346 VMS_ext__dissipate_procr( VirtProcr *procrToDissipate );
Me@42 347
Me@50 348 void
Me@54 349 VMS__throw_exception( char *msgStr, VirtProcr *reqstPr, VMSExcp *excpData );
Me@54 350
Me@54 351 void
Me@53 352 VMS__shutdown();
Me@53 353
Me@53 354 void
Me@53 355 VMS__cleanup_at_end_of_shutdown();
Me@50 356
Me@64 357 void *
Me@64 358 VMS__give_sem_env_for( VirtProcr *animPr );
Me@64 359
Me@50 360
Me@50 361 //============== Request Related ===============
Me@50 362
Me@50 363 void
Me@50 364 VMS__suspend_procr( VirtProcr *callingPr );
Me@50 365
Me@42 366 inline void
Me@53 367 VMS__add_sem_request_in_mallocd_VMSReqst( void *semReqData, VirtProcr *callingPr );
Me@53 368
Me@53 369 inline void
Me@53 370 VMS__send_sem_request( void *semReqData, VirtProcr *callingPr );
Me@42 371
Me@42 372 void
Me@50 373 VMS__send_create_procr_req( void *semReqData, VirtProcr *reqstingPr );
Me@42 374
Me@53 375 void inline
Me@53 376 VMS__send_dissipate_req( VirtProcr *prToDissipate );
Me@53 377
Me@52 378 inline void
Me@52 379 VMS__send_VMSSem_request( void *semReqData, VirtProcr *callingPr );
Me@52 380
Me@42 381 VMSReqst *
Me@50 382 VMS__take_next_request_out_of( VirtProcr *procrWithReq );
Me@42 383
Me@42 384 inline void *
Me@42 385 VMS__take_sem_reqst_from( VMSReqst *req );
Me@42 386
msach@78 387 void inline
msach@78 388 VMS__handle_VMSSemReq( VMSReqst *req, VirtProcr *requestingPr, void *semEnv,
msach@78 389 ResumePrFnPtr resumePrFnPtr );
msach@78 390
Me@53 391 //======================== STATS ======================
Me@42 392
msach@76 393 //===== RDTSC wrapper ===== //Also runs with x86_64 code
Me@42 394
Me@42 395 #define saveTimeStampCountInto(low, high) \
Me@42 396 asm volatile("RDTSC; \
Me@42 397 movl %%eax, %0; \
Me@42 398 movl %%edx, %1;" \
Me@42 399 /* outputs */ : "=m" (low), "=m" (high)\
Me@42 400 /* inputs */ : \
Me@42 401 /* clobber */ : "%eax", "%edx" \
Me@42 402 );
Me@42 403
Me@42 404 #define saveLowTimeStampCountInto(low) \
Me@42 405 asm volatile("RDTSC; \
Me@42 406 movl %%eax, %0;" \
Me@42 407 /* outputs */ : "=m" (low) \
Me@42 408 /* inputs */ : \
Me@42 409 /* clobber */ : "%eax", "%edx" \
Me@42 410 );
Me@68 411
Me@68 412 //====================
Me@68 413 #define makeAMeasHist( idx, name, numBins, startVal, binWidth ) \
Me@68 414 makeHighestDynArrayIndexBeAtLeast( _VMSMasterEnv->measHistsInfo, idx ); \
Me@68 415 _VMSMasterEnv->measHists[idx] = \
Me@68 416 makeFixedBinHist( numBins, startVal, binWidth, name );
Me@68 417
Nina@109 418 #define saveCyclesAndInstrs(core,cycles,instrs) do{ \
Nina@109 419 int cycles_fd = _VMSMasterEnv->cycles_counter_fd[core]; \
Nina@109 420 int instrs_fd = _VMSMasterEnv->instrs_counter_fd[core]; \
Nina@109 421 int nread; \
Nina@109 422 \
Nina@109 423 nread = read(cycles_fd,&(cycles),sizeof(cycles)); \
Nina@109 424 if(nread<0){ \
Nina@109 425 perror("Error reading cycles counter"); \
Nina@109 426 cycles = 0; \
Nina@109 427 } \
Nina@109 428 \
Nina@109 429 nread = read(instrs_fd,&(instrs),sizeof(instrs)); \
Nina@109 430 if(nread<0){ \
Nina@109 431 perror("Error reading cycles counter"); \
Nina@109 432 instrs = 0; \
Nina@109 433 } \
Nina@109 434 } while (0)
Nina@109 435
Me@68 436
Me@68 437 #define MEAS__SUB_CREATE /*turn on/off subtraction of create from plugin*/
msach@69 438
msach@73 439 #ifdef VPTHREAD
msach@73 440
msach@69 441 //VPThread
Me@68 442 #define createHistIdx 1
Me@68 443 #define mutexLockHistIdx 2
Me@68 444 #define mutexUnlockHistIdx 3
Me@68 445 #define condWaitHistIdx 4
Me@68 446 #define condSignalHistIdx 5
Me@68 447
msach@76 448 #define MakeTheMeasHists() \
msach@73 449 _VMSMasterEnv->measHistsInfo = \
msach@73 450 makePrivDynArrayOfSize( (void***)&(_VMSMasterEnv->measHists), 200); \
msach@79 451 makeAMeasHist( createHistIdx, "create", 50, 0, 100 ) \
msach@78 452 makeAMeasHist( mutexLockHistIdx, "mutex_lock", 50, 0, 100 ) \
msach@78 453 makeAMeasHist( mutexUnlockHistIdx, "mutex_unlock", 50, 0, 100 ) \
msach@78 454 makeAMeasHist( condWaitHistIdx, "cond_wait", 50, 0, 100 ) \
msach@78 455 makeAMeasHist( condSignalHistIdx, "cond_signal", 50, 0, 100 )
msach@73 456
msach@73 457 #endif
msach@73 458
msach@73 459
msach@73 460 #ifdef VCILK
msach@73 461
msach@69 462 //VCilk
msach@69 463 #define spawnHistIdx 1
msach@69 464 #define syncHistIdx 2
msach@69 465
msach@76 466 #define MakeTheMeasHists() \
msach@73 467 _VMSMasterEnv->measHistsInfo = \
msach@73 468 makePrivDynArrayOfSize( (void***)&(_VMSMasterEnv->measHists), 200); \
msach@73 469 makeAMeasHist( spawnHistIdx, "Spawn", 50, 0, 200 ) \
msach@73 470 makeAMeasHist( syncHistIdx, "Sync", 50, 0, 200 )
msach@73 471
msach@73 472
msach@73 473 #endif
msach@73 474
msach@73 475 #ifdef SSR
msach@73 476
msach@69 477 //SSR
msach@69 478 #define SendFromToHistIdx 1
msach@69 479 #define SendOfTypeHistIdx 2
msach@69 480 #define ReceiveFromToHistIdx 3
msach@69 481 #define ReceiveOfTypeHistIdx 4
msach@69 482
msach@76 483 #define MakeTheMeasHists() \
Me@68 484 _VMSMasterEnv->measHistsInfo = \
msach@73 485 makePrivDynArrayOfSize( (void***)&(_VMSMasterEnv->measHists), 200); \
msach@73 486 makeAMeasHist( SendFromToHistIdx, "SendFromTo", 50, 0, 100 ) \
msach@73 487 makeAMeasHist( SendOfTypeHistIdx, "SendOfType", 50, 0, 100 ) \
msach@73 488 makeAMeasHist( ReceiveFromToHistIdx,"ReceiveFromTo", 50, 0, 100 ) \
msach@73 489 makeAMeasHist( ReceiveOfTypeHistIdx,"ReceiveOfType", 50, 0, 100 )
msach@69 490
msach@73 491 #endif
msach@69 492
msach@69 493 //===========================================================================
msach@69 494 //VPThread
msach@69 495
Me@68 496
Me@68 497 #define Meas_startCreate \
Me@68 498 int32 startStamp, endStamp; \
Me@68 499 saveLowTimeStampCountInto( startStamp ); \
Me@68 500
Me@68 501 #define Meas_endCreate \
Me@68 502 saveLowTimeStampCountInto( endStamp ); \
Me@68 503 addIntervalToHist( startStamp, endStamp, \
Me@68 504 _VMSMasterEnv->measHists[ createHistIdx ] );
Me@68 505
Me@68 506 #define Meas_startMutexLock \
Me@68 507 int32 startStamp, endStamp; \
Me@68 508 saveLowTimeStampCountInto( startStamp ); \
Me@68 509
Me@68 510 #define Meas_endMutexLock \
Me@68 511 saveLowTimeStampCountInto( endStamp ); \
Me@68 512 addIntervalToHist( startStamp, endStamp, \
Me@68 513 _VMSMasterEnv->measHists[ mutexLockHistIdx ] );
Me@68 514
Me@68 515 #define Meas_startMutexUnlock \
Me@68 516 int32 startStamp, endStamp; \
Me@68 517 saveLowTimeStampCountInto( startStamp ); \
Me@68 518
Me@68 519 #define Meas_endMutexUnlock \
Me@68 520 saveLowTimeStampCountInto( endStamp ); \
Me@68 521 addIntervalToHist( startStamp, endStamp, \
Me@68 522 _VMSMasterEnv->measHists[ mutexUnlockHistIdx ] );
Me@68 523
Me@68 524 #define Meas_startCondWait \
Me@68 525 int32 startStamp, endStamp; \
Me@68 526 saveLowTimeStampCountInto( startStamp ); \
Me@68 527
Me@68 528 #define Meas_endCondWait \
Me@68 529 saveLowTimeStampCountInto( endStamp ); \
Me@68 530 addIntervalToHist( startStamp, endStamp, \
Me@68 531 _VMSMasterEnv->measHists[ condWaitHistIdx ] );
Me@68 532
Me@68 533 #define Meas_startCondSignal \
Me@68 534 int32 startStamp, endStamp; \
Me@68 535 saveLowTimeStampCountInto( startStamp ); \
Me@68 536
Me@68 537 #define Meas_endCondSignal \
Me@68 538 saveLowTimeStampCountInto( endStamp ); \
Me@68 539 addIntervalToHist( startStamp, endStamp, \
Me@68 540 _VMSMasterEnv->measHists[ condSignalHistIdx ] );
Me@68 541
msach@69 542 //===========================================================================
msach@69 543 // VCilk
msach@69 544 #define Meas_startSpawn \
msach@69 545 int32 startStamp, endStamp; \
msach@69 546 saveLowTimeStampCountInto( startStamp ); \
msach@69 547
msach@69 548 #define Meas_endSpawn \
msach@69 549 saveLowTimeStampCountInto( endStamp ); \
msach@69 550 addIntervalToHist( startStamp, endStamp, \
msach@69 551 _VMSMasterEnv->measHists[ spawnHistIdx ] );
msach@69 552
msach@69 553 #define Meas_startSync \
msach@69 554 int32 startStamp, endStamp; \
msach@69 555 saveLowTimeStampCountInto( startStamp ); \
msach@69 556
msach@69 557 #define Meas_endSync \
msach@69 558 saveLowTimeStampCountInto( endStamp ); \
msach@69 559 addIntervalToHist( startStamp, endStamp, \
msach@69 560 _VMSMasterEnv->measHists[ syncHistIdx ] );
msach@69 561
msach@69 562 //===========================================================================
msach@69 563 // SSR
msach@69 564 #define Meas_startSendFromTo \
msach@69 565 int32 startStamp, endStamp; \
msach@69 566 saveLowTimeStampCountInto( startStamp ); \
msach@69 567
msach@69 568 #define Meas_endSendFromTo \
msach@69 569 saveLowTimeStampCountInto( endStamp ); \
msach@69 570 addIntervalToHist( startStamp, endStamp, \
msach@69 571 _VMSMasterEnv->measHists[ SendFromToHistIdx ] );
msach@69 572
msach@69 573 #define Meas_startSendOfType \
msach@69 574 int32 startStamp, endStamp; \
msach@69 575 saveLowTimeStampCountInto( startStamp ); \
msach@69 576
msach@69 577 #define Meas_endSendOfType \
msach@69 578 saveLowTimeStampCountInto( endStamp ); \
msach@69 579 addIntervalToHist( startStamp, endStamp, \
msach@69 580 _VMSMasterEnv->measHists[ SendOfTypeHistIdx ] );
msach@69 581
msach@69 582 #define Meas_startReceiveFromTo \
msach@69 583 int32 startStamp, endStamp; \
msach@69 584 saveLowTimeStampCountInto( startStamp ); \
msach@69 585
msach@69 586 #define Meas_endReceiveFromTo \
msach@69 587 saveLowTimeStampCountInto( endStamp ); \
msach@69 588 addIntervalToHist( startStamp, endStamp, \
msach@69 589 _VMSMasterEnv->measHists[ ReceiveFromToHistIdx ] );
msach@69 590
msach@69 591 #define Meas_startReceiveOfType \
msach@69 592 int32 startStamp, endStamp; \
msach@69 593 saveLowTimeStampCountInto( startStamp ); \
msach@69 594
msach@69 595 #define Meas_endReceiveOfType \
msach@69 596 saveLowTimeStampCountInto( endStamp ); \
msach@69 597 addIntervalToHist( startStamp, endStamp, \
msach@69 598 _VMSMasterEnv->measHists[ReceiveOfTypeHistIdx ] );
Me@68 599
Me@53 600 //=====
Me@42 601
msach@77 602 #include "ProcrContext.h"
Me@50 603 #include "probes.h"
Me@65 604 #include "vutilities.h"
Me@42 605
Me@42 606 #endif /* _VMS_H */
Me@42 607