- added environment variable VT_METRICS_SEP to specify a string which separate the counter names in VT_METRICS
- set configure variable 'inside_openmpi' to "no", if hidden argument '--with-openmpi-inside' not given - added functions 'MPI_Group_range_<incl|excl>' to Fortran MPI wrappers - updated default configure options for NECSX, BlueGene/L+P - repaired tools/opari/doc/lacsi01.pdf - fixed several Coverity warnings This commit was SVN r22476.
Этот коммит содержится в:
родитель
d2031ff2d8
Коммит
34281f0fa2
@ -1,12 +1,15 @@
|
||||
5.8.1openmpi
|
||||
- updated version of internal OTF to 1.6.5openmpi
|
||||
(see extlib/otf/ChangeLog)
|
||||
- added functions 'MPI_Group_range_<incl|excl>' to Fortran MPI wrappers
|
||||
- added environment variable VT_METRICS_SEP to specify a string which separate
|
||||
the counter names in VT_METRICS
|
||||
- fixed build error: do not add objects from the static version of the
|
||||
BFD library to the shared VT libraries, because the BFD objects might
|
||||
be built without position independent code (PIC)
|
||||
|
||||
5.8openmpi
|
||||
- updated version of internal OTF to 1.6.4openmpi
|
||||
- updated version of internal OTF to 1.6.4stingray
|
||||
(see extlib/otf/ChangeLog)
|
||||
- added support for tracing calls to arbitrary third party libraries
|
||||
The new tool 'vtlibwrapgen' can be used to generate a wrapper library.
|
||||
@ -14,6 +17,7 @@
|
||||
filter directives
|
||||
- added support for automatic instrumentation with PGI 9 compiler using
|
||||
its new compiler flag '-Minstrument'
|
||||
- added MPI-parallel trace unifier (vtunify-mpi)
|
||||
- disabled simultaneous support for multiple compiler instrumentation
|
||||
types in one VampirTrace installation
|
||||
(all known compiler instrumentation types for the compiler wrappers
|
||||
|
@ -3,6 +3,7 @@ CXX="blrts_xlC"
|
||||
F77="blrts_xlf90"
|
||||
FC="blrts_xlf90"
|
||||
MPICC="mpixlc"
|
||||
MPICXX="mpixlcxx"
|
||||
CC_FOR_BUILD="xlc_r"
|
||||
CXX_FOR_BUILD="xlC_r"
|
||||
enable_shared="no"
|
||||
|
@ -3,6 +3,7 @@ CXX="bgxlC_r"
|
||||
F77="bgxlf_r"
|
||||
FC="bgxlf95_r"
|
||||
MPICC="mpixlc_r"
|
||||
MPICXX="mpixlcxx_r"
|
||||
CC_FOR_BUILD="xlc_r"
|
||||
CXX_FOR_BUILD="xlC_r"
|
||||
enable_shared="no"
|
||||
|
@ -5,6 +5,7 @@ F77="sxf90"
|
||||
FC="sxf90"
|
||||
CCAS="sxas"
|
||||
MPICC="sxmpicc"
|
||||
MPICXX="sxmpic++"
|
||||
MPIF77="sxmpif90"
|
||||
CC_FOR_BUILD="cc"
|
||||
CXX_FOR_BUILD="c++"
|
||||
|
@ -11,7 +11,7 @@ AC_DEFUN([ACVT_BFD],
|
||||
BFDLIB=
|
||||
|
||||
AC_ARG_WITH(bfd,
|
||||
AC_HELP_STRING([--with-bfd], [use BFD to get symbol information of an executable instrumented with GNU, Intel, or Pathscale compiler, default: yes]),
|
||||
AC_HELP_STRING([--with-bfd], [use BFD to get symbol information of an executable instrumented with GNU, Intel, PGI9, or Pathscale compiler, default: yes]),
|
||||
[AS_IF([test x"$withval" = "xyes"], [force_bfd="yes"], [check_bfd="no"])])
|
||||
|
||||
AC_ARG_WITH(bfd-dir,
|
||||
|
@ -1,8 +1,6 @@
|
||||
# This file lists all calls, which should not be generated
|
||||
# automatically by mk_fortran_wrapper.sh
|
||||
|
||||
MPI_Group_range_excl
|
||||
MPI_Group_range_incl
|
||||
MPI_Init
|
||||
MPI_Initialized
|
||||
MPI_Init_thread
|
||||
|
@ -110,7 +110,7 @@ cat <<End-of-File >$tmp.awk
|
||||
if (type[i-2] == "char*") {
|
||||
strings[stringcnt++] = para[i-2]
|
||||
printf "%s %s", type[i-2], para[i-2]
|
||||
} else if (index(type[i-2], "*") != 0) {
|
||||
} else if (index(type[i-2], "*") != 0 || index(para[i-2], "[") != 0) {
|
||||
printf "%s %s", converttype(type[i-2]), para[i-2]
|
||||
} else {
|
||||
printf "%s* %s", converttype(type[i-2]), para[i-2]
|
||||
@ -155,8 +155,6 @@ cat <<End-of-File >$tmp.awk
|
||||
printf " *ierr = %s(", mpicall
|
||||
for (i=3; i<=NF; i++) {
|
||||
if (i > 3) printf ", "
|
||||
#remove arrays declarations from parameter:
|
||||
gsub("[[].*[]]","",para[i-2])
|
||||
# If the original type already needed a pointer, pass as is,
|
||||
# otherwise dereference the parameter
|
||||
printf "%s", get_converted_name(para[i-2],type[i-2])
|
||||
@ -179,7 +177,7 @@ cat <<End-of-File >$tmp.awk
|
||||
} else {
|
||||
for (i=3; i<=NF; i++) {
|
||||
if (i > 3) printf ", "
|
||||
if (index(type[i-2], "*") != 0)
|
||||
if (index(type[i-2], "*") != 0 || index(para[i-2], "[") != 0)
|
||||
printf "%s %s", converttype(type[i-2]), para[i-2]
|
||||
else
|
||||
printf "%s* %s", converttype(type[i-2]), para[i-2]
|
||||
@ -763,10 +761,13 @@ function get_converted_name(para,type) {
|
||||
if (type == "char*") return para "C"
|
||||
|
||||
pointer=""
|
||||
if (index(type, "*") == 0)
|
||||
if (index(type, "*") == 0 && index(para, "[") == 0)
|
||||
pointer="*"
|
||||
|
||||
#Find out wheter we have to pass address operator "&"
|
||||
#remove arrays declarations from parameter:
|
||||
gsub("[[].*[]]","",para)
|
||||
|
||||
#find out wheter we have to pass address operator "&"
|
||||
address=""
|
||||
if ((index(para,"_CLASS_SINGLE_") != 0) && (index(type,"MPI_Status") == 0) )
|
||||
address="&"
|
||||
|
@ -12,7 +12,9 @@ AM_CONFIG_HEADER(config.h)
|
||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||
|
||||
# Check whether we are inside Open MPI package
|
||||
AC_ARG_WITH(openmpi-inside, [], [inside_openmpi="yes"])
|
||||
inside_openmpi="no"
|
||||
AC_ARG_WITH(openmpi-inside, [],
|
||||
[AS_IF([test x"$withval" != "xno"], [inside_openmpi="yes"])])
|
||||
|
||||
ACVT_CONF_INIT
|
||||
|
||||
|
@ -52,8 +52,7 @@ DIV.navigation { }
|
||||
SPAN.textbf { font-weight: bold }
|
||||
SPAN.arabic { }
|
||||
SPAN.textit { font-style: italic }
|
||||
|
||||
BODY {font-family: sans-serif;}
|
||||
body {font-family: sans-serif;}
|
||||
</STYLE>
|
||||
</HEAD>
|
||||
|
||||
@ -62,7 +61,7 @@ BODY {font-family: sans-serif;}
|
||||
<P>
|
||||
|
||||
<P>
|
||||
<B><BIG CLASS="XHUGE">VampirTrace 5.8 User Manual</BIG></B>
|
||||
<B><BIG CLASS="XHUGE">VampirTrace 5.8.1 User Manual</BIG></B>
|
||||
<BR>
|
||||
<BR>
|
||||
<BR>
|
||||
@ -289,18 +288,18 @@ OpenMP events, and performance counters.
|
||||
<P>
|
||||
After a successful tracing run, VampirTrace writes all collected data to a
|
||||
trace file in the Open Trace Format (OTF)<A NAME="tex2html3"
|
||||
HREF="#foot1148"><SUP>[+]</SUP></A>.
|
||||
HREF="#foot1149"><SUP>[+]</SUP></A>.
|
||||
As a result, the information is available for post-mortem analysis and
|
||||
visualization by various tools.
|
||||
Most notably, VampirTrace provides the input data for the Vampir analysis
|
||||
and visualization tool<A NAME="tex2html5"
|
||||
HREF="#foot1149"><SUP>[+]</SUP></A>.
|
||||
HREF="#foot1150"><SUP>[+]</SUP></A>.
|
||||
|
||||
<P>
|
||||
VampirTrace is included in OpenMPI 1.3 and later versions.
|
||||
If not disabled explicitly, VampirTrace is built automatically when installing
|
||||
OpenMPI<A NAME="tex2html7"
|
||||
HREF="#foot1150"><SUP>[+]</SUP></A>.
|
||||
HREF="#foot1151"><SUP>[+]</SUP></A>.
|
||||
|
||||
<P>
|
||||
Trace files can quickly become very large, especially with automatic instrumentation.
|
||||
@ -1048,7 +1047,7 @@ Binary Instrumentation Using Dyninst
|
||||
The option <TT>-vt:inst dyninst</TT> is used with the compiler wrapper to
|
||||
instrument the application during runtime (binary instrumentation), by using
|
||||
Dyninst<A NAME="tex2html10"
|
||||
HREF="#foot1174"><SUP>[+]</SUP></A>.
|
||||
HREF="#foot1175"><SUP>[+]</SUP></A>.
|
||||
Recompiling is not necessary for this kind of instrumentation,
|
||||
but relinking:
|
||||
|
||||
@ -1310,7 +1309,7 @@ of a VampirTrace instrumented executable:
|
||||
<TD ALIGN="LEFT">1</TD>
|
||||
</TR>
|
||||
<TR><TD ALIGN="LEFT"><TT>VT_MAX_THREADS</TT></TD>
|
||||
<TD ALIGN="LEFT">Maximum number of threads (<SPAN CLASS="MATH"><A NAME="tex2html_wrap_inline2599"
|
||||
<TD ALIGN="LEFT">Maximum number of threads (<SPAN CLASS="MATH"><A NAME="tex2html_wrap_inline2602"
|
||||
HREF="img3.png">[IMAGE png]</A></SPAN>) per process that VampirTrace reserves resources for.</TD>
|
||||
<TD ALIGN="LEFT">65536</TD>
|
||||
</TR>
|
||||
@ -1430,11 +1429,15 @@ of a VampirTrace instrumented executable:
|
||||
</TR>
|
||||
<TR><TD ALIGN="LEFT"><TT>VT_METRICS</TT></TD>
|
||||
<TD ALIGN="LEFT">Specify counter metrics to be recorded with trace events as a
|
||||
colon-separated list of names.
|
||||
colon/VT_METRICS_SEP-separated list of names.
|
||||
<BR>
|
||||
⇒ Section <A HREF="#hw_perf_counters">[*]</A></TD>
|
||||
<TD ALIGN="LEFT">-</TD>
|
||||
</TR>
|
||||
<TR><TD ALIGN="LEFT"><TT>VT_METRICS_SEP</TT></TD>
|
||||
<TD ALIGN="LEFT">Separator string between counter specifications in VT_METRICS.</TD>
|
||||
<TD ALIGN="LEFT">:</TD>
|
||||
</TR>
|
||||
<TR><TD ALIGN="LEFT"><TT>VT_RUSAGE</TT></TD>
|
||||
<TD ALIGN="LEFT">Colon-separated list of resource usage counters which shall be recorded.
|
||||
<BR>
|
||||
@ -1684,7 +1687,7 @@ for the enhanced timer synchronization:
|
||||
|
||||
<UL>
|
||||
<LI>CLAPACK<A NAME="tex2html12"
|
||||
HREF="#foot1184"><SUP>[+]</SUP></A>
|
||||
HREF="#foot1185"><SUP>[+]</SUP></A>
|
||||
</LI>
|
||||
<LI>AMD ACML
|
||||
</LI>
|
||||
@ -2619,7 +2622,7 @@ default: automatically by configure
|
||||
enable support for Dyninst instrumentation,
|
||||
default: enable if found by configure
|
||||
<SPAN CLASS="textbf">Note:</SPAN> Requires Dyninst<A NAME="tex2html17"
|
||||
HREF="#foot1200"><SUP>[+]</SUP></A> version 5.1 or higher!
|
||||
HREF="#foot1201"><SUP>[+]</SUP></A> version 5.1 or higher!
|
||||
|
||||
<P>
|
||||
</DD>
|
||||
@ -4090,39 +4093,39 @@ into the official VampirTrace package.
|
||||
<P>
|
||||
<BR><HR><H4>Footnotes</H4>
|
||||
<DL>
|
||||
<DT><A NAME="foot1148">... (OTF)</A><A
|
||||
<DT><A NAME="foot1149">... (OTF)</A><A
|
||||
HREF="UserManual.html#tex2html3"><SUP>[+]</SUP></A></DT>
|
||||
<DD><TT><A NAME="tex2html4"
|
||||
HREF="http://www.tu-dresden.de/zih/otf">http://www.tu-dresden.de/zih/otf</A></TT>
|
||||
|
||||
</DD>
|
||||
<DT><A NAME="foot1149">... tool </A><A
|
||||
<DT><A NAME="foot1150">... tool </A><A
|
||||
HREF="UserManual.html#tex2html5"><SUP>[+]</SUP></A></DT>
|
||||
<DD><TT><A NAME="tex2html6"
|
||||
HREF="http://www.vampir.eu">http://www.vampir.eu</A></TT>
|
||||
|
||||
</DD>
|
||||
<DT><A NAME="foot1150">...
|
||||
<DT><A NAME="foot1151">...
|
||||
Open MPI </A><A
|
||||
HREF="UserManual.html#tex2html7"><SUP>[+]</SUP></A></DT>
|
||||
<DD><TT><A NAME="tex2html8"
|
||||
HREF="http://www.open-mpi.org/faq/?category=vampirtrace">http://www.open-mpi.org/faq/?category=vampirtrace</A></TT>
|
||||
|
||||
</DD>
|
||||
<DT><A NAME="foot1174">...
|
||||
<DT><A NAME="foot1175">...
|
||||
Dyninst </A><A
|
||||
HREF="UserManual.html#tex2html10"><SUP>[+]</SUP></A></DT>
|
||||
<DD><TT><A NAME="tex2html11"
|
||||
HREF="http://www.dyninst.org">http://www.dyninst.org</A></TT>
|
||||
|
||||
</DD>
|
||||
<DT><A NAME="foot1184">... CLAPACK</A><A
|
||||
<DT><A NAME="foot1185">... CLAPACK</A><A
|
||||
HREF="UserManual.html#tex2html12"><SUP>[+]</SUP></A></DT>
|
||||
<DD><TT><A NAME="tex2html13"
|
||||
HREF="www.netlib.org/clapack">www.netlib.org/clapack</A></TT>
|
||||
|
||||
</DD>
|
||||
<DT><A NAME="foot1200">... Dyninst </A><A
|
||||
<DT><A NAME="foot1201">... Dyninst </A><A
|
||||
HREF="UserManual.html#tex2html17"><SUP>[+]</SUP></A></DT>
|
||||
<DD><TT><A NAME="tex2html18"
|
||||
HREF="http://www.dyninst.org">http://www.dyninst.org</A></TT>
|
||||
|
Двоичные данные
ompi/contrib/vt/vt/doc/UserManual.pdf
Двоичные данные
ompi/contrib/vt/vt/doc/UserManual.pdf
Двоичный файл не отображается.
@ -16,10 +16,11 @@
|
||||
|
||||
/* *** some macros *** ****************************************** */
|
||||
|
||||
#define PARSE_ERROR( buffer ) \
|
||||
OTF_fprintf( stderr, "parse error in %s() %s:%u : %s", \
|
||||
__FUNCTION__, __FILE__, __LINE__, OTF_RBuffer_printRecord( buffer ) );
|
||||
|
||||
#define PARSE_ERROR( buffer ) { \
|
||||
char* record_str = OTF_RBuffer_printRecord( buffer ); \
|
||||
OTF_fprintf( stderr, "parse error in %s() %s:%u : %s", \
|
||||
__FUNCTION__, __FILE__, __LINE__, record_str ); \
|
||||
free( record_str ); }
|
||||
|
||||
/* *** local headers *** **************************************************** */
|
||||
|
||||
@ -1119,7 +1120,7 @@ int OTF_Reader_readDefProcessGroup( OTF_RBuffer* buffer,
|
||||
|
||||
if ( name == NULL ) {
|
||||
|
||||
PARSE_ERROR( buffer );
|
||||
PARSE_ERROR( buffer );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1070,8 +1070,10 @@ int OTF_Reader_finish( OTF_Reader* reader ) {
|
||||
reader->markerHeap= NULL;
|
||||
}
|
||||
|
||||
OTF_MasterControl_close( reader->mc );
|
||||
reader->mc = NULL;
|
||||
if ( NULL != reader->mc ) {
|
||||
OTF_MasterControl_close( reader->mc );
|
||||
reader->mc = NULL;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -23,15 +23,15 @@ static void set_handles_level_3( OTF_HandlerArray *handles,
|
||||
static void set_handles_level_4( OTF_HandlerArray *handles,
|
||||
definitionInfoT *info );
|
||||
|
||||
static void show_info_level_1( definitionInfoT info );
|
||||
static void show_info_level_2( definitionInfoT info );
|
||||
static void show_info_level_3( definitionInfoT info );
|
||||
static void show_info_level_4( definitionInfoT info );
|
||||
static void show_info_level_1( definitionInfoT *info );
|
||||
static void show_info_level_2( definitionInfoT *info );
|
||||
static void show_info_level_3( definitionInfoT *info );
|
||||
static void show_info_level_4( definitionInfoT *info );
|
||||
|
||||
static void free_data_level_1( definitionInfoT info );
|
||||
static void free_data_level_2( definitionInfoT info );
|
||||
static void free_data_level_3( definitionInfoT info );
|
||||
static void free_data_level_4( definitionInfoT info );
|
||||
static void free_data_level_1( definitionInfoT *info );
|
||||
static void free_data_level_2( definitionInfoT *info );
|
||||
static void free_data_level_3( definitionInfoT *info );
|
||||
static void free_data_level_4( definitionInfoT *info );
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
@ -183,12 +183,12 @@ int main(int argc, char **argv)
|
||||
/*printing the results and cleanup*/
|
||||
if( 0 < infoLevel )
|
||||
{
|
||||
show_info_level_1( info );
|
||||
free_data_level_1( info );
|
||||
show_info_level_1( &info );
|
||||
free_data_level_1( &info );
|
||||
if( 1 < infoLevel )
|
||||
{
|
||||
show_info_level_2( info );
|
||||
free_data_level_2( info );
|
||||
show_info_level_2( &info );
|
||||
free_data_level_2( &info );
|
||||
}
|
||||
}
|
||||
checkVal = OTF_HandlerArray_close( handles );
|
||||
@ -260,12 +260,12 @@ int main(int argc, char **argv)
|
||||
otfinfo_assert( checkVal != OTF_READ_ERROR );
|
||||
}
|
||||
/*printing the results and cleanup*/
|
||||
show_info_level_3( info );
|
||||
free_data_level_3( info );
|
||||
show_info_level_3( &info );
|
||||
free_data_level_3( &info );
|
||||
if( 3 < infoLevel )
|
||||
{
|
||||
show_info_level_4( info );
|
||||
free_data_level_4( info );
|
||||
show_info_level_4( &info );
|
||||
free_data_level_4( &info );
|
||||
}
|
||||
checkVal = OTF_HandlerArray_close( handles );
|
||||
otfinfo_assert( checkVal );
|
||||
@ -323,11 +323,11 @@ static void set_handles_level_1( OTF_HandlerArray *handles,
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFINITIONCOMMENT_RECORD );
|
||||
}
|
||||
|
||||
static void show_info_level_1( definitionInfoT info )
|
||||
static void show_info_level_1( definitionInfoT *info )
|
||||
{
|
||||
uint32_t i = 0, index = 0;
|
||||
double resolution = info.timerResolution;
|
||||
double fileSize = info.traceFileSize;
|
||||
double resolution = info->timerResolution;
|
||||
double fileSize = info->traceFileSize;
|
||||
char* unitTimer;
|
||||
char* unitFileSize;
|
||||
|
||||
@ -366,38 +366,38 @@ static void show_info_level_1( definitionInfoT info )
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| general information \n" );
|
||||
printf( "+----------------------+--------------------------------------------------------\n" );
|
||||
printf( "| tracefile name | %s\n", info.filePrefix );
|
||||
printf( "| creator of the trace | %s\n", info.creatorName );
|
||||
printf( "| used OTF version | %i.%i.%i %s\n", info.otfVersionMajor,
|
||||
info.otfVersionMinor, info.otfVersionSub, info.otfVersionString );
|
||||
printf( "| tracefile name | %s\n", info->filePrefix );
|
||||
printf( "| creator of the trace | %s\n", info->creatorName );
|
||||
printf( "| used OTF version | %i.%i.%i %s\n", info->otfVersionMajor,
|
||||
info->otfVersionMinor, info->otfVersionSub, info->otfVersionString );
|
||||
printf( "| event files size | %.2f %s\n", fileSize,unitFileSize );
|
||||
printf( "| process definitions | %llu\n",
|
||||
(unsigned long long)info.counterProcessDefinition );
|
||||
(unsigned long long)info->counterProcessDefinition );
|
||||
printf( "| timer resolution | %.2f %s\n",resolution,unitTimer );
|
||||
printf( "+----------------------+--------------------------------------------------------\n" );
|
||||
index = info.counterDefinitionComment;
|
||||
index = info->counterDefinitionComment;
|
||||
printf( "| definition comments\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < index; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.definitionComments[i] );
|
||||
printf( "| %s\n", info->definitionComments[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
}
|
||||
|
||||
static void free_data_level_1( definitionInfoT info )
|
||||
static void free_data_level_1( definitionInfoT *info )
|
||||
{
|
||||
uint32_t i, index;
|
||||
free( info.creatorName );
|
||||
free( info->creatorName );
|
||||
|
||||
index = info.counterDefinitionComment;
|
||||
index = info->counterDefinitionComment;
|
||||
for( i = 0; i < index; i++ )
|
||||
{
|
||||
free( info.definitionComments[i] );
|
||||
free( info->definitionComments[i] );
|
||||
}
|
||||
free( info.definitionComments );
|
||||
free( info.otfVersionString );
|
||||
free( info->definitionComments );
|
||||
free( info->otfVersionString );
|
||||
}
|
||||
|
||||
static void set_handles_level_2( OTF_HandlerArray *handles, definitionInfoT *info )
|
||||
@ -453,7 +453,7 @@ static void set_handles_level_2( OTF_HandlerArray *handles, definitionInfoT *inf
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFSCLFILE_RECORD );
|
||||
}
|
||||
|
||||
static void show_info_level_2( definitionInfoT info )
|
||||
static void show_info_level_2( definitionInfoT *info )
|
||||
{
|
||||
int index,i;
|
||||
|
||||
@ -464,41 +464,41 @@ static void show_info_level_2( definitionInfoT info )
|
||||
printf( "| trace content\n" );
|
||||
printf( "+----------------------------+--------------------------------------------------\n" );
|
||||
printf( "| function definitions | %llu\n",
|
||||
(unsigned long long)info.counterFunctionDefinition );
|
||||
(unsigned long long)info->counterFunctionDefinition );
|
||||
printf( "| counter definitions | %llu\n",
|
||||
(unsigned long long)info.counterCounterDefinition );
|
||||
(unsigned long long)info->counterCounterDefinition );
|
||||
printf( "| marker definitions | %llu\n",
|
||||
(unsigned long long)info.counterDefinitionMarker );
|
||||
(unsigned long long)info->counterDefinitionMarker );
|
||||
printf( "| |\n" );
|
||||
printf( "| process group definitions | %llu\n",
|
||||
(unsigned long long)info.counterProcessGroupDefinition );
|
||||
(unsigned long long)info->counterProcessGroupDefinition );
|
||||
printf( "| function group definitions | %llu\n",
|
||||
(unsigned long long)info.counterFunctionGroupDefinition );
|
||||
(unsigned long long)info->counterFunctionGroupDefinition );
|
||||
printf( "| counter group definitions | %llu\n",
|
||||
(unsigned long long)info.counterCounterGroupDefinition );
|
||||
(unsigned long long)info->counterCounterGroupDefinition );
|
||||
printf( "+----------------------------+--------------------------------------------------\n" );
|
||||
|
||||
index = info.counterSourceFileName;
|
||||
index = info->counterSourceFileName;
|
||||
printf( "| source file names\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < index; i++)
|
||||
{
|
||||
printf( "| %s\n", info.sourceFileNames[i] );
|
||||
printf( "| %s\n", info->sourceFileNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
}
|
||||
|
||||
static void free_data_level_2( definitionInfoT info )
|
||||
static void free_data_level_2( definitionInfoT *info )
|
||||
{
|
||||
int i, index;
|
||||
|
||||
index = info.counterSourceFileName;
|
||||
index = info->counterSourceFileName;
|
||||
|
||||
for( i = 0; i < index; i++ )
|
||||
{
|
||||
free( (info.sourceFileNames)[i] );
|
||||
free( (info->sourceFileNames)[i] );
|
||||
}
|
||||
free( info.sourceFileNames );
|
||||
free( info->sourceFileNames );
|
||||
}
|
||||
|
||||
static void set_handles_level_3( OTF_HandlerArray *handles,
|
||||
@ -613,7 +613,7 @@ static void set_handles_level_3( OTF_HandlerArray *handles,
|
||||
|
||||
}
|
||||
|
||||
static void show_info_level_3( definitionInfoT info )
|
||||
static void show_info_level_3( definitionInfoT *info )
|
||||
{
|
||||
uint64_t i;
|
||||
|
||||
@ -622,47 +622,47 @@ static void show_info_level_3( definitionInfoT info )
|
||||
printf( "\n##############\n" );
|
||||
printf( "+-----------------------+-------------------------------------------------------\n" );
|
||||
printf( "| enters | %llu\n",
|
||||
(unsigned long long)info.counterEnter );
|
||||
(unsigned long long)info->counterEnter );
|
||||
printf( "| leaves | %llu\n",
|
||||
(unsigned long long)info.counterLeave );
|
||||
(unsigned long long)info->counterLeave );
|
||||
printf( "| sends | %llu\n",
|
||||
(unsigned long long)info.counterSend );
|
||||
(unsigned long long)info->counterSend );
|
||||
printf( "| receives | %llu\n",
|
||||
(unsigned long long)info.counterReceive );
|
||||
(unsigned long long)info->counterReceive );
|
||||
printf( "| RMA Put | %llu\n",
|
||||
(unsigned long long)info.counterRMAPut );
|
||||
(unsigned long long)info->counterRMAPut );
|
||||
printf( "| RMA Put remote end | %llu\n",
|
||||
(unsigned long long)info.counterRMAPutRemoteEnd );
|
||||
(unsigned long long)info->counterRMAPutRemoteEnd );
|
||||
printf( "| RMA Get | %llu\n",
|
||||
(unsigned long long)info.counterRMAGet );
|
||||
(unsigned long long)info->counterRMAGet );
|
||||
printf( "| RMA End | %llu\n",
|
||||
(unsigned long long)info.counterRMAEnd );
|
||||
(unsigned long long)info->counterRMAEnd );
|
||||
printf( "| collective operations | %llu\n",
|
||||
(unsigned long long)info.counterCollectiveOperation );
|
||||
(unsigned long long)info->counterCollectiveOperation );
|
||||
printf( "| file operations | %llu\n",
|
||||
(unsigned long long)info.counterFileOperation );
|
||||
(unsigned long long)info->counterFileOperation );
|
||||
printf( "| snapshots | %llu\n",
|
||||
(unsigned long long)info.counterSnapshot );
|
||||
(unsigned long long)info->counterSnapshot );
|
||||
printf( "+-----------------------+-------------------------------------------------------\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| counters[%llu]\n",
|
||||
(unsigned long long)info.counterCounterDefinition );
|
||||
(unsigned long long)info->counterCounterDefinition );
|
||||
printf( "+---------------+---------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterCounterDefinition; i++ )
|
||||
for( i = 0; i < info->counterCounterDefinition; i++ )
|
||||
{
|
||||
printf( "| name | %s\n", info.counters[i].name );
|
||||
if( ((info.counters[i].properties) & OTF_COUNTER_TYPE_BITS) ==
|
||||
printf( "| name | %s\n", info->counters[i].name );
|
||||
if( ((info->counters[i].properties) & OTF_COUNTER_TYPE_BITS) ==
|
||||
OTF_COUNTER_TYPE_ACC )
|
||||
{
|
||||
uint64_t lastValue =
|
||||
process_get_sum_value( info.counters[i].processMap );
|
||||
process_get_sum_value( info->counters[i].processMap );
|
||||
uint64_t lastTime =
|
||||
process_get_sum_time( info.counters[i].processMap );
|
||||
process_get_sum_time( info->counters[i].processMap );
|
||||
double average =
|
||||
((double)(lastValue)) * ((double)(info.timerResolution)) /
|
||||
((double)(lastValue)) * ((double)(info->timerResolution)) /
|
||||
((double)(lastTime));
|
||||
double highestRate =
|
||||
process_get_highest_rate(info.counters[i].processMap);
|
||||
process_get_highest_rate(info->counters[i].processMap);
|
||||
|
||||
printf( "| last value | %llu\n", (unsigned long long)lastValue );
|
||||
printf( "| average rate | %7.4E per sec\n", average );
|
||||
@ -674,17 +674,17 @@ static void show_info_level_3( definitionInfoT info )
|
||||
printf( "\n" );
|
||||
}
|
||||
|
||||
static void free_data_level_3( definitionInfoT info )
|
||||
static void free_data_level_3( definitionInfoT *info )
|
||||
{
|
||||
uint64_t i;
|
||||
|
||||
for( i = 0; i < info.counterCounterDefinition; i++ )
|
||||
for( i = 0; i < info->counterCounterDefinition; i++ )
|
||||
{
|
||||
free( (info.counters)[i].name );
|
||||
if( NULL != (info.counters)[i].processMap )
|
||||
hash_delete( (info.counters)[i].processMap );
|
||||
free( (info->counters)[i].name );
|
||||
if( NULL != (info->counters)[i].processMap )
|
||||
hash_delete( (info->counters)[i].processMap );
|
||||
}
|
||||
free( info.counters );
|
||||
free( info->counters );
|
||||
}
|
||||
|
||||
static void set_handles_level_4( OTF_HandlerArray *handles,
|
||||
@ -747,7 +747,7 @@ static void set_handles_level_4( OTF_HandlerArray *handles,
|
||||
OTF_HandlerArray_setFirstHandlerArg( handles, info, OTF_DEFCOUNTERGROUP_RECORD );
|
||||
}
|
||||
|
||||
static void show_info_level_4( definitionInfoT info )
|
||||
static void show_info_level_4( definitionInfoT *info )
|
||||
{
|
||||
uint64_t i;
|
||||
|
||||
@ -756,130 +756,130 @@ static void show_info_level_4( definitionInfoT info )
|
||||
printf( "\n##############\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| process definitions[%llu]\n",
|
||||
(unsigned long long)info.counterProcessDefinition );
|
||||
(unsigned long long)info->counterProcessDefinition );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterProcessDefinition; i++ )
|
||||
for( i = 0; i < info->counterProcessDefinition; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.processNames[i] );
|
||||
printf( "| %s\n", info->processNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| function definitions[%llu]\n",
|
||||
(unsigned long long)info.counterFunctionDefinition );
|
||||
(unsigned long long)info->counterFunctionDefinition );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for(i = 0; i < info.counterFunctionDefinition; i++ )
|
||||
for(i = 0; i < info->counterFunctionDefinition; i++ )
|
||||
{
|
||||
printf( "| %s\n",info.functionNames[i] );
|
||||
printf( "| %s\n",info->functionNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| marker definitions[%llu]\n",
|
||||
(unsigned long long)info.counterDefinitionMarker );
|
||||
(unsigned long long)info->counterDefinitionMarker );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterDefinitionMarker; i++ )
|
||||
for( i = 0; i < info->counterDefinitionMarker; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.markerNames[i] );
|
||||
printf( "| %s\n", info->markerNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| collective operation definitions[%llu]\n",
|
||||
(unsigned long long)info.counterCollectiveOperation );
|
||||
(unsigned long long)info->counterCollectiveOperation );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterCollectiveOperation; i++ )
|
||||
for( i = 0; i < info->counterCollectiveOperation; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.collectiveOperationNames[i] );
|
||||
printf( "| %s\n", info->collectiveOperationNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| process group definitions[%llu]\n",
|
||||
(unsigned long long)info.counterProcessGroupDefinition );
|
||||
(unsigned long long)info->counterProcessGroupDefinition );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterProcessGroupDefinition; i++ )
|
||||
for( i = 0; i < info->counterProcessGroupDefinition; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.processGroupNames[i] );
|
||||
printf( "| %s\n", info->processGroupNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| function group definitions[%llu]\n",
|
||||
(unsigned long long)info.counterFunctionGroupDefinition );
|
||||
(unsigned long long)info->counterFunctionGroupDefinition );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterFunctionGroupDefinition; i++ )
|
||||
for( i = 0; i < info->counterFunctionGroupDefinition; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.functionGroupNames[i] );
|
||||
printf( "| %s\n", info->functionGroupNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "\n" );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
printf( "| counter group definitions[%llu]\n",
|
||||
(unsigned long long)info.counterCounterGroupDefinition );
|
||||
(unsigned long long)info->counterCounterGroupDefinition );
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
for( i = 0; i < info.counterCounterGroupDefinition; i++ )
|
||||
for( i = 0; i < info->counterCounterGroupDefinition; i++ )
|
||||
{
|
||||
printf( "| %s\n", info.counterGroupNames[i] );
|
||||
printf( "| %s\n", info->counterGroupNames[i] );
|
||||
}
|
||||
printf( "+-------------------------------------------------------------------------------\n" );
|
||||
}
|
||||
|
||||
static void free_data_level_4( definitionInfoT info )
|
||||
static void free_data_level_4( definitionInfoT *info )
|
||||
{
|
||||
uint64_t i;
|
||||
|
||||
if( info.processNames != NULL )
|
||||
if( info->processNames != NULL )
|
||||
{
|
||||
for( i = 0; i < info.counterProcessDefinition; i++ )
|
||||
for( i = 0; i < info->counterProcessDefinition; i++ )
|
||||
{
|
||||
free( (info.processNames)[i] );
|
||||
free( (info->processNames)[i] );
|
||||
}
|
||||
free( info.processNames );
|
||||
free( info->processNames );
|
||||
}
|
||||
|
||||
if( info.processGroupNames != NULL )
|
||||
if( info->processGroupNames != NULL )
|
||||
{
|
||||
for( i = 0; i < info.counterProcessGroupDefinition; i++ )
|
||||
for( i = 0; i < info->counterProcessGroupDefinition; i++ )
|
||||
{
|
||||
free( (info.processGroupNames)[i] );
|
||||
free( (info->processGroupNames)[i] );
|
||||
}
|
||||
free( info.processGroupNames );
|
||||
free( info->processGroupNames );
|
||||
}
|
||||
|
||||
if( info.functionNames != NULL )
|
||||
if( info->functionNames != NULL )
|
||||
{
|
||||
for( i = 0; i < info.counterFunctionDefinition; i++ )
|
||||
for( i = 0; i < info->counterFunctionDefinition; i++ )
|
||||
{
|
||||
free( (info.functionNames)[i] );
|
||||
free( (info->functionNames)[i] );
|
||||
}
|
||||
free( info.functionNames );
|
||||
free( info->functionNames );
|
||||
}
|
||||
|
||||
if( info.functionGroupNames != NULL )
|
||||
if( info->functionGroupNames != NULL )
|
||||
{
|
||||
for( i = 0; i < info.counterFunctionGroupDefinition; i++ )
|
||||
for( i = 0; i < info->counterFunctionGroupDefinition; i++ )
|
||||
{
|
||||
free( (info.functionGroupNames)[i] );
|
||||
free( (info->functionGroupNames)[i] );
|
||||
}
|
||||
free( info.functionGroupNames );
|
||||
free( info->functionGroupNames );
|
||||
}
|
||||
|
||||
for(i = 0; i < info.counterCollectiveOperation; i++ )
|
||||
for(i = 0; i < info->counterCollectiveOperation; i++ )
|
||||
{
|
||||
free( (info.collectiveOperationNames)[i] );
|
||||
free( (info->collectiveOperationNames)[i] );
|
||||
}
|
||||
free( info.collectiveOperationNames );
|
||||
free( info->collectiveOperationNames );
|
||||
|
||||
for(i = 0; i < info.counterCounterGroupDefinition; i++ )
|
||||
for(i = 0; i < info->counterCounterGroupDefinition; i++ )
|
||||
{
|
||||
free( (info.counterGroupNames)[i] );
|
||||
free( (info->counterGroupNames)[i] );
|
||||
}
|
||||
free( info.counterGroupNames );
|
||||
free( info->counterGroupNames );
|
||||
|
||||
for( i = 0; i < info.counterDefinitionMarker; i++ )
|
||||
for( i = 0; i < info->counterDefinitionMarker; i++ )
|
||||
{
|
||||
free( (info.markerNames)[i] );
|
||||
free( (info->markerNames)[i] );
|
||||
}
|
||||
free( info.markerNames );
|
||||
free( info->markerNames );
|
||||
}
|
||||
|
@ -1643,7 +1643,7 @@ bool Summary_Container::find_CollOp(CollOp_Def_Key coll_def_key)
|
||||
return true;
|
||||
}
|
||||
|
||||
int Summary_Container::mergeContainer(Summary_Container container) {
|
||||
int Summary_Container::mergeContainer(Summary_Container& container) {
|
||||
FunctionMap fmap = container.function_map;
|
||||
FunctionMap::iterator fit;
|
||||
|
||||
|
@ -827,7 +827,7 @@ class Summary_Container
|
||||
int csv_P2P(fstream& out, uint32_t trace);
|
||||
int csv_CollOp(fstream& out, uint32_t trace);
|
||||
int csv_Data(fstream& out, uint32_t trace);
|
||||
int mergeContainer(Summary_Container container);
|
||||
int mergeContainer(Summary_Container& container);
|
||||
|
||||
private:
|
||||
FunctionMap function_map;
|
||||
|
@ -344,7 +344,7 @@ int main( int argc, const char** argv )
|
||||
}
|
||||
}
|
||||
|
||||
data_array = (global_data**) malloc(num_threads * sizeof(global_data));
|
||||
data_array = (global_data**) malloc(num_threads * sizeof(global_data*));
|
||||
cpu2thread = (uint32_t*) malloc(num_cpus * sizeof(uint32_t));
|
||||
|
||||
/* Definitons */
|
||||
@ -472,9 +472,11 @@ int main( int argc, const char** argv )
|
||||
|
||||
uint32_t start = 0;
|
||||
uint32_t end = 0;
|
||||
# ifdef _OPENMP
|
||||
for(int k=0; k<omp_get_thread_num(); k++) {
|
||||
start += threads[k];
|
||||
}
|
||||
# endif
|
||||
end = start + threads[omp_get_thread_num()] - 1;
|
||||
|
||||
for(uint32_t i=0; i<num_cpus; i++) {
|
||||
|
@ -38,6 +38,7 @@ int handleDefProcessGroup (void *userData, uint32_t stream, uint32_t procGroup,
|
||||
|
||||
uint32_t *mod_procs = new uint32_t[numberOfProcs];
|
||||
uint32_t mod_numberOfProcs = 0;
|
||||
int ret;
|
||||
|
||||
for(uint32_t i = 0; i < numberOfProcs; i++) {
|
||||
if ( first->procMap.end() != first->procMap.find(procs[i]) ) {
|
||||
@ -48,12 +49,17 @@ int handleDefProcessGroup (void *userData, uint32_t stream, uint32_t procGroup,
|
||||
}
|
||||
|
||||
if(mod_numberOfProcs < 1) {
|
||||
delete[] mod_procs;
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
return ( 0 == OTF_Writer_writeDefProcessGroup ( (OTF_Writer*) first->writer, stream, procGroup, name,
|
||||
ret = ( 0 == OTF_Writer_writeDefProcessGroup ( (OTF_Writer*) first->writer, stream, procGroup, name,
|
||||
mod_numberOfProcs, mod_procs) ) ? OTF_RETURN_ABORT : OTF_RETURN_OK;
|
||||
|
||||
delete[] mod_procs;
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
int handleDefFunction (void *userData, uint32_t stream, uint32_t func, const char *name, uint32_t funcGroup, uint32_t source) {
|
||||
@ -106,8 +112,11 @@ int handleDefCreator (void *userData, uint32_t stream, const char *creator) {
|
||||
|
||||
int handleDefVersion (void *userData, uint32_t stream, uint8_t major, uint8_t minor, uint8_t sub, const char *string) {
|
||||
|
||||
return ( 0 == OTF_Writer_writeOtfVersion ( (OTF_Writer*) userData, stream) )
|
||||
? OTF_RETURN_ABORT : OTF_RETURN_OK;
|
||||
/* this is deprecated and not necessary at all */
|
||||
/*return ( 0 == OTF_Writer_writeOtfVersion ( (OTF_Writer*) userData, stream) )
|
||||
? OTF_RETURN_ABORT : OTF_RETURN_OK;*/
|
||||
|
||||
return OTF_RETURN_OK;
|
||||
}
|
||||
|
||||
int handleDefFile (void *userData, uint32_t stream, uint32_t token, const char *name, uint32_t group) {
|
||||
|
@ -25,6 +25,9 @@
|
||||
#define RANGE_MODE 1
|
||||
#define TABLE_MODE 2
|
||||
|
||||
#define CLEAR_EVERYTHING free_all_pointers(ch_i, first, entries, writer, reader, \
|
||||
handlers, manager, master, new_master);
|
||||
|
||||
#define HELPTEXT "" \
|
||||
" \n" \
|
||||
" otfshrink - creates a new otf file that only includes \n" \
|
||||
@ -50,10 +53,13 @@ map<int, bool> cpuMap;
|
||||
|
||||
int write_master(string input, string output, bool invers, bool show, int sim_mode);
|
||||
int display_processes(firstarg *first, int sim_mode);
|
||||
void free_all_pointers(char *ch_i, firstarg *first, OTF_MapEntry *entries, OTF_Writer *writer,
|
||||
OTF_Reader *reader, OTF_HandlerArray *handlers, OTF_FileManager *manager,
|
||||
OTF_MasterControl *master, OTF_MasterControl *new_master);
|
||||
|
||||
int main (int argc, char* argv[]) {
|
||||
|
||||
char *pwd = new char[OTF_PATH_MAX];
|
||||
char *pwd = NULL;
|
||||
bool enable = true;
|
||||
bool invers_mode = true;
|
||||
bool mode_set = false;
|
||||
@ -69,12 +75,6 @@ int main (int argc, char* argv[]) {
|
||||
string output_folder;
|
||||
string output_path;
|
||||
|
||||
/* get current working directory */
|
||||
pwd = getcwd(pwd, OTF_PATH_MAX);
|
||||
if ( pwd == NULL) {
|
||||
cerr << "Error: Path length greater than the maximum." << endl;
|
||||
}
|
||||
|
||||
if ( argc <= 1 ) {
|
||||
cout << HELPTEXT << endl;
|
||||
return 0;
|
||||
@ -222,6 +222,16 @@ int main (int argc, char* argv[]) {
|
||||
cerr << "Error: No input file given." << endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* get current working directory */
|
||||
pwd = new char[OTF_PATH_MAX];
|
||||
*pwd = '\0';
|
||||
pwd = getcwd(pwd, OTF_PATH_MAX);
|
||||
if ( pwd == NULL) {
|
||||
cerr << "Error: Path length greater than the maximum." << endl;
|
||||
delete[] pwd;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* make absolute path - necessary to create a symbolic link later on */
|
||||
if (input_path[0] != '/') {
|
||||
@ -288,17 +298,11 @@ int main (int argc, char* argv[]) {
|
||||
}
|
||||
|
||||
/*** end string operations ***/
|
||||
|
||||
|
||||
/* create symbolic links, definiton file and master file */
|
||||
if ( write_master(input_path ,output_path, invers_mode, simulation, sim_mode) ) {
|
||||
return 2;
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
return write_master(input_path ,output_path, invers_mode, simulation, sim_mode);
|
||||
}
|
||||
|
||||
|
||||
int write_master(string input, string output, bool invers, bool show, int sim_mode) {
|
||||
|
||||
/* create symbolic links, definiton file and master file */
|
||||
@ -320,8 +324,9 @@ int write_master(string input, string output, bool invers, bool show, int sim_mo
|
||||
OTF_HandlerArray *handlers = NULL;
|
||||
OTF_FileManager *manager = NULL;
|
||||
OTF_MasterControl *master = NULL;
|
||||
OTF_MasterControl *new_master = NULL;
|
||||
|
||||
manager = OTF_FileManager_open(1);
|
||||
manager = OTF_FileManager_open(2);
|
||||
master = OTF_MasterControl_new(manager);
|
||||
OTF_MasterControl_read(master, input.c_str());
|
||||
|
||||
@ -333,6 +338,7 @@ int write_master(string input, string output, bool invers, bool show, int sim_mo
|
||||
} else {
|
||||
cerr << "Error while reading tracefile. No entries in file found." << endl;
|
||||
}
|
||||
CLEAR_EVERYTHING
|
||||
return 2;
|
||||
}
|
||||
|
||||
@ -354,13 +360,13 @@ int write_master(string input, string output, bool invers, bool show, int sim_mo
|
||||
}
|
||||
}
|
||||
|
||||
/* create new master and symbolic links */
|
||||
master = OTF_MasterControl_new(manager);
|
||||
/* create new empty master and symbolic links */
|
||||
new_master = OTF_MasterControl_new(manager);
|
||||
for(uint32_t i = 0; i < num_args; i++) {
|
||||
append = false;
|
||||
for(uint32_t j = 0; j < entries[i].n; j++) {
|
||||
if(entries[i].values[j] > 0) {
|
||||
OTF_MasterControl_append(master, i+1, entries[i].values[j]);
|
||||
OTF_MasterControl_append(new_master, i+1, entries[i].values[j]);
|
||||
first->procMap[ entries[i].values[j] ] = true;
|
||||
append = true;
|
||||
}
|
||||
@ -372,7 +378,7 @@ int write_master(string input, string output, bool invers, bool show, int sim_mo
|
||||
}
|
||||
|
||||
/* create symbolic links */
|
||||
sprintf(ch_i, "%x", i+1);
|
||||
snprintf(ch_i, MAX_L, "%x", i+1);
|
||||
|
||||
for(int k = 0; k < 4; k++) {
|
||||
|
||||
@ -383,11 +389,13 @@ int write_master(string input, string output, bool invers, bool show, int sim_mo
|
||||
if ( ! access(s_link.c_str(), F_OK) ) {
|
||||
if ( unlink(s_link.c_str()) ) {
|
||||
cerr << "Error while removing symbolic link " << s_link << endl;
|
||||
CLEAR_EVERYTHING
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
if ( symlink( file.c_str(), s_link.c_str() ) ) {
|
||||
cerr << "Error while creating symbolic link " << s_link << endl;
|
||||
CLEAR_EVERYTHING
|
||||
return 2;
|
||||
}
|
||||
} else {
|
||||
@ -398,16 +406,19 @@ int write_master(string input, string output, bool invers, bool show, int sim_mo
|
||||
if ( ! access(s_link.c_str(), F_OK) ) {
|
||||
if ( unlink(s_link.c_str()) ) {
|
||||
cerr << "Error while removing symbolic link " << s_link << endl;
|
||||
CLEAR_EVERYTHING
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
if ( symlink( file.c_str(), s_link.c_str() ) ) {
|
||||
cerr << "Error while creating symbolic link " << s_link << endl;
|
||||
CLEAR_EVERYTHING
|
||||
return 2;
|
||||
}
|
||||
} else {
|
||||
if ( k == 0 ) {
|
||||
cerr << "Error: Could not find " << file << endl;
|
||||
CLEAR_EVERYTHING
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
@ -415,14 +426,20 @@ int write_master(string input, string output, bool invers, bool show, int sim_mo
|
||||
}
|
||||
}
|
||||
|
||||
/* close original master, he is not needed anymore */
|
||||
OTF_MasterControl_close(master);
|
||||
master = NULL;
|
||||
|
||||
if (show) {
|
||||
display_processes(first, sim_mode);
|
||||
CLEAR_EVERYTHING
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* check if there is at least one process to show */
|
||||
if (OTF_MasterControl_getCount(master) < 1) {
|
||||
if (OTF_MasterControl_getCount(new_master) < 1) {
|
||||
cerr << "You exclude all processes! Master not wrote." << endl;
|
||||
CLEAR_EVERYTHING
|
||||
return 2;
|
||||
}
|
||||
|
||||
@ -513,24 +530,17 @@ int write_master(string input, string output, bool invers, bool show, int sim_mo
|
||||
|
||||
read = OTF_Reader_readDefinitions (reader, handlers);
|
||||
if( read == OTF_READ_ERROR ) {
|
||||
fprintf(stderr,"An error occurred while reading the tracefile. It seems to be damaged. Abort.\n");
|
||||
cerr << "An error occurred while reading the tracefile. It seems to be damaged. Abort." << endl;
|
||||
CLEAR_EVERYTHING
|
||||
return 1;
|
||||
}
|
||||
|
||||
OTF_HandlerArray_close(handlers);
|
||||
OTF_Reader_close(reader);
|
||||
OTF_Writer_close(writer);
|
||||
|
||||
/* writes new master file to harddisk */
|
||||
OTF_MasterControl_write(master, output.c_str());
|
||||
|
||||
OTF_MasterControl_close(master);
|
||||
OTF_FileManager_close(manager);
|
||||
/* set the writer's master to the modified master instance */
|
||||
/* closing the writer at the end writes the new master file to harddisk */
|
||||
OTF_Writer_setMasterControl(writer, new_master);
|
||||
|
||||
/* clear everything */
|
||||
delete[] ch_i;
|
||||
delete first;
|
||||
delete[] entries;
|
||||
CLEAR_EVERYTHING
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -595,3 +605,56 @@ int display_processes(firstarg *first, int sim_mode) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void free_all_pointers(char *ch_i, firstarg *first, OTF_MapEntry *entries, OTF_Writer *writer,
|
||||
OTF_Reader *reader, OTF_HandlerArray *handlers, OTF_FileManager *manager,
|
||||
OTF_MasterControl *master, OTF_MasterControl *new_master) {
|
||||
|
||||
if(ch_i != NULL) {
|
||||
delete[] ch_i;
|
||||
ch_i = NULL;
|
||||
}
|
||||
|
||||
if(first != NULL) {
|
||||
delete first;
|
||||
first = NULL;
|
||||
}
|
||||
|
||||
if(entries != NULL) {
|
||||
delete[] entries;
|
||||
entries = NULL;
|
||||
}
|
||||
|
||||
/* new_master is free'd by writer instance */
|
||||
if(writer != NULL) {
|
||||
OTF_Writer_close(writer);
|
||||
writer = NULL;
|
||||
new_master = NULL;
|
||||
}
|
||||
|
||||
if(reader != NULL) {
|
||||
OTF_Reader_close(reader);
|
||||
reader = NULL;
|
||||
}
|
||||
|
||||
|
||||
if(handlers != NULL) {
|
||||
OTF_HandlerArray_close(handlers);
|
||||
handlers = NULL;
|
||||
}
|
||||
|
||||
if(manager != NULL) {
|
||||
OTF_FileManager_close(manager);
|
||||
manager = NULL;
|
||||
}
|
||||
|
||||
if(master != NULL) {
|
||||
OTF_MasterControl_close(master);
|
||||
master = NULL;
|
||||
}
|
||||
|
||||
if(new_master != NULL) {
|
||||
OTF_MasterControl_close(new_master);
|
||||
new_master = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
Двоичные данные
ompi/contrib/vt/vt/tools/opari/doc/lacsi01.pdf
Двоичные данные
ompi/contrib/vt/vt/tools/opari/doc/lacsi01.pdf
Двоичный файл не отображается.
@ -727,7 +727,7 @@ parseCommandLine( int argc, char ** argv )
|
||||
{
|
||||
Params.bequiet = true;
|
||||
Params.showprogress = false;
|
||||
Params.beverbose = false;
|
||||
Params.verbose_level = 0;
|
||||
}
|
||||
else if( strcmp( argv[i], "-v" ) == 0
|
||||
|| strcmp( argv[i], "--verbose" ) == 0 )
|
||||
@ -880,10 +880,6 @@ getMinStartTime()
|
||||
|
||||
// store minimum timestamp
|
||||
g_uMinStartTime = min_start_time;
|
||||
|
||||
#ifdef VT_MPI
|
||||
if( error ) return false;
|
||||
#endif // VT_MPI
|
||||
} // MASTER
|
||||
|
||||
#ifdef VT_MPI
|
||||
@ -927,50 +923,53 @@ cleanUp()
|
||||
}
|
||||
|
||||
if( i != Params.uctl_files_num )
|
||||
return false;
|
||||
return false;
|
||||
|
||||
// remove local def./events/stats/marker trace files
|
||||
//
|
||||
for( i = 0; i < g_vecUnifyCtls.size(); i++ )
|
||||
{
|
||||
for( uint32_t j = 0; j < 4; j++ )
|
||||
{
|
||||
switch( j )
|
||||
{
|
||||
case 0:
|
||||
filetype = OTF_FILETYPE_DEF;
|
||||
break;
|
||||
case 1:
|
||||
filetype = OTF_FILETYPE_EVENT;
|
||||
break;
|
||||
case 2:
|
||||
filetype = OTF_FILETYPE_STATS;
|
||||
case 3:
|
||||
default:
|
||||
filetype = OTF_FILETYPE_MARKER;
|
||||
break;
|
||||
}
|
||||
for( uint32_t j = 0; j < 4; j++ )
|
||||
{
|
||||
bool removed = false;
|
||||
|
||||
OTF_getFilename( Params.in_file_prefix.c_str(),
|
||||
g_vecUnifyCtls[i]->streamid,
|
||||
filetype,
|
||||
STRBUFSIZE, filename1 );
|
||||
|
||||
if( access( filename1, F_OK ) != 0 )
|
||||
{
|
||||
assert( strlen( filename1 ) + 2 + 1 < sizeof( filename1 ) - 1 );
|
||||
switch( j )
|
||||
{
|
||||
case 0:
|
||||
filetype = OTF_FILETYPE_DEF;
|
||||
break;
|
||||
case 1:
|
||||
filetype = OTF_FILETYPE_EVENT;
|
||||
break;
|
||||
case 2:
|
||||
filetype = OTF_FILETYPE_STATS;
|
||||
case 3:
|
||||
default:
|
||||
filetype = OTF_FILETYPE_MARKER;
|
||||
break;
|
||||
}
|
||||
|
||||
// file not found, try '.z' suffix
|
||||
strncat( filename1, ".z", 2 );
|
||||
}
|
||||
OTF_getFilename( Params.in_file_prefix.c_str(),
|
||||
g_vecUnifyCtls[i]->streamid, filetype,
|
||||
STRBUFSIZE, filename1 );
|
||||
|
||||
if( remove( filename1 ) == 0 )
|
||||
VPrint( 2, " Removed %s\n", filename1 );
|
||||
}
|
||||
if( !( removed = ( remove( filename1 ) == 0 ) ) )
|
||||
{
|
||||
OTF_getFilename( Params.in_file_prefix.c_str(),
|
||||
g_vecUnifyCtls[i]->streamid,
|
||||
filetype | OTF_FILECOMPRESSION_COMPRESSED,
|
||||
STRBUFSIZE, filename1 );
|
||||
|
||||
removed = ( remove( filename1 ) == 0 );
|
||||
}
|
||||
|
||||
if( removed )
|
||||
VPrint( 2, " Removed %s\n", filename1 );
|
||||
}
|
||||
}
|
||||
|
||||
if( i != g_vecUnifyCtls.size() )
|
||||
return false;
|
||||
if( i < g_vecUnifyCtls.size() )
|
||||
return false;
|
||||
}
|
||||
|
||||
std::string tmp_out_file_prefix =
|
||||
@ -980,41 +979,41 @@ cleanUp()
|
||||
//
|
||||
for( i = 0; i < 2; i++ )
|
||||
{
|
||||
bool renamed = false;
|
||||
|
||||
if( i == 0 ) filetype = OTF_FILETYPE_DEF;
|
||||
else filetype = OTF_FILETYPE_MARKER;
|
||||
|
||||
OTF_getFilename( tmp_out_file_prefix.c_str(), 0,
|
||||
filetype,
|
||||
STRBUFSIZE, filename1 );
|
||||
OTF_getFilename( Params.out_file_prefix.c_str(), 0,
|
||||
filetype,
|
||||
STRBUFSIZE, filename2 );
|
||||
|
||||
if( access( filename1, F_OK ) != 0 )
|
||||
{
|
||||
assert( strlen( filename1 ) + 2 + 1 < sizeof( filename1 ) - 1 );
|
||||
assert( strlen( filename2 ) + 2 + 1 < sizeof( filename2 ) - 1 );
|
||||
OTF_getFilename( tmp_out_file_prefix.c_str(), 0, filetype,
|
||||
STRBUFSIZE, filename1 );
|
||||
OTF_getFilename( Params.out_file_prefix.c_str(), 0, filetype,
|
||||
STRBUFSIZE, filename2 );
|
||||
|
||||
// file not found, try '.z' suffix
|
||||
strncat( filename1, ".z", 2 );
|
||||
strncat( filename2, ".z", 2 );
|
||||
if( !( renamed = ( rename( filename1, filename2 ) == 0 ) ) )
|
||||
{
|
||||
OTF_getFilename( tmp_out_file_prefix.c_str(), 0,
|
||||
filetype | OTF_FILECOMPRESSION_COMPRESSED,
|
||||
STRBUFSIZE, filename1 );
|
||||
OTF_getFilename( Params.out_file_prefix.c_str(), 0,
|
||||
filetype | OTF_FILECOMPRESSION_COMPRESSED,
|
||||
STRBUFSIZE, filename2 );
|
||||
|
||||
renamed = ( rename( filename1, filename2 ) == 0 );
|
||||
}
|
||||
|
||||
if( rename( filename1, filename2 ) != 0 )
|
||||
{
|
||||
if( i == 0 )
|
||||
{
|
||||
std::cerr << ExeName << ": Error: Could not rename "
|
||||
<< filename1 << " to "
|
||||
<< filename2 << std::endl;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
if( renamed )
|
||||
{
|
||||
VPrint( 2, " Renamed %s to %s\n", filename1, filename2 );
|
||||
}
|
||||
else if( i == 0 )
|
||||
{
|
||||
std::cerr << ExeName << ": Error: Could not rename "
|
||||
<< filename1 << " to "
|
||||
<< filename2 << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if( i < 2 ) return false;
|
||||
|
||||
// rename temporary master control file
|
||||
//
|
||||
@ -1098,7 +1097,7 @@ shareParams()
|
||||
// create MPI datatype for Params_struct
|
||||
//
|
||||
|
||||
char filenames[3][1024];
|
||||
char **filenames;
|
||||
char flags[5];
|
||||
VT_MPI_INT blockcounts[5] = { 3*1024, 1, 1, 1, 5 };
|
||||
VTUnify_MPI_Aint displ[5];
|
||||
@ -1107,7 +1106,12 @@ shareParams()
|
||||
VTUnify_MPI_INT, VTUnify_MPI_CHAR };
|
||||
VTUnify_MPI_Datatype newtype;
|
||||
|
||||
VTUnify_MPI_Address( &filenames, &displ[0] );
|
||||
filenames = new char*[3];
|
||||
filenames[0] = new char[3*1024];
|
||||
filenames[1] = filenames[0] + ( 1024 * sizeof(char) );
|
||||
filenames[2] = filenames[1] + ( 1024 * sizeof(char) );
|
||||
|
||||
VTUnify_MPI_Address( filenames[0], &displ[0] );
|
||||
VTUnify_MPI_Address( &(Params.uctl_files_num), &displ[1] );
|
||||
VTUnify_MPI_Address( &(Params.verbose_level), &displ[2] );
|
||||
VTUnify_MPI_Address( &(Params.stats_sort_flags), &displ[3] );
|
||||
@ -1146,6 +1150,9 @@ shareParams()
|
||||
Params.bequiet = (flags[4] == 1);
|
||||
}
|
||||
|
||||
delete [] filenames[0];
|
||||
delete [] filenames;
|
||||
|
||||
// free MPI datatype
|
||||
VTUnify_MPI_Type_free( &newtype );
|
||||
|
||||
|
@ -72,7 +72,6 @@ struct Params_struct
|
||||
bool showusage;
|
||||
bool showprogress;
|
||||
bool bequiet;
|
||||
bool beverbose;
|
||||
};
|
||||
|
||||
//
|
||||
|
@ -496,9 +496,9 @@ Definitions::createGlobal( const std::vector<DefRec_Base_struct*> *
|
||||
// start-time
|
||||
//
|
||||
tt = (time_t)(g_uMinStartTimeEpoch / 1e6);
|
||||
sprintf( comment, " Start: %s (%"U64STR")",
|
||||
asctime(localtime(&tt)),
|
||||
g_uMinStartTimeEpoch );
|
||||
snprintf( comment, sizeof( comment ) - 1, " Start: %s (%"U64STR")",
|
||||
asctime(localtime(&tt)),
|
||||
g_uMinStartTimeEpoch );
|
||||
p_vecGlobDefs->push_back( new DefRec_DefinitionComment_struct(
|
||||
1,
|
||||
comment ) );
|
||||
@ -506,9 +506,9 @@ Definitions::createGlobal( const std::vector<DefRec_Base_struct*> *
|
||||
// stop-time
|
||||
//
|
||||
tt = (time_t)(g_uMaxStopTimeEpoch / 1e6);
|
||||
sprintf( comment, " Stop: %s (%"U64STR")",
|
||||
asctime(localtime(&tt)),
|
||||
g_uMaxStopTimeEpoch );
|
||||
snprintf( comment, sizeof( comment ) - 1, " Stop: %s (%"U64STR")",
|
||||
asctime(localtime(&tt)),
|
||||
g_uMaxStopTimeEpoch );
|
||||
p_vecGlobDefs->push_back( new DefRec_DefinitionComment_struct(
|
||||
2,
|
||||
comment ) );
|
||||
@ -517,11 +517,12 @@ Definitions::createGlobal( const std::vector<DefRec_Base_struct*> *
|
||||
//
|
||||
tt = (time_t)((g_uMaxStopTimeEpoch - g_uMinStartTimeEpoch) / 1e6);
|
||||
gmtime_r(&tt, &elapsed_tm);
|
||||
sprintf( comment, " Elapsed: %s%d:%s%d:%s%d (%"U64STR")",
|
||||
elapsed_tm.tm_hour < 10 ? "0" : "", elapsed_tm.tm_hour,
|
||||
elapsed_tm.tm_min < 10 ? "0" : "", elapsed_tm.tm_min,
|
||||
elapsed_tm.tm_sec < 10 ? "0" : "", elapsed_tm.tm_sec,
|
||||
(g_uMaxStopTimeEpoch - g_uMinStartTimeEpoch) );
|
||||
snprintf( comment, sizeof( comment ) - 1,
|
||||
" Elapsed: %s%d:%s%d:%s%d (%"U64STR")",
|
||||
elapsed_tm.tm_hour < 10 ? "0" : "", elapsed_tm.tm_hour,
|
||||
elapsed_tm.tm_min < 10 ? "0" : "", elapsed_tm.tm_min,
|
||||
elapsed_tm.tm_sec < 10 ? "0" : "", elapsed_tm.tm_sec,
|
||||
(g_uMaxStopTimeEpoch - g_uMinStartTimeEpoch) );
|
||||
p_vecGlobDefs->push_back( new DefRec_DefinitionComment_struct(
|
||||
3,
|
||||
comment ) );
|
||||
|
@ -264,8 +264,9 @@ Wrapper::readDataFile()
|
||||
case 21: // inst_avail
|
||||
{
|
||||
char cvalue[128];
|
||||
strcpy( cvalue, value.c_str() );
|
||||
|
||||
strncpy( cvalue, value.c_str(), sizeof( cvalue ) - 1 );
|
||||
cvalue[sizeof(cvalue) - 1] = '\0';
|
||||
|
||||
char * token = strtok( cvalue, " " );
|
||||
if( !token )
|
||||
{
|
||||
@ -465,10 +466,12 @@ Wrapper::parseCommandLine( int argc, char ** argv )
|
||||
return false;
|
||||
}
|
||||
|
||||
char * args = new char[strlen(argv[i+1])+1];
|
||||
strcpy( args, argv[++i] );
|
||||
char * token = strtok( args, " " );
|
||||
size_t args_len = strlen(argv[i+1])+1;
|
||||
char * args = new char[args_len];
|
||||
strncpy( args, argv[++i], args_len - 1 );
|
||||
args[args_len - 1] = '\0';
|
||||
|
||||
char * token = strtok( args, " " );
|
||||
do
|
||||
{
|
||||
if( strcmp( token, "-rcfile" ) == 0 )
|
||||
@ -478,7 +481,7 @@ Wrapper::parseCommandLine( int argc, char ** argv )
|
||||
{
|
||||
std::cerr << ExeName << ": <rcfile> expected -- -rcfile"
|
||||
<< std::endl;
|
||||
delete args;
|
||||
delete [] args;
|
||||
return false;
|
||||
}
|
||||
m_pConfig->opari_setRcFile( token );
|
||||
@ -490,7 +493,7 @@ Wrapper::parseCommandLine( int argc, char ** argv )
|
||||
{
|
||||
std::cerr << ExeName << ": <tabfile> expected -- -table"
|
||||
<< std::endl;
|
||||
delete args;
|
||||
delete [] args;
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -502,7 +505,7 @@ Wrapper::parseCommandLine( int argc, char ** argv )
|
||||
}
|
||||
} while( ( token = strtok( 0, " " ) ) );
|
||||
|
||||
delete args;
|
||||
delete [] args;
|
||||
}
|
||||
//
|
||||
// -vt:seq
|
||||
@ -937,31 +940,34 @@ Wrapper::run()
|
||||
//
|
||||
for( i = 0; i < m_pConfig->m_vecOpari_ModObjFiles.size(); i++ )
|
||||
{
|
||||
if( access( m_pConfig->m_vecOpari_ModObjFiles[i].c_str(), F_OK ) == 0 )
|
||||
{
|
||||
int modi = m_pConfig->m_vecOpari_ModObjFiles[i].find( ".mod" );
|
||||
int modi = m_pConfig->m_vecOpari_ModObjFiles[i].find( ".mod" );
|
||||
|
||||
if( modi != -1 )
|
||||
{
|
||||
std::string target = m_pConfig->m_vecOpari_ModObjFiles[i];
|
||||
target.erase( modi, 4 );
|
||||
|
||||
if( beverbose )
|
||||
std::cout << "+++ rename " << m_pConfig->m_vecOpari_ModObjFiles[i]
|
||||
<< " to " << target << std::endl;
|
||||
|
||||
rename( m_pConfig->m_vecOpari_ModObjFiles[i].c_str(),
|
||||
target.c_str() );
|
||||
}
|
||||
}
|
||||
if( modi != -1 )
|
||||
{
|
||||
std::string target = m_pConfig->m_vecOpari_ModObjFiles[i];
|
||||
target.erase( modi, 4 );
|
||||
|
||||
if( beverbose )
|
||||
std::cout << "+++ rename " << m_pConfig->m_vecOpari_ModObjFiles[i]
|
||||
<< " to " << target << std::endl;
|
||||
|
||||
if( rename( m_pConfig->m_vecOpari_ModObjFiles[i].c_str(),
|
||||
target.c_str() ) == -1 )
|
||||
{
|
||||
std::cerr << ExeName << ": could not rename "
|
||||
<< m_pConfig->m_vecOpari_ModObjFiles[i] << " to "
|
||||
<< target << std::endl;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// delete intermediate opari output (in non-verbose mode)
|
||||
//
|
||||
if( !beverbose )
|
||||
{
|
||||
for( i = 0; i < m_pConfig->m_vecOpari_ModSrcFiles.size(); i++ )
|
||||
remove( m_pConfig->m_vecOpari_ModSrcFiles[i].c_str() );
|
||||
for( i = 0; i < m_pConfig->m_vecOpari_ModSrcFiles.size(); i++ )
|
||||
remove( m_pConfig->m_vecOpari_ModSrcFiles[i].c_str() );
|
||||
}
|
||||
}
|
||||
|
||||
@ -1208,7 +1214,7 @@ Wrapper::getIncFilesFromTabFile()
|
||||
//
|
||||
|
||||
Config::Config() :
|
||||
m_eInstType(INST_TYPE_MANUAL), m_iInstAvail(0),
|
||||
m_eLangType(LANG_CC), m_eInstType(INST_TYPE_MANUAL), m_iInstAvail(0),
|
||||
|
||||
m_bBeVerbose(false), m_bCompOnly(false),
|
||||
m_bUsesMpi(false), m_bUsesThreads(false),
|
||||
@ -1228,22 +1234,23 @@ Config::~Config()
|
||||
bool
|
||||
Config::setLanguage( const LangTypeT lang )
|
||||
{
|
||||
#if !(defined(HAVE_F77) && HAVE_F77) || !(defined(HAVE_F90) && HAVE_F90)
|
||||
bool error = false;
|
||||
std::string str_lang;
|
||||
|
||||
if( lang == LANG_F77 )
|
||||
{
|
||||
#if !(defined(HAVE_F77) && HAVE_F77)
|
||||
# if !(defined(HAVE_F77) && HAVE_F77)
|
||||
str_lang = "Fortran 77";
|
||||
error = true;
|
||||
#endif // HAVE_F77
|
||||
# endif // HAVE_F77
|
||||
}
|
||||
else if( lang == LANG_F90 )
|
||||
{
|
||||
#if !(defined(HAVE_F90) && HAVE_F90)
|
||||
# if !(defined(HAVE_F90) && HAVE_F90)
|
||||
str_lang = "Fortran 90";
|
||||
error = true;
|
||||
#endif // HAVE_F90
|
||||
# endif // HAVE_F90
|
||||
}
|
||||
|
||||
if( !error )
|
||||
@ -1253,12 +1260,16 @@ Config::setLanguage( const LangTypeT lang )
|
||||
else
|
||||
{
|
||||
std::cerr << "Unfortunately, this installation of VampirTrace "
|
||||
<< "was not compiled with" << std::endl
|
||||
<< str_lang << " support. As such, the " << ExeName
|
||||
<< " compiler is non-functional." << std::endl;
|
||||
<< "was not compiled with" << std::endl
|
||||
<< str_lang << " support. As such, the " << ExeName
|
||||
<< " compiler is non-functional." << std::endl;
|
||||
}
|
||||
|
||||
return !error;
|
||||
#else // HAVE_F77 || HAVE_F90
|
||||
m_eLangType = lang;
|
||||
return true;
|
||||
#endif // HAVE_F77 || HAVE_F90
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -507,7 +507,8 @@ int vt_env_mode()
|
||||
char* tk;
|
||||
int dc;
|
||||
|
||||
strncpy(tmpbuf, tmp, 128);
|
||||
strncpy(tmpbuf, tmp, 127);
|
||||
tmpbuf[127] = '\0';
|
||||
while( *p ) { *p = tolower(*p); p++; }
|
||||
|
||||
tk = strtok(tmpbuf, ":");
|
||||
@ -570,7 +571,8 @@ int vt_env_stat_props()
|
||||
char* tk;
|
||||
int dc;
|
||||
|
||||
strncpy(tmpbuf, tmp, 128);
|
||||
strncpy(tmpbuf, tmp, 127);
|
||||
tmpbuf[127] = '\0';
|
||||
while( *p ) { *p = tolower(*p); p++; }
|
||||
|
||||
if (strcmp( tmpbuf, "all" ) == 0)
|
||||
@ -626,7 +628,8 @@ int vt_env_stat_msg_dtls()
|
||||
char* tk;
|
||||
int dc;
|
||||
|
||||
strncpy(tmpbuf, tmp, 128);
|
||||
strncpy(tmpbuf, tmp, 127);
|
||||
tmpbuf[127] = '\0';
|
||||
while( *p ) { *p = tolower(*p); p++; }
|
||||
|
||||
tk = strtok(tmpbuf, ":");
|
||||
@ -670,7 +673,8 @@ int vt_env_stat_collop_dtls()
|
||||
char* tk;
|
||||
int dc;
|
||||
|
||||
strncpy(tmpbuf, tmp, 128);
|
||||
strncpy(tmpbuf, tmp, 127);
|
||||
tmpbuf[127] = '\0';
|
||||
while( *p ) { *p = tolower(*p); p++; }
|
||||
|
||||
tk = strtok(tmpbuf, ":");
|
||||
@ -1008,6 +1012,22 @@ char* vt_env_metrics()
|
||||
return metrics;
|
||||
}
|
||||
|
||||
char* vt_env_metrics_sep()
|
||||
{
|
||||
static char* metrics_sep = NULL;
|
||||
|
||||
if (!metrics_sep)
|
||||
{
|
||||
metrics_sep = getenv("VT_METRICS_SEP");
|
||||
if (metrics_sep == NULL || strlen(metrics_sep) == 0)
|
||||
{
|
||||
metrics_sep = ":";
|
||||
}
|
||||
}
|
||||
|
||||
return metrics_sep;
|
||||
}
|
||||
|
||||
/* The file with the metrics specifications can be defined with the
|
||||
VT_METRICS_SPEC environment variable, otherwise it is looked for in
|
||||
the current directory and the VampirTrace installation DATADIR. */
|
||||
|
@ -57,6 +57,7 @@ EXTERN int vt_env_mpicheck_errexit(void);
|
||||
EXTERN char* vt_env_rusage(void);
|
||||
EXTERN int vt_env_rusage_intv(void);
|
||||
EXTERN char* vt_env_metrics(void);
|
||||
EXTERN char* vt_env_metrics_sep(void);
|
||||
EXTERN char* vt_env_metrics_spec(void);
|
||||
EXTERN int vt_env_sync_flush(void);
|
||||
EXTERN int vt_env_sync_flush_level(void);
|
||||
|
@ -77,8 +77,9 @@ static int get_new_trcid()
|
||||
}
|
||||
|
||||
/* read current trace id */
|
||||
if ( read(fd, tmp, 10) == -1 )
|
||||
if ( read(fd, tmp, 9) == -1 )
|
||||
vt_error_msg("Cannot read file %s: %s", trcid_filename, strerror(errno));
|
||||
tmp[9] = '\0';
|
||||
|
||||
if ( tmp[0] == '\0' )
|
||||
new_trcid = 1; /* set trace id to 1, if file is empty */
|
||||
@ -116,8 +117,8 @@ void vt_fork_init()
|
||||
/* create temp. id filename, if necessary */
|
||||
if ( trcid_filename[0] == '\0' )
|
||||
{
|
||||
sprintf(trcid_filename, "%s/%s.%lx.%u.trcid.tmp",
|
||||
vt_env_ldir(), vt_env_fprefix(), vt_pform_node_id(), getpid());
|
||||
snprintf(trcid_filename, sizeof(trcid_filename)-1, "%s/%s.%lx.%u.trcid.tmp",
|
||||
vt_env_ldir(), vt_env_fprefix(), vt_pform_node_id(), getpid());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -284,8 +284,10 @@ void VTLibwrap_func_init(const VTLibwrap* lw, const char* func,
|
||||
|
||||
for( i = 0; i < lw->handlen; i++ )
|
||||
{
|
||||
if( i > 0 ) strcat(dlsym_errors_merged, "\n");
|
||||
strcat(dlsym_errors_merged, dlsym_errors[i]);
|
||||
if( i > 0 )
|
||||
strncat(dlsym_errors_merged, "\n", 255 - strlen(dlsym_errors_merged));
|
||||
strncat(dlsym_errors_merged, dlsym_errors[i],
|
||||
255 - strlen(dlsym_errors_merged));
|
||||
}
|
||||
vt_error_msg("dlsym(\"%s\") failed:\n%s", func, dlsym_errors_merged);
|
||||
}
|
||||
|
@ -66,6 +66,7 @@ static void metricv_add(char* name)
|
||||
int vt_metric_open()
|
||||
{
|
||||
char* env;
|
||||
char* env_sep;
|
||||
char* var;
|
||||
char* token;
|
||||
|
||||
@ -73,6 +74,8 @@ int vt_metric_open()
|
||||
if ( ( env = vt_env_metrics() ) == NULL )
|
||||
return 0;
|
||||
|
||||
env_sep = vt_env_metrics_sep();
|
||||
|
||||
var = strdup(env);
|
||||
vt_cntl_msg(2, "VT_METRICS=%s", var);
|
||||
|
||||
@ -81,11 +84,11 @@ int vt_metric_open()
|
||||
vt_error_msg("cpc_open: %s", strerror(errno));
|
||||
|
||||
/* read metrics from specification string */
|
||||
token = strtok(var, ":");
|
||||
token = strtok(var, env_sep);
|
||||
while ( token && (nmetrics < VT_METRIC_MAXNUM) )
|
||||
{
|
||||
metricv_add( token );
|
||||
token = strtok(NULL, ":");
|
||||
token = strtok(NULL, env_sep);
|
||||
}
|
||||
|
||||
free(var);
|
||||
|
@ -355,6 +355,7 @@ int vt_metric_open()
|
||||
{
|
||||
int i;
|
||||
char* env;
|
||||
char* env_sep;
|
||||
char* var;
|
||||
char* token;
|
||||
const int max_metrics = sizeof (vt_sx_metrics) / sizeof (vt_sx_metrics[0]);
|
||||
@ -364,6 +365,8 @@ int vt_metric_open()
|
||||
if ( env == NULL )
|
||||
return nmetrics;
|
||||
|
||||
env_sep = vt_env_metrics_sep();
|
||||
|
||||
var = strdup(env);
|
||||
vt_cntl_msg(2, "VT_METRICS=%s", var);
|
||||
|
||||
@ -372,7 +375,7 @@ int vt_metric_open()
|
||||
while ( *token ) { *token = tolower(*token); token++; }
|
||||
|
||||
/* read metrics from specification string */
|
||||
token = strtok(var, ":");
|
||||
token = strtok(var, env_sep);
|
||||
if (token && (0 == strcmp (token, "all"))) {
|
||||
vt_cntl_msg(2, "token:%s Adding all metrics", token);
|
||||
for (i = 0; i < max_metrics; i++) {
|
||||
@ -393,7 +396,7 @@ int vt_metric_open()
|
||||
if (i == max_metrics) {
|
||||
vt_error_msg ("Metric <%s> not supported", token);
|
||||
}
|
||||
token = strtok(NULL, ":");
|
||||
token = strtok(NULL, env_sep);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -106,31 +106,27 @@ static metricmap_t* metricmap_append(metricmap_t* map,
|
||||
|
||||
static void metricmap_dump(metricmap_t* map)
|
||||
{
|
||||
unsigned j=0;
|
||||
unsigned i = 0;
|
||||
|
||||
if (map == NULL) {
|
||||
printf("Can't dump empty metricmap!\n");
|
||||
if (map == NULL || vt_env_verbose() < 3)
|
||||
return;
|
||||
}
|
||||
|
||||
printf("Metricmap dump (head=0x%p):\n", (void*)map);
|
||||
vt_cntl_msg(3, "Metricmap dump (head=0x%p):", (void*)map);
|
||||
while (map != NULL) {
|
||||
printf("m[%3u] 0x%X %s = %s\n", j, map->type,
|
||||
map->event_name, map->alias_name);
|
||||
j++;
|
||||
vt_cntl_msg(3, "m[%3u] 0x%X %s = %s", i, map->type,
|
||||
map->event_name, map->alias_name);
|
||||
i++;
|
||||
map = map->next;
|
||||
}
|
||||
printf("Metricmap dumped %u maps\n", j);
|
||||
vt_cntl_msg(3, "Metricmap dumped %u maps", i);
|
||||
}
|
||||
|
||||
static void metricmap_free(metricmap_t* map)
|
||||
{
|
||||
if (map == NULL) {
|
||||
/*printf("Can't free empty metricmap!\n");*/
|
||||
if (map == NULL)
|
||||
return;
|
||||
}
|
||||
|
||||
/*printf("Metricmap free (head=0x%p):\n", map);*/
|
||||
vt_cntl_msg(3, "Metricmap free (head=0x%p):", map);
|
||||
while (map != NULL) {
|
||||
metricmap_t* next = map->next;
|
||||
if (map->event_name != NULL) free(map->event_name);
|
||||
@ -353,6 +349,7 @@ int vt_metric_open()
|
||||
{
|
||||
int retval;
|
||||
char* env;
|
||||
char* env_sep;
|
||||
char* var;
|
||||
char* token;
|
||||
PAPI_event_info_t info;
|
||||
@ -368,9 +365,11 @@ int vt_metric_open()
|
||||
#endif
|
||||
}
|
||||
|
||||
env_sep = vt_env_metrics_sep();
|
||||
|
||||
mapv = vt_metricmap_init(
|
||||
(metmap_t)(METMAP_MEASURE|METMAP_AGGROUP));
|
||||
/*metricmap_dump(mapv);*/
|
||||
metricmap_dump(mapv);
|
||||
|
||||
/* initialize PAPI */
|
||||
retval = PAPI_library_init(PAPI_VER_CURRENT);
|
||||
@ -385,7 +384,7 @@ int vt_metric_open()
|
||||
vt_cntl_msg(2, "VT_METRICS=%s", var);
|
||||
|
||||
/* read metrics from specification string */
|
||||
token = strtok(var, ":");
|
||||
token = strtok(var, env_sep);
|
||||
while ( token && (nmetrics < VT_METRIC_MAXNUM) ) {
|
||||
/* search metricmap for a suitable definition */
|
||||
metricmap_t* map = mapv;
|
||||
@ -447,7 +446,7 @@ int vt_metric_open()
|
||||
metricv_add(component, code);
|
||||
}
|
||||
|
||||
token = strtok(NULL, ":");
|
||||
token = strtok(NULL, env_sep);
|
||||
}
|
||||
|
||||
/*printf("nmetrics=%d\n", nmetrics);*/
|
||||
@ -617,7 +616,9 @@ uint32_t vt_metric_props(int i)
|
||||
return OTF_COUNTER_TYPE_ACC;
|
||||
}
|
||||
|
||||
uint64_t vt_metric_clckrt()
|
||||
#if TIMER == TIMER_PAPI_REAL_CYC
|
||||
|
||||
uint64_t vt_metric_clckrt(void)
|
||||
{
|
||||
const PAPI_hw_info_t* hwinfo = NULL;
|
||||
double hertz;
|
||||
@ -639,12 +640,16 @@ uint64_t vt_metric_clckrt()
|
||||
return (uint64_t)hertz;
|
||||
}
|
||||
|
||||
uint64_t vt_metric_real_cyc()
|
||||
uint64_t vt_metric_real_cyc(void)
|
||||
{
|
||||
return (uint64_t)PAPI_get_real_cyc();
|
||||
}
|
||||
|
||||
uint64_t vt_metric_real_usec()
|
||||
#elif TIMER == TIMER_PAPI_REAL_USEC
|
||||
|
||||
uint64_t vt_metric_real_usec(void)
|
||||
{
|
||||
return (uint64_t)PAPI_get_real_usec();
|
||||
}
|
||||
|
||||
#endif /* TIMER */
|
||||
|
@ -4094,12 +4094,12 @@ VT_MPI_INT MPI_Exscan( void* sendbuf,
|
||||
vt_mpifile_data *fdata = vt_mpifile_get_data(fh); \
|
||||
if (result == MPI_SUCCESS) \
|
||||
{ \
|
||||
VT_MPI_INT sz, count; \
|
||||
VT_MPI_INT sz, cnt; \
|
||||
PMPI_Type_size(fdata->datatype, &sz); \
|
||||
PMPI_Get_count(status, fdata->datatype, &count); \
|
||||
if (count == MPI_UNDEFINED) \
|
||||
count = 0; \
|
||||
vt_ioend(&time, fdata->fid, fdata->split_collective_id, IOOP, (uint64_t)count * (uint64_t)sz); \
|
||||
PMPI_Get_count(status, fdata->datatype, &cnt); \
|
||||
if (cnt == MPI_UNDEFINED) \
|
||||
cnt = 0; \
|
||||
vt_ioend(&time, fdata->fid, fdata->split_collective_id, IOOP, (uint64_t)cnt * (uint64_t)sz); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
@ -4120,12 +4120,12 @@ VT_MPI_INT MPI_Exscan( void* sendbuf,
|
||||
uint32_t fid = vt_mpifile_get_id(fh); \
|
||||
if (result == MPI_SUCCESS) \
|
||||
{ \
|
||||
VT_MPI_INT sz, count; \
|
||||
VT_MPI_INT sz, cnt; \
|
||||
PMPI_Type_size(datatype, &sz); \
|
||||
PMPI_Get_count(status, datatype, &count); \
|
||||
if (count == MPI_UNDEFINED) \
|
||||
count = 0; \
|
||||
vt_ioend(&time, fid, handleid, IOOP, (uint64_t)count * (uint64_t)sz); \
|
||||
PMPI_Get_count(status, datatype, &cnt); \
|
||||
if (cnt == MPI_UNDEFINED) \
|
||||
cnt = 0; \
|
||||
vt_ioend(&time, fid, handleid, IOOP, (uint64_t)cnt * (uint64_t)sz); \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
|
@ -1242,6 +1242,7 @@ void VTGen_delete(VTGen* gen)
|
||||
{
|
||||
char* tmp_namev[5];
|
||||
char* global_name;
|
||||
uint32_t global_name_len;
|
||||
char* suffix;
|
||||
|
||||
char* gdir = vt_env_gdir();
|
||||
@ -1284,18 +1285,19 @@ void VTGen_delete(VTGen* gen)
|
||||
suffix = strchr(tmp_namev[i]+strlen(gen->fileprefix)+1, '.');
|
||||
|
||||
/* build global file name */
|
||||
global_name = (char*)calloc(strlen(gdir) +
|
||||
strlen(fprefix) + 32, sizeof(char));
|
||||
global_name_len = strlen(gdir) + strlen(fprefix) + 32;
|
||||
global_name = (char*)calloc(global_name_len+1, sizeof(char));
|
||||
|
||||
if (vt_my_funique > 0)
|
||||
{
|
||||
sprintf(global_name, "%s/%s_%u.%x%s",
|
||||
gdir, fprefix, vt_my_funique, 65536*gen->tid+(vt_my_trace+1),
|
||||
suffix);
|
||||
snprintf(global_name, global_name_len, "%s/%s_%u.%x%s",
|
||||
gdir, fprefix, vt_my_funique, 65536*gen->tid+(vt_my_trace+1),
|
||||
suffix);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(global_name, "%s/%s.%x%s",
|
||||
gdir, fprefix, 65536*gen->tid+(vt_my_trace+1), suffix);
|
||||
snprintf(global_name, global_name_len, "%s/%s.%x%s",
|
||||
gdir, fprefix, 65536*gen->tid+(vt_my_trace+1), suffix);
|
||||
}
|
||||
|
||||
/* rename file, if possible */
|
||||
|
@ -1283,7 +1283,7 @@ static uint32_t vt_get_unique_file_id()
|
||||
VT_SUSPEND_IO_TRACING();
|
||||
|
||||
/* create filename for unique id file */
|
||||
sprintf(lock_filename, "%s/%s.lock", vt_env_gdir(), vt_env_fprefix());
|
||||
snprintf(lock_filename, sizeof(lock_filename)-1, "%s/%s.lock", vt_env_gdir(), vt_env_fprefix());
|
||||
|
||||
/* open/create unique id file */
|
||||
if( (fd = open(lock_filename, (O_RDWR | O_CREAT),
|
||||
@ -1299,9 +1299,12 @@ static uint32_t vt_get_unique_file_id()
|
||||
}
|
||||
|
||||
/* read current unique id */
|
||||
if( read(fd, tmp, 16) == -1 )
|
||||
if( read(fd, tmp, 15) == -1 )
|
||||
vt_error_msg("Cannot read file %s: %s", lock_filename, strerror(errno));
|
||||
|
||||
/* terminate buffer to avoid issues in upcoming functions */
|
||||
tmp[15] = '\0';
|
||||
|
||||
if( tmp[0] == '\0' )
|
||||
new_fuid = 0; /* set unique id to 0, if file is empty */
|
||||
else
|
||||
@ -1343,16 +1346,19 @@ static void vt_write_def_header()
|
||||
/* VT_MODE */
|
||||
tmp_int32 = vt_env_mode();
|
||||
|
||||
strcpy(tmp_char, "");
|
||||
tmp_char[0] = '\0';
|
||||
if( (tmp_int32 & VT_MODE_TRACE) != 0 )
|
||||
strcpy(tmp_char, "TRACE");
|
||||
{
|
||||
strncpy(tmp_char, "TRACE", sizeof(tmp_char)-1);
|
||||
tmp_char[sizeof(tmp_char)-1] = '\0';
|
||||
}
|
||||
|
||||
if( (tmp_int32 & VT_MODE_STAT) != 0 )
|
||||
{
|
||||
if( strlen(tmp_char) > 0 )
|
||||
strcat(tmp_char, ":");
|
||||
strncat(tmp_char, ":", sizeof(tmp_char)-1-strlen(tmp_char));
|
||||
|
||||
strcat(tmp_char, "STAT");
|
||||
strncat(tmp_char, "STAT", sizeof(tmp_char)-1-strlen(tmp_char));
|
||||
}
|
||||
|
||||
vt_def_comment("__VT_COMMENT__ VT_MODE: %s", tmp_char);
|
||||
@ -1363,16 +1369,16 @@ static void vt_write_def_header()
|
||||
if( tmp_uint64 >= (1024*1024*1024) )
|
||||
{
|
||||
tmp_uint64 /= (1024*1024*1024);
|
||||
sprintf(tmp_char, "%"U64STR"G", tmp_uint64);
|
||||
snprintf(tmp_char, sizeof(tmp_char)-1, "%"U64STR"G", tmp_uint64);
|
||||
}
|
||||
else if( tmp_uint64 >= (1024*1024) )
|
||||
{
|
||||
tmp_uint64 /= (1024*1024);
|
||||
sprintf(tmp_char, "%"U64STR"M", tmp_uint64);
|
||||
snprintf(tmp_char, sizeof(tmp_char)-1, "%"U64STR"M", tmp_uint64);
|
||||
}
|
||||
else
|
||||
{
|
||||
sprintf(tmp_char, "%"U64STR, tmp_uint64);
|
||||
snprintf(tmp_char, sizeof(tmp_char)-1, "%"U64STR, tmp_uint64);
|
||||
}
|
||||
|
||||
vt_def_comment("__VT_COMMENT__ VT_BUFFER_SIZE: %s", tmp_char);
|
||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user