90 #define DBG_CCT_MERGE 0 91 #define DBG_PARALLEL_ANALYSIS 0 104 uint8_t** buffer,
size_t* bufferSz);
121 MPI_Bcast(&size_l, 1, MPI_LONG, 0, comm);
149 buf = (uint8_t *)
malloc(size *
sizeof(uint8_t));
153 MPI_Bcast(buf, size, MPI_BYTE, 0, comm);
180 buf = (uint8_t *)
malloc(size *
sizeof(uint8_t));
183 MPI_Bcast(buf, size, MPI_BYTE, 0, comm);
197 int dest,
int myRank, MPI_Comm comm)
199 uint8_t* profileBuf =
NULL;
200 size_t profileBufSz = 0;
202 MPI_Send(profileBuf, (
int)profileBufSz, MPI_BYTE, dest, myRank, comm);
208 int src,
int myRank, MPI_Comm comm)
212 MPI_Probe(src, src, comm, &mpistat);
214 MPI_Get_count(&mpistat, MPI_BYTE, &profileBufSz);
217 uint8_t *profileBuf =
new uint8_t[profileBufSz];
218 MPI_Recv(profileBuf, profileBufSz, MPI_BYTE, src, src, comm, &mpistat);
231 profile->
merge(*new_profile, mergeTy);
248 int dest,
int myRank, MPI_Comm comm)
253 MPI_Send(packedMetrics->
data(), packedMetrics->
dataSize(),
254 MPI_DOUBLE, dest, myRank, comm);
260 int src,
int myRank, MPI_Comm comm)
267 MPI_Recv(packedMetrics->
data(), packedMetrics->
dataSize(),
268 MPI_DOUBLE, src, src, comm, &mpistat);
275 int dest,
int myRank, MPI_Comm comm)
277 uint8_t* stringSetBuf =
NULL;
278 size_t stringSetBufSz = 0;
280 MPI_Send(stringSetBuf, (
int)stringSetBufSz, MPI_BYTE,
287 int src,
int myRank, MPI_Comm comm)
291 MPI_Probe(src, src, comm, &mpistat);
292 int stringSetBufSz = 0;
293 MPI_Get_count(&mpistat, MPI_BYTE, &stringSetBufSz);
296 uint8_t *stringSetBuf =
new uint8_t[stringSetBufSz];
297 MPI_Recv(stringSetBuf, stringSetBufSz, MPI_BYTE,
298 src, src, comm, &mpistat);
301 delete[] stringSetBuf;
302 *stringSet += *new_stringSet;
303 delete new_stringSet;
311 uint8_t** buffer,
size_t* bufferSz)
314 FILE* fs = open_memstream((
char**)buffer, bufferSz);
326 FILE* fs = fmemopen(buffer, bufferSz,
"r");
331 "(ParallelAnalysis::unpackProfile)",
344 uint8_t** buffer,
size_t* bufferSz)
347 FILE* fs = open_memstream((
char**)buffer, bufferSz);
358 FILE* fs = fmemopen(buffer, bufferSz,
"r");
384 DIAG_Assert(packedMetrics.
numMetrics() == mDrvdEnd - mDrvdBeg,
"");
388 for (
uint mId1 = 0, mId2 = mDrvdBeg; mId2 < mDrvdEnd; ++mId1, ++mId2) {
389 packedMetrics.
idx(n->
id(), mId1) = n->
metric(mId2);
406 DIAG_Assert(packedMetrics.
numMetrics() == mEndId - mBegId,
"");
408 for (
uint nodeId = 1; nodeId < packedMetrics.
numNodes(); ++nodeId) {
409 for (
uint mId1 = 0, mId2 = mBegId; mId2 < mEndId; ++mId1, ++mId2) {
static void packStringSet(const StringSet &profile, uint8_t **buffer, size_t *bufferSz)
#define DBG_PARALLEL_ANALYSIS
void MONITOR_EXT_WRAP_NAME() free(void *ptr)
static int fmt_fread(StringSet *&stringSet, FILE *infs)
void mergePerfEventStatistics(Mgr *source)
string toStr(const int x, int base)
static int fmt_fwrite(const StringSet &stringSet, FILE *outfs)
ANode * findNode(uint nodeId) const
double metric(size_t mId) const
static StringSet * unpackStringSet(uint8_t *buffer, size_t bufferSz)
void recvMerge(Prof::CallPath::Profile *profile, int src, int myRank, MPI_Comm comm)
std::string toString(const char *pfx="") const
void unpackMetrics(Prof::CallPath::Profile &profile, const ParallelAnalysis::PackedMetrics &packedMetrics)
static void broadcast_sizet(size_t &size, MPI_Comm comm)
void computeMetricsIncr(const Metric::Mgr &mMgr, uint mBegId, uint mEndId, Metric::AExprIncr::FnTy fn)
uint merge(Profile &y, int mergeTy, uint mrgFlag=0)
void broadcast(Prof::CallPath::Profile *&profile, int myRank, MPI_Comm comm)
static int fmt_fwrite(const Profile &prof, FILE *outfs, uint wFlags)
Prof::CallPath::Profile * unpackProfile(uint8_t *buffer, size_t bufferSz)
const Metric::Mgr * metricMgr() const
const char * DIAG_UnexpectedInput
void packSend(Prof::CallPath::Profile *profile, int dest, int myRank, MPI_Comm comm)
double demandMetric(size_t mId, size_t size=0) const
void *MONITOR_EXT_WRAP_NAME() malloc(size_t bytes)
void packProfile(const Prof::CallPath::Profile &profile, uint8_t **buffer, size_t *bufferSz)
static int fmt_fread(Profile *&prof, FILE *infs, uint rFlags, std::string ctxtStr, const char *filename, FILE *outfs)
double idx(uint idxNodes, uint idxMetrics) const
void packMetrics(const Prof::CallPath::Profile &profile, ParallelAnalysis::PackedMetrics &packedMetrics)
<!-- ********************************************************************--> n<!-- HPCToolkit Experiment DTD --> n<!-- Version 2.1 --> n<!-- ********************************************************************--> n<!ELEMENT HPCToolkitExperiment(Header,(SecCallPathProfile|SecFlatProfile) *)> n<!ATTLIST HPCToolkitExperiment\n version CDATA #REQUIRED > n n<!-- ******************************************************************--> n n<!-- Info/NV:flexible name-value pairs:(n) ame;(t) ype;(v) alue --> n<!ELEMENT Info(NV *)> n<!ATTLIST Info\n n CDATA #IMPLIED > n<!ELEMENT NV EMPTY > n<!ATTLIST NV\n n CDATA #REQUIRED\n t CDATA #IMPLIED\n v CDATA #REQUIRED > n n<!-- ******************************************************************--> n<!-- Header --> n<!-- ******************************************************************--> n<!ELEMENT Header(Info *)> n<!ATTLIST Header\n n CDATA #REQUIRED > n n<!-- ******************************************************************--> n<!-- Section Header --> n<!-- ******************************************************************--> n<!ELEMENT SecHeader(MetricTable?, MetricDBTable?, TraceDBTable?, LoadModuleTable?, FileTable?, ProcedureTable?, Info *)> n n<!-- MetricTable:--> n<!ELEMENT MetricTable(Metric) * > n n<!-- Metric:(i) d;(n) ame --> n<!--(v) alue-type:transient type of values --> n<!--(t) ype:persistent type of metric --> n<!-- fmt:format;show;--> n<!ELEMENT Metric(MetricFormula *, Info?)> n<!ATTLIST Metric\n i CDATA #REQUIRED\n n CDATA #REQUIRED\n es CDATA #IMPLIED\n em CDATA #IMPLIED\n ep CDATA #IMPLIED\n v(raw|final|derived-incr|derived) \"raw\\ t (inclusive|exclusive|nil) \nil\\ partner CDATA #IMPLIED\ fmt CDATA #IMPLIED\ show (1|0) \1\\ show-percent (1|0) \1> n n<!-- MetricFormula represents derived metrics: (t)ype; (frm): formula --> n<!ELEMENT MetricFormula (Info?)> n<!ATTLIST MetricFormula\ t (combine|finalize) \finalize\\ i CDATA #IMPLIED\ frm CDATA #REQUIRED> n n<!-- Metric data, used in sections: (n)ame [from Metric]; (v)alue --> n<!ELEMENT M EMPTY> n<!ATTLIST M\ n CDATA #REQUIRED\ v CDATA #REQUIRED> n n<!-- MetricDBTable: --> n<!ELEMENT MetricDBTable (MetricDB)*> n n<!-- MetricDB: (i)d; (n)ame --> n<!-- (t)ype: persistent type of metric --> n<!-- db-glob: file glob describing files in metric db --> n<!-- db-id: id within metric db --> n<!-- db-num-metrics: number of metrics in db --> n<!-- db-header-sz: size (in bytes) of a db file header --> n<!ELEMENT MetricDB EMPTY> n<!ATTLIST MetricDB\ i CDATA #REQUIRED\ n CDATA #REQUIRED\ t (inclusive|exclusive|nil) \nil\\ partner CDATA #IMPLIED\ db-glob CDATA #IMPLIED\ db-id CDATA #IMPLIED\ db-num-metrics CDATA #IMPLIED\ db-header-sz CDATA #IMPLIED> n n<!-- TraceDBTable: --> n<!ELEMENT TraceDBTable (TraceDB)> n n<!-- TraceDB: (i)d --> n<!-- db-min-time: min beginning time stamp (global) --> n<!-- db-max-time: max ending time stamp (global) --> n<!ELEMENT TraceDB EMPTY> n<!ATTLIST TraceDB\ i CDATA #REQUIRED\ db-glob CDATA #IMPLIED\ db-min-time CDATA #IMPLIED\ db-max-time CDATA #IMPLIED\ db-header-sz CDATA #IMPLIED> n n<!-- LoadModuleTable assigns a short name to a load module --> n<!ELEMENT LoadModuleTable (LoadModule)*> n n<!ELEMENT LoadModule (Info?)> n<!ATTLIST LoadModule\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!-- FileTable assigns a short name to a file --> n<!ELEMENT FileTable (File)*> n n<!ELEMENT File (Info?)> n<!ATTLIST File\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!-- ProcedureTable assigns a short name to a procedure --> n<!ELEMENT ProcedureTable (Procedure)*> n n<!-- Info/NV: flexible name-value pairs: (n)ame; (t)ype; (v)alue --> n<!-- f: family of the procedure (fake, root, ...)--> n<!ELEMENT Procedure (Info?)> n<!ATTLIST Procedure\ i CDATA #REQUIRED\ n CDATA #REQUIRED\ f CDATA #IMPLIED> n n<!-- ****************************************************************** --> n<!-- Section: Call path profile --> n<!-- ****************************************************************** --> n<!ELEMENT SecCallPathProfile (SecHeader, SecCallPathProfileData)> n<!ATTLIST SecCallPathProfile\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!ELEMENT SecCallPathProfileData (PF|M)*> n<!-- Procedure frame --> n<!-- (i)d: unique identifier for cross referencing --> n<!-- (s)tatic scope id --> n<!-- (n)ame: a string or an id in ProcedureTable --> n<!-- (lm) load module: a string or an id in LoadModuleTable --> n<!-- (f)ile name: a string or an id in LoadModuleTable --> n<!-- (l)ine range: \beg-end\ (inclusive range) --> n<!-- (a)lien: whether frame is alien to enclosing P --> n<!-- (str)uct: hpcstruct node id --> n<!-- (t)ype: hpcrun node type: memory access, variable declaration, ... --> n<!-- (v)ma-range-set: \{[beg-end), [beg-end)...}\ --> n<!ELEMENT PF (PF|Pr|L|C|S|M)*> n<!ATTLIST PF\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ n CDATA #REQUIRED\ lm CDATA #IMPLIED\ f CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Procedure (static): GOAL: replace with 'P' --> n<!ELEMENT Pr (Pr|L|C|S|M)*> n<!ATTLIST Pr\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ n CDATA #REQUIRED\ lm CDATA #IMPLIED\ f CDATA #IMPLIED\ l CDATA #IMPLIED\ a (1|0) \0\\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Callsite (a special StatementRange) --> n<!ELEMENT C (PF|M)*> n<!ATTLIST C\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n n<!-- ****************************************************************** --> n<!-- Section: Flat profile --> n<!-- ****************************************************************** --> n<!ELEMENT SecFlatProfile (SecHeader, SecFlatProfileData)> n<!ATTLIST SecFlatProfile\ i CDATA #REQUIRED\ n CDATA #REQUIRED> n n<!ELEMENT SecFlatProfileData (LM|M)*> n<!-- Load module: (i)d; (n)ame; (v)ma-range-set --> n<!ELEMENT LM (F|P|M)*> n<!ATTLIST LM\ i CDATA #IMPLIED\ n CDATA #REQUIRED\ v CDATA #IMPLIED> n<!-- File --> n<!ELEMENT F (P|L|S|M)*> n<!ATTLIST F\ i CDATA #IMPLIED\ n CDATA #REQUIRED> n<!-- Procedure (Note 1) --> n<!ELEMENT P (P|A|L|S|C|M)*> n<!ATTLIST P\ i CDATA #IMPLIED\ n CDATA #REQUIRED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Alien (Note 1) --> n<!ELEMENT A (A|L|S|C|M)*> n<!ATTLIST A\ i CDATA #IMPLIED\ f CDATA #IMPLIED\ n CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Loop (Note 1,2) --> n<!ELEMENT L (A|Pr|L|S|C|M)*> n<!ATTLIST L\ i CDATA #IMPLIED\ s CDATA #IMPLIED\ l CDATA #IMPLIED\ f CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Statement (Note 2) --> n<!-- (it): trace record identifier --> n<!ELEMENT S (S|M)*> n<!ATTLIST S\ i CDATA #IMPLIED\ it CDATA #IMPLIED\ s CDATA #IMPLIED\ l CDATA #IMPLIED\ str CDATA #IMPLIED\ v CDATA #IMPLIED> n<!-- Note 1: Contained Cs may not contain PFs --> n<!-- Note 2: The 's' attribute is not used for flat profiles --> n
virtual NonUniformDegreeTreeNode * Current() const