diff --git a/CMakeLists.txt b/CMakeLists.txt index 6eab72be46..86bdc45019 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -986,14 +986,23 @@ if(${TARGET} STREQUAL "charm4py") target_link_libraries(charm cudart cudahybridapi) endif() + if(${TRACING}) + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + target_link_libraries(charm trace-summary trace-projections "-Llib/ -standalone -all_load -c++stl -shared") + else() + target_link_libraries(charm trace-summary trace-projections "-Llib/ -standalone -whole-archive -c++stl -shared") + endif() + endif() + add_dependencies(charm hwloc) -endif() -# Check that we are able to build and link an executable -add_executable(ckhello ${CMAKE_SOURCE_DIR}/tests/charm++/simplearrayhello/hello.C) -add_dependencies(ckhello ck ldb-rand memory-default threads-default conv-static - converse ckmain ckqt - moduleNDMeshStreamer modulecompletion) +else() + # Check that we are able to build and link an executable + add_executable(ckhello ${CMAKE_SOURCE_DIR}/tests/charm++/simplearrayhello/hello.C) + add_dependencies(ckhello ck ldb-none memory-default threads-default conv-static + converse ckmain ckqt + moduleNDMeshStreamer modulecompletion) +endif() # Create conv-mach-opt.sh set(optfile_sh ${CMAKE_BINARY_DIR}/include/conv-mach-opt.sh) diff --git a/src/ck-core/charm.h b/src/ck-core/charm.h index cee65d539a..aee83ad923 100644 --- a/src/ck-core/charm.h +++ b/src/ck-core/charm.h @@ -148,6 +148,9 @@ extern void CkStartQDExt_ArrayCallback(int aid, int* idx, int ndims, int epIdx, extern void CkStartQDExt_SectionCallback(int sid_pe, int sid_cnt, int rootPE, int ep); extern void registerCreateCallbackMsgExtCallback(void (*cb)(void*, int, int, int, int *, char**, int*)); extern void registerPyReductionExtCallback(int (*cb)(char**, int*, int, char**)); +extern int CkTraceRegisterUserEvent(char *EventDesc, int eventID); +extern void CkTraceBeginUserBracketEvent(int eventID); +extern void CkTraceEndUserBracketEvent(int eventID); #endif /*********************************************************/ @@ -226,11 +229,12 @@ extern void CkRegisterBase(int derivedIdx, int baseIdx); /** Sets the ifNotThere policy of an EP **/ extern void CkRegisterIfNotThere(int epIdx, CkArray_IfNotThere policy); #if CMK_CHARM4PY -extern void CkRegisterMainChareExt(const char *s, int numEntryMethods, int *chareIdx, int *startEpIdx); -extern void CkRegisterGroupExt(const char *s, int numEntryMethods, int *chareIdx, int *startEpIdx); -extern void CkRegisterSectionManagerExt(const char *s, int numEntryMethods, int *chareIdx, int *startEpIdx); -extern void CkRegisterArrayMapExt(const char *s, int numEntryMethods, int *chareIdx, int *startEpIdx); -extern void CkRegisterArrayExt(const char *s, int numEntryMethods, int *chareIdx, int *startEpIdx); +void CkRegisterMainChareExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx); +extern void CkRegisterGroupExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx); +extern void CkRegisterGroupExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx); +extern void CkRegisterSectionManagerExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx); +extern void CkRegisterArrayMapExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx); +extern void CkRegisterArrayExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx); extern void CkRegisterReadonlyExt(const char *name, const char *type, size_t msgSize, char *msg); #endif diff --git a/src/ck-core/ck.C b/src/ck-core/ck.C index 33bfc82bcf..8ab873db9b 100644 --- a/src/ck-core/ck.C +++ b/src/ck-core/ck.C @@ -2637,6 +2637,19 @@ void CkArrayExtSend_multi(int aid, int *idx, int ndims, int epIdx, int num_bufs, } } +int CkTraceRegisterUserEvent(char *EventDesc, int eventNum) +{ + return traceRegisterUserEvent(EventDesc, eventNum); +} + +void CkTraceBeginUserBracketEvent(int eventID) +{ + traceBeginUserBracketEvent(eventID); +} +void CkTraceEndUserBracketEvent(int eventID) +{ + traceEndUserBracketEvent(eventID); +} #endif //------------------- Message Watcher (record/replay) ---------------- diff --git a/src/ck-core/init.C b/src/ck-core/init.C index 728466dfc3..cd12163a40 100644 --- a/src/ck-core/init.C +++ b/src/ck-core/init.C @@ -90,6 +90,21 @@ extern void QdCreate(int); extern void QdProcess(int); #endif +#if CMK_CHARM4PY && CMK_TRACE_ENABLED +extern void _registerTraceProjections(); +extern void _registerTraceSummary(); +extern void _createTraceprojections(char **argv); +extern void _createTracesummary(char **argv); + +void _createTraces(char **argv) { (void)argv; +_createTraceprojections(argv); +_createTracesummary(argv); +} + +#elif CMK_CHARM4PY +void _createTraces(char **argv){}; +#endif + void CkRestartMain(const char* dirname, CkArgMsg* args); #define DEBUGF(x) //CmiPrintf x; @@ -1524,14 +1539,21 @@ void _initCharm(int unused_argc, char **argv) _registerCkMemCheckpoint(); #endif #if CMK_CHARM4PY - /** - Load balancers are currently registered in Charm++ through a C file that is generated and - and compiled by charmc when making an executable. That file contains appropriate calls to - register whatever load balancers are being linked in. - Without an executable (charm4py just uses libcharm.so), the load balancers in libcharm.so - have to somehow be registered during init. - */ - _registerTreeLB(); + /** + Load balancers are currently registered in Charm++ through a C file that is generated and + and compiled by charmc when making an executable. That file contains appropriate calls to + register whatever load balancers are being linked in. + Without an executable (charm4py just uses libcharm.so), the load balancers in libcharm.so + have to somehow be registered during init. + */ + _registerTreeLB(); + +#if CMK_TRACE_ENABLED + _registerTraceProjections(); + _registerTraceSummary(); +#endif + + #endif /** diff --git a/src/ck-core/register.C b/src/ck-core/register.C index 11604725f0..0274c30543 100644 --- a/src/ck-core/register.C +++ b/src/ck-core/register.C @@ -33,6 +33,7 @@ void _registerInit(void) int CkRegisterMsg(const char *name, CkPackFnPtr pack, CkUnpackFnPtr unpack, CkDeallocFnPtr dealloc, size_t size) { + auto messageSize = _msgTable.size(); return _msgTable.add(new MsgInfo(name, pack, unpack, dealloc, size)); } @@ -101,37 +102,41 @@ void CkRegisterGroupIrr(int chareIndex,int isIrr){ // TODO give a unique name to entry methods when calling CkRegisterEp // (no need has appeared for this so this is very low priority) -void CkRegisterGroupExt(const char *s, int numEntryMethods, int *chareIdx, int *startEpIdx) { +void CkRegisterGroupExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx) { int __idx = CkRegisterChare(s, sizeof(GroupExt), TypeGroup); CkRegisterBase(__idx, CkIndex_IrrGroup::__idx); int epIdxCtor = CkRegisterEp(s, GroupExt::__GroupExt, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); CkRegisterDefaultCtor(__idx, epIdxCtor); - for (int i=1; i < numEntryMethods; i++) - CkRegisterEp(s, GroupExt::__entryMethod, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); + for (int i=emNamesStart + 1; i < emNamesStart+numEntryMethods; i++) + { + CkRegisterEp(emNames[i], GroupExt::__entryMethod, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); + } *chareIdx = __idx; *startEpIdx = epIdxCtor; } -void CkRegisterSectionManagerExt(const char *s, int numEntryMethods, int *chareIdx, int *startEpIdx) { +void CkRegisterSectionManagerExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx) { int __idx = CkRegisterChare(s, sizeof(SectionManagerExt), TypeGroup); CkRegisterBase(__idx, CkIndex_IrrGroup::__idx); int epIdxCtor = CkRegisterEp(s, SectionManagerExt::__SectionManagerExt, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); CkRegisterDefaultCtor(__idx, epIdxCtor); - CkRegisterEp(s, SectionManagerExt::__sendToSection, CkMarshallMsg::__idx, __idx, 0); + CkRegisterEp("sendToSection", SectionManagerExt::__sendToSection, CkMarshallMsg::__idx, __idx, 0); - for (int i=2; i < numEntryMethods; i++) - CkRegisterEp(s, SectionManagerExt::__entryMethod, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); + for (int i=emNamesStart+2; i < numEntryMethods+emNamesStart; i++) + { + CkRegisterEp(emNames[i], SectionManagerExt::__entryMethod, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); + } *chareIdx = __idx; *startEpIdx = epIdxCtor; } -void CkRegisterArrayMapExt(const char *s, int numEntryMethods, int *chareIdx, int *startEpIdx) { +void CkRegisterArrayMapExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx) { int __idx = CkRegisterChare(s, sizeof(ArrayMapExt), TypeGroup); CkRegisterBase(__idx, CkIndex_IrrGroup::__idx); @@ -139,13 +144,13 @@ void CkRegisterArrayMapExt(const char *s, int numEntryMethods, int *chareIdx, in CkRegisterDefaultCtor(__idx, epIdxCtor); for (int i=1; i < numEntryMethods; i++) - CkRegisterEp(s, ArrayMapExt::__entryMethod, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); + CkRegisterEp(emNames[i], ArrayMapExt::__entryMethod, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); *chareIdx = __idx; *startEpIdx = epIdxCtor; } -void CkRegisterArrayExt(const char *s, int numEntryMethods, int *chareIdx, int *startEpIdx) { +void CkRegisterArrayExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx) { int __idx = CkRegisterChare(s, sizeof(ArrayElemExt), TypeArray); CkRegisterBase(__idx, CkIndex_ArrayElement::__idx); @@ -157,8 +162,10 @@ void CkRegisterArrayExt(const char *s, int numEntryMethods, int *chareIdx, int * CkRegisterEp(s, ArrayElemExt::__AtSyncEntryMethod, 0, __idx, 0); - for (int i=3; i < numEntryMethods; i++) - CkRegisterEp(s, ArrayElemExt::__entryMethod, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); + for (int i=emNamesStart+3; i < emNamesStart+numEntryMethods; i++) + { + CkRegisterEp(emNames[i], ArrayElemExt::__entryMethod, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); + } *chareIdx = __idx; *startEpIdx = epIdxCtor; @@ -184,7 +191,7 @@ int CkRegisterMainChare(int chareIdx, int entryIdx) #if CMK_CHARM4PY -void CkRegisterMainChareExt(const char *s, int numEntryMethods, int *chareIdx, int *startEpIdx) { +void CkRegisterMainChareExt(const char *s, const char **emNames, int emNamesStart, int numEntryMethods, int *chareIdx, int *startEpIdx) { int __idx = CkRegisterChare(s, sizeof(MainchareExt), TypeMainChare); CkRegisterBase(__idx, CkIndex_Chare::__idx); @@ -192,8 +199,10 @@ void CkRegisterMainChareExt(const char *s, int numEntryMethods, int *chareIdx, i CkRegisterMessagePupFn(epIdxCtor, (CkMessagePupFn)CkArgMsg::ckDebugPup); CkRegisterMainChare(__idx, epIdxCtor); - for (int i=1; i < numEntryMethods; i++) - CkRegisterEp(s, MainchareExt::__entryMethod, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); + for (int i=emNamesStart+1; i < emNamesStart+numEntryMethods; i++) + { + CkRegisterEp(emNames[i], MainchareExt::__entryMethod, CkMarshallMsg::__idx, __idx, 0+CK_EP_NOKEEP); + } *chareIdx = __idx; *startEpIdx = epIdxCtor; diff --git a/src/ck-perf/trace-common.C b/src/ck-perf/trace-common.C index a4a310db36..541a14e58a 100644 --- a/src/ck-perf/trace-common.C +++ b/src/ck-perf/trace-common.C @@ -296,8 +296,8 @@ void traceWriteSTS(FILE *stsfp,int nUserEvents) { for(i=0;i<_chareTable.size();i++) fprintf(stsfp, "CHARE %d \"%s\" %d\n", (int)i, _chareTable[i]->name, _chareTable[i]->ndims); for(i=0;i<_entryTable.size();i++) - fprintf(stsfp, "ENTRY CHARE %d \"%s\" %d %d\n", (int)i, _entryTable[i]->name, - (int)_entryTable[i]->chareIdx, (int)_entryTable[i]->msgIdx); + fprintf(stsfp, "ENTRY CHARE %d \"%s\" %d %d\n", (int)i, _entryTable[i]->name, + (int)_entryTable[i]->chareIdx, (int)_entryTable[i]->msgIdx); for(i=0;i<_msgTable.size();i++) fprintf(stsfp, "MESSAGE %d %u\n", (int)i, (int)_msgTable[i]->size); } @@ -487,10 +487,8 @@ static inline void _traceInit(char **argv) // check if trace is turned on/off for this pe CkpvAccess(traceOnPe) = checkTraceOnPe(argv); -#if !CMK_CHARM4PY // defined in moduleInit.C _createTraces(argv); -#endif // Now setup the control point tracing module if desired. It is always compiled/linked in, but is not always enabled // FIXME: make sure it is safe to use argv in SMP version