/**************************************************************************** ** TAU Portable Profiling Package ** ** http://www.cs.uoregon.edu/research/tau ** ***************************************************************************** ** Copyright 2010 ** ** Department of Computer and Information Science, University of Oregon ** ** Advanced Computing Laboratory, Los Alamos National Laboratory ** ****************************************************************************/ /**************************************************************************** ** File : ProfileMerge.c ** ** Description : TAU Profiling Package ** ** Contact : tau-bugs@cs.uoregon.edu ** ** Documentation : See http://www.cs.uoregon.edu/research/tau ** ** ** ** Description : Profile merging code ** ** ** ****************************************************************************/ #ifdef TAU_MPI #include #include #include #include #include #include #include #include #include #include #include extern "C" int TAUDECL Tau_RtsLayer_myThread(); #ifdef TAU_EXP_UNIFY void Tau_profileMerge_writeDefinitions(FILE *f) { Tau_unify_object_t *functionUnifier, *atomicUnifier; functionUnifier = Tau_unify_getFunctionUnifier(); atomicUnifier = Tau_unify_getAtomicUnifier(); Tau_util_outputDevice out; out.type = TAU_UTIL_OUTPUT_FILE; out.fp = f; // start of a profile block Tau_util_output (&out, "\n"); Tau_util_output (&out, "\n\n"); for (int i=0; iglobalNumItems; i++) { Tau_util_output (&out, "", i); char *name = functionUnifier->globalStrings[i]; char *group = strstr(name,":GROUP:"); if (group == NULL) { fprintf (stderr, "TAU: Error extracting groups for %s!\n",name); } else { char *target = group; group+=strlen(":GROUP:"); *target=0; } Tau_XML_writeString(&out, name); Tau_util_output (&out, ""); Tau_XML_writeString(&out, group); Tau_util_output (&out, "\n"); } for (int i=0; iglobalNumItems; i++) { Tau_util_output (&out, "", i); Tau_XML_writeString(&out, atomicUnifier->globalStrings[i]); Tau_util_output (&out, "\n"); } Tau_util_output (&out, "\n\n"); Tau_util_output (&out, "\n"); } #endif int Tau_mergeProfiles() { int rank, size, tid, i, buflen; FILE *f; char *buf; MPI_Status status; x_uint64 start, end; const char *profiledir = TauEnv_get_profiledir(); #ifdef TAU_EXP_UNIFY Tau_unify_unifyDefinitions(); Tau_snapshot_writeUnifiedBuffer(); #else Tau_snapshot_writeToBuffer("merge"); #endif tid = Tau_RtsLayer_myThread(); if (tid != 0) { fprintf (stderr, "TAU: Merged file format does not support threads yet!\n"); return 0; } // temp: write regular profiles too, for comparison //TauProfiler_DumpData(false, 0, "profile"); PMPI_Comm_rank(MPI_COMM_WORLD, &rank); PMPI_Comm_size(MPI_COMM_WORLD, &size); buf = Tau_snapshot_getBuffer(); buflen = Tau_snapshot_getBufferLength(); int maxBuflen; MPI_Reduce(&buflen, &maxBuflen, 1, MPI_INT, MPI_MAX, 0, MPI_COMM_WORLD); if (rank == 0) { char *recv_buf = (char *) malloc (maxBuflen); TAU_VERBOSE("TAU: Merging Profiles\n"); start = TauMetrics_getTimeOfDay(); char filename[4096]; sprintf (filename,"%s/tauprofile.xml", profiledir); if ((f = fopen (filename, "w+")) == NULL) { char errormsg[4096]; sprintf(errormsg,"Error: Could not create tauprofile.xml"); perror(errormsg); } #ifdef TAU_EXP_UNIFY Tau_profileMerge_writeDefinitions(f); #endif for (i=1; i