annotate VMS.h @ 197:f6d81915512c

update include headers
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Fri, 10 Feb 2012 18:35:00 +0100
parents d83f59e6e2db
children 5b419522dc7f
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@187 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
Nina@131 101 #define CACHE_LINE 64
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@185 277 //FILE* counteroutput;
nengel@184 278 //CounterRecord** counter_history;
nengel@184 279 //PrivDynArrayInfo* counter_history_array_info;
nengel@184 280 CounterHandler counterHandler;
Nina@131 281 #endif
Nina@131 282 }
Nina@131 283 MasterEnv;
Nina@131 284
Nina@131 285 //========================= Extra Stuff Data Strucs =======================
Nina@131 286 typedef struct
Nina@131 287 {
Nina@131 288
Nina@131 289 }
Nina@131 290 VMSExcp;
Nina@131 291
Nina@131 292 struct _GateStruc
Nina@131 293 {
Nina@131 294 int32 gateClosed;
Nina@131 295 int32 preGateProgress;
Nina@131 296 int32 waitProgress;
Nina@131 297 int32 exitProgress;
Nina@131 298 };
Nina@131 299 //GateStruc
Nina@131 300
Nina@131 301 //======================= OS Thread related ===============================
Nina@131 302
Nina@131 303 void * coreLoop( void *paramsIn ); //standard PThreads fn prototype
Nina@131 304 void * coreLoop_Seq( void *paramsIn ); //standard PThreads fn prototype
Nina@131 305 void masterLoop( void *initData, VirtProcr *masterPr );
Nina@131 306
Nina@131 307
Nina@131 308 typedef struct
Nina@131 309 {
Nina@131 310 void *endThdPt;
Nina@131 311 unsigned int coreNum;
Nina@131 312 }
Nina@131 313 ThdParams;
Nina@131 314
Nina@131 315 pthread_t coreLoopThdHandles[ NUM_CORES ]; //pthread's virt-procr state
Nina@131 316 ThdParams *coreLoopThdParams [ NUM_CORES ];
Nina@131 317 pthread_mutex_t suspendLock;
Nina@131 318 pthread_cond_t suspend_cond;
Nina@131 319
Nina@131 320
Nina@131 321
Nina@131 322 //===================== Global Vars ===================
Nina@131 323
Nina@131 324 volatile MasterEnv *_VMSMasterEnv;
Nina@131 325
Nina@131 326
Nina@131 327
Nina@131 328
Nina@131 329 //=========================== Function Prototypes =========================
Nina@131 330
Nina@131 331
Nina@131 332 //========== Setup and shutdown ==========
Nina@131 333 void
Nina@131 334 VMS__init();
Nina@131 335
Nina@131 336 void
Nina@131 337 VMS__init_Seq();
Nina@131 338
Nina@131 339 void
Nina@131 340 VMS__start_the_work_then_wait_until_done();
Nina@131 341
Nina@131 342 void
Nina@131 343 VMS__start_the_work_then_wait_until_done_Seq();
Nina@131 344
Nina@131 345 inline VirtProcr *
Nina@131 346 VMS__create_procr( VirtProcrFnPtr fnPtr, void *initialData );
Nina@131 347
Nina@131 348 void
Nina@131 349 VMS__dissipate_procr( VirtProcr *procrToDissipate );
Nina@131 350
Nina@131 351 //Use this to create processor inside entry point & other places outside
Nina@131 352 // the VMS system boundary (IE, not run in slave nor Master)
Nina@131 353 VirtProcr *
Nina@131 354 VMS_ext__create_procr( VirtProcrFnPtr fnPtr, void *initialData );
Nina@131 355
Nina@131 356 void
Nina@131 357 VMS_ext__dissipate_procr( VirtProcr *procrToDissipate );
Nina@131 358
Nina@131 359 void
Nina@131 360 VMS__throw_exception( char *msgStr, VirtProcr *reqstPr, VMSExcp *excpData );
Nina@131 361
Nina@131 362 void
Nina@131 363 VMS__shutdown();
Nina@131 364
Nina@131 365 void
Nina@131 366 VMS__cleanup_at_end_of_shutdown();
Nina@131 367
Nina@131 368 void *
Nina@131 369 VMS__give_sem_env_for( VirtProcr *animPr );
Nina@131 370
Nina@131 371
Nina@131 372 //============== Request Related ===============
Nina@131 373
Nina@131 374 void
Nina@131 375 VMS__suspend_procr( VirtProcr *callingPr );
Nina@131 376
Nina@131 377 inline void
Nina@131 378 VMS__add_sem_request_in_mallocd_VMSReqst( void *semReqData, VirtProcr *callingPr );
Nina@131 379
nengel@182 380 inline void
Nina@131 381 VMS__send_sem_request( void *semReqData, VirtProcr *callingPr );
Nina@131 382
Nina@131 383 void
Nina@131 384 VMS__send_create_procr_req( void *semReqData, VirtProcr *reqstingPr );
Nina@131 385
nengel@182 386 void inline
Nina@131 387 VMS__send_dissipate_req( VirtProcr *prToDissipate );
Nina@131 388
nengel@182 389 inline void
Nina@131 390 VMS__send_VMSSem_request( void *semReqData, VirtProcr *callingPr );
Nina@131 391
Nina@131 392 VMSReqst *
Nina@131 393 VMS__take_next_request_out_of( VirtProcr *procrWithReq );
Nina@131 394
Nina@131 395 inline void *
Nina@131 396 VMS__take_sem_reqst_from( VMSReqst *req );
Nina@131 397
Nina@131 398 void inline
Nina@131 399 VMS__handle_VMSSemReq( VMSReqst *req, VirtProcr *requestingPr, void *semEnv,
Nina@131 400 ResumePrFnPtr resumePrFnPtr );
Nina@131 401
Nina@131 402 //======================== STATS ======================
Nina@131 403
Nina@131 404 //===== RDTSC wrapper ===== //Also runs with x86_64 code
Nina@131 405
Nina@131 406 #define saveTimeStampCountInto(low, high) \
Nina@131 407 asm volatile("RDTSC; \
Nina@131 408 movl %%eax, %0; \
Nina@131 409 movl %%edx, %1;" \
Nina@131 410 /* outputs */ : "=m" (low), "=m" (high)\
Nina@131 411 /* inputs */ : \
Nina@131 412 /* clobber */ : "%eax", "%edx" \
Nina@131 413 );
Nina@131 414
Nina@131 415 #define saveLowTimeStampCountInto(low) \
Nina@131 416 asm volatile("RDTSC; \
Nina@131 417 movl %%eax, %0;" \
Nina@131 418 /* outputs */ : "=m" (low) \
Nina@131 419 /* inputs */ : \
Nina@131 420 /* clobber */ : "%eax", "%edx" \
Nina@131 421 );
Nina@131 422
Nina@131 423 //====================
Nina@131 424 #define makeAMeasHist( idx, name, numBins, startVal, binWidth ) \
Nina@131 425 makeHighestDynArrayIndexBeAtLeast( _VMSMasterEnv->measHistsInfo, idx ); \
Nina@131 426 _VMSMasterEnv->measHists[idx] = \
Nina@131 427 makeFixedBinHist( numBins, startVal, binWidth, name );
Nina@131 428
Nina@131 429 #define saveCyclesAndInstrs(core,cycles,instrs) do{ \
Nina@131 430 int cycles_fd = _VMSMasterEnv->cycles_counter_fd[core]; \
Nina@131 431 int instrs_fd = _VMSMasterEnv->instrs_counter_fd[core]; \
Nina@131 432 int nread; \
Nina@131 433 \
Nina@131 434 nread = read(cycles_fd,&(cycles),sizeof(cycles)); \
Nina@131 435 if(nread<0){ \
Nina@131 436 perror("Error reading cycles counter"); \
Nina@131 437 cycles = 0; \
Nina@131 438 } \
Nina@131 439 \
Nina@131 440 nread = read(instrs_fd,&(instrs),sizeof(instrs)); \
Nina@131 441 if(nread<0){ \
Nina@131 442 perror("Error reading cycles counter"); \
Nina@131 443 instrs = 0; \
Nina@131 444 } \
Nina@131 445 } while (0)
Nina@131 446
nengel@184 447 enum eventType {
nengel@193 448 DebugEvt = 0,
nengel@193 449 AppResponderInvocation_start,
nengel@193 450 AppResponder_start,
nengel@193 451 AppResponder_end,
nengel@193 452 Assigner_start,
nengel@193 453 Assigner_end,
nengel@193 454 Work_start,
nengel@193 455 Work_end,
nengel@193 456 HwResponderInvocation_start
nengel@184 457 };
nengel@184 458
Nina@131 459 #define getReturnAddressBeforeLibraryCall(vp_ptr, res_ptr) do{ \
Nina@131 460 void* frame_ptr0 = vp_ptr->framePtr; \
Nina@131 461 void* frame_ptr1 = *((void**)frame_ptr0); \
Nina@131 462 void* frame_ptr2 = *((void**)frame_ptr1); \
Nina@131 463 void* frame_ptr3 = *((void**)frame_ptr2); \
Nina@131 464 void* ret_addr = *((void**)frame_ptr3 + 1); \
Nina@131 465 *res_ptr = ret_addr; \
Nina@131 466 } while (0)
Nina@131 467
Nina@131 468 #define MEAS__SUB_CREATE /*turn on/off subtraction of create from plugin*/
Nina@131 469
Nina@131 470 #ifdef VPTHREAD
Nina@131 471
Nina@131 472 //VPThread
nengel@182 473 #define createHistIdx 0
nengel@182 474 #define mutexLockHistIdx 1
nengel@182 475 #define mutexUnlockHistIdx 2
nengel@182 476 #define condWaitHistIdx 3
nengel@182 477 #define condSignalHistIdx 4
Nina@131 478
Nina@131 479 #define MakeTheMeasHists() \
Nina@131 480 _VMSMasterEnv->measHistsInfo = \
Nina@131 481 makePrivDynArrayOfSize( (void***)&(_VMSMasterEnv->measHists), 200); \
Nina@131 482 makeAMeasHist( createHistIdx, "create", 250, 0, 100 ) \
Nina@131 483 makeAMeasHist( mutexLockHistIdx, "mutex_lock", 50, 0, 100 ) \
Nina@131 484 makeAMeasHist( mutexUnlockHistIdx, "mutex_unlock", 50, 0, 100 ) \
Nina@131 485 makeAMeasHist( condWaitHistIdx, "cond_wait", 50, 0, 100 ) \
Nina@131 486 makeAMeasHist( condSignalHistIdx, "cond_signal", 50, 0, 100 )
Nina@131 487
Nina@131 488 #endif
Nina@131 489
Nina@131 490
Nina@131 491 #ifdef VCILK
Nina@131 492
Nina@131 493 //VCilk
nengel@182 494 #define spawnHistIdx 0
nengel@182 495 #define syncHistIdx 1
Nina@131 496
Nina@131 497 #define MakeTheMeasHists() \
Nina@131 498 _VMSMasterEnv->measHistsInfo = \
Nina@131 499 makePrivDynArrayOfSize( (void***)&(_VMSMasterEnv->measHists), 200); \
Nina@131 500 makeAMeasHist( spawnHistIdx, "Spawn", 50, 0, 200 ) \
Nina@131 501 makeAMeasHist( syncHistIdx, "Sync", 50, 0, 200 )
Nina@131 502
Nina@131 503
Nina@131 504 #endif
Nina@131 505
Nina@131 506 #ifdef SSR
Nina@131 507
Nina@131 508 //SSR
nengel@182 509 #define SendFromToHistIdx 0
nengel@182 510 #define SendOfTypeHistIdx 1
nengel@182 511 #define ReceiveFromToHistIdx 2
nengel@182 512 #define ReceiveOfTypeHistIdx 3
Nina@131 513
Nina@131 514 #define MakeTheMeasHists() \
Nina@131 515 _VMSMasterEnv->measHistsInfo = \
Nina@131 516 makePrivDynArrayOfSize( (void***)&(_VMSMasterEnv->measHists), 200); \
Nina@131 517 makeAMeasHist( SendFromToHistIdx, "SendFromTo", 50, 0, 100 ) \
Nina@131 518 makeAMeasHist( SendOfTypeHistIdx, "SendOfType", 50, 0, 100 ) \
Nina@131 519 makeAMeasHist( ReceiveFromToHistIdx,"ReceiveFromTo", 50, 0, 100 ) \
Nina@131 520 makeAMeasHist( ReceiveOfTypeHistIdx,"ReceiveOfType", 50, 0, 100 )
Nina@131 521
Nina@131 522 #endif
Nina@131 523
Nina@131 524 //===========================================================================
Nina@131 525 //VPThread
Nina@131 526
Nina@131 527
Nina@131 528 #define Meas_startCreate \
Nina@131 529 int32 startStamp, endStamp; \
Nina@131 530 saveLowTimeStampCountInto( startStamp ); \
Nina@131 531
Nina@131 532 #define Meas_endCreate \
Nina@131 533 saveLowTimeStampCountInto( endStamp ); \
Nina@131 534 addIntervalToHist( startStamp, endStamp, \
Nina@131 535 _VMSMasterEnv->measHists[ createHistIdx ] );
Nina@131 536
Nina@131 537 #define Meas_startMutexLock \
Nina@131 538 int32 startStamp, endStamp; \
Nina@131 539 saveLowTimeStampCountInto( startStamp ); \
Nina@131 540
Nina@131 541 #define Meas_endMutexLock \
Nina@131 542 saveLowTimeStampCountInto( endStamp ); \
Nina@131 543 addIntervalToHist( startStamp, endStamp, \
Nina@131 544 _VMSMasterEnv->measHists[ mutexLockHistIdx ] );
Nina@131 545
Nina@131 546 #define Meas_startMutexUnlock \
Nina@131 547 int32 startStamp, endStamp; \
Nina@131 548 saveLowTimeStampCountInto( startStamp ); \
Nina@131 549
Nina@131 550 #define Meas_endMutexUnlock \
Nina@131 551 saveLowTimeStampCountInto( endStamp ); \
Nina@131 552 addIntervalToHist( startStamp, endStamp, \
Nina@131 553 _VMSMasterEnv->measHists[ mutexUnlockHistIdx ] );
Nina@131 554
Nina@131 555 #define Meas_startCondWait \
Nina@131 556 int32 startStamp, endStamp; \
Nina@131 557 saveLowTimeStampCountInto( startStamp ); \
Nina@131 558
Nina@131 559 #define Meas_endCondWait \
Nina@131 560 saveLowTimeStampCountInto( endStamp ); \
Nina@131 561 addIntervalToHist( startStamp, endStamp, \
Nina@131 562 _VMSMasterEnv->measHists[ condWaitHistIdx ] );
Nina@131 563
Nina@131 564 #define Meas_startCondSignal \
Nina@131 565 int32 startStamp, endStamp; \
Nina@131 566 saveLowTimeStampCountInto( startStamp ); \
Nina@131 567
Nina@131 568 #define Meas_endCondSignal \
Nina@131 569 saveLowTimeStampCountInto( endStamp ); \
Nina@131 570 addIntervalToHist( startStamp, endStamp, \
Nina@131 571 _VMSMasterEnv->measHists[ condSignalHistIdx ] );
Nina@131 572
Nina@131 573 //===========================================================================
Nina@131 574 // VCilk
Nina@131 575 #define Meas_startSpawn \
Nina@131 576 int32 startStamp, endStamp; \
Nina@131 577 saveLowTimeStampCountInto( startStamp ); \
Nina@131 578
Nina@131 579 #define Meas_endSpawn \
Nina@131 580 saveLowTimeStampCountInto( endStamp ); \
Nina@131 581 addIntervalToHist( startStamp, endStamp, \
Nina@131 582 _VMSMasterEnv->measHists[ spawnHistIdx ] );
Nina@131 583
Nina@131 584 #define Meas_startSync \
Nina@131 585 int32 startStamp, endStamp; \
Nina@131 586 saveLowTimeStampCountInto( startStamp ); \
Nina@131 587
Nina@131 588 #define Meas_endSync \
Nina@131 589 saveLowTimeStampCountInto( endStamp ); \
Nina@131 590 addIntervalToHist( startStamp, endStamp, \
Nina@131 591 _VMSMasterEnv->measHists[ syncHistIdx ] );
Nina@131 592
Nina@131 593 //===========================================================================
Nina@131 594 // SSR
Nina@131 595 #define Meas_startSendFromTo \
Nina@131 596 int32 startStamp, endStamp; \
Nina@131 597 saveLowTimeStampCountInto( startStamp ); \
Nina@131 598
Nina@131 599 #define Meas_endSendFromTo \
Nina@131 600 saveLowTimeStampCountInto( endStamp ); \
Nina@131 601 addIntervalToHist( startStamp, endStamp, \
Nina@131 602 _VMSMasterEnv->measHists[ SendFromToHistIdx ] );
Nina@131 603
Nina@131 604 #define Meas_startSendOfType \
Nina@131 605 int32 startStamp, endStamp; \
Nina@131 606 saveLowTimeStampCountInto( startStamp ); \
Nina@131 607
Nina@131 608 #define Meas_endSendOfType \
Nina@131 609 saveLowTimeStampCountInto( endStamp ); \
Nina@131 610 addIntervalToHist( startStamp, endStamp, \
Nina@131 611 _VMSMasterEnv->measHists[ SendOfTypeHistIdx ] );
Nina@131 612
Nina@131 613 #define Meas_startReceiveFromTo \
Nina@131 614 int32 startStamp, endStamp; \
Nina@131 615 saveLowTimeStampCountInto( startStamp ); \
Nina@131 616
Nina@131 617 #define Meas_endReceiveFromTo \
Nina@131 618 saveLowTimeStampCountInto( endStamp ); \
Nina@131 619 addIntervalToHist( startStamp, endStamp, \
Nina@131 620 _VMSMasterEnv->measHists[ ReceiveFromToHistIdx ] );
Nina@131 621
Nina@131 622 #define Meas_startReceiveOfType \
Nina@131 623 int32 startStamp, endStamp; \
Nina@131 624 saveLowTimeStampCountInto( startStamp ); \
Nina@131 625
Nina@131 626 #define Meas_endReceiveOfType \
Nina@131 627 saveLowTimeStampCountInto( endStamp ); \
Nina@131 628 addIntervalToHist( startStamp, endStamp, \
Nina@131 629 _VMSMasterEnv->measHists[ReceiveOfTypeHistIdx ] );
Nina@131 630
Nina@131 631 //=====
Nina@131 632
Nina@131 633 #include "ProcrContext.h"
Nina@131 634 #include "probes.h"
Nina@131 635 #include "vutilities.h"
Nina@131 636
Nina@131 637 #endif /* _VMS_H */
Nina@131 638