annotate VMS.h @ 213:c5c136fc3131

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