/**************************************************************************** ** TAU Portable Profiling Package ** ** http://www.cs.uoregon.edu/research/tau ** ***************************************************************************** ** Copyright 1997 ** ** Department of Computer and Information Science, University of Oregon ** ** Advanced Computing Laboratory, Los Alamos National Laboratory ** ****************************************************************************/ /*************************************************************************** ** File : TauFAPI.cpp ** ** Description : TAU Profiling Package wrapper for F77/F90 ** ** Contact : tau-team@cs.uoregon.edu ** ** Documentation : See http://www.cs.uoregon.edu/research/tau ** ***************************************************************************/ /* Fortran Wrapper layer for TAU Portable Profiling */ #include #include #include #include #include "Profile/ProfileGroups.h" #include "Profile/TauMemory.h" extern "C" void Tau_pure_start(const char *name); extern "C" void Tau_pure_stop(const char *name); /* Utility function to retrieve fortran strings */ static char *getFortranName(char *name, int slen) { char *fname = (char *) malloc((size_t) slen+1); strncpy(fname, name, slen); fname[slen] = '\0'; return fname; } /* #define DEBUG_PROF */ #define VALID_NAME_CHAR(x) (isprint(x)) extern "C" { void * Tau_get_profiler(char *, char *, TauGroup_t, char *gr_name); void Tau_start_timer(void * timer, int phase, int tid); void Tau_stop_timer(void *, int tid); void Tau_exit(char *); void Tau_init(int, char **); void Tau_enable_group(TauGroup_t group); void Tau_disable_group(TauGroup_t group); void Tau_set_node(int); void Tau_set_context(int); void Tau_register_thread(void); void Tau_enable_instrumentation(void); void Tau_disable_instrumentation(void); void Tau_trace_sendmsg(int type, int destination, int length); void Tau_trace_recvmsg(int type, int source, int length); void * Tau_get_userevent(char *name); void Tau_get_context_userevent(void **ptr, char *name); void Tau_userevent(void *ue, double data); void Tau_context_userevent(void *ue, double data); void Tau_report_statistics(void); void Tau_report_thread_statistics(void); void Tau_dump(void); void Tau_purge(void); void Tau_dump_prefix(char *prefix); void tau_extract_groupinfo(char *& fname, TauGroup_t & gr, char *& gr_name); TauGroup_t Tau_get_profile_group(char * group) ; TauGroup_t Tau_enable_all_groups(void); TauGroup_t Tau_disable_all_groups(void); TauGroup_t Tau_enable_group_name(char *group_name); TauGroup_t Tau_disable_group_name(char *group_name); void Tau_track_memory(void); void Tau_track_memory_here(void); void Tau_enable_tracking_memory(void); void Tau_disable_tracking_memory(void); void Tau_set_interrupt_interval(int value); void Tau_track_memory_headroom(void); void Tau_track_memory_headroom_here(void); void Tau_enable_tracking_memory_headroom(void); void Tau_disable_tracking_memory_headroom(void); void Tau_mark_group_as_phase(void *ptr); void Tau_profile_callstack(void ); void Tau_profile_snapshot(char *name); void Tau_profile_snapshot_1l(char *name, int number); void Tau_metadata(char *name, char *value); void Tau_static_phase_start(char *name); void Tau_static_phase_stop(char *name); void Tau_dynamic_start(char *name, int isPhase); void Tau_dynamic_stop(char *name, int isPhase); char * Tau_append_iteration_to_name(int iteration, char *name); int Tau_get_tid(void); void Tau_profile_param1l(long data, const char *dataname); void Tau_collate_onlineDump(); void Tau_mon_onlineDump(); #define EXTRACT_GROUP(n, l, gr, gr_name) TauGroup_t gr; char *gr_name = NULL; tau_extract_groupinfo(n, gr, gr_name); /***************************************************************************** * The following routines are called by the Fortran program and they in turn * invoke the corresponding C routines. *****************************************************************************/ void tau_profile_timer_group_(void **ptr, char *infname, int *group, int slen) { if (*ptr == 0) { char *fname = getFortranName(infname, slen); #ifdef DEBUG_PROF printf("Inside tau_profile_timer_group_ fname=%s\n", fname); #endif /* DEBUG_PROF */ *ptr = Tau_get_profiler(fname, "", *group, fname); free(fname); } #ifdef DEBUG_PROF printf("get_profiler returns %lx\n", *ptr); #endif /* DEBUG_PROF */ return; } void tau_enable_group_name_local(char *& group_name, int len) { char *name = (char *) malloc(len+1); strncpy(name, group_name, len); name[len]='\0'; Tau_enable_group_name(name); } void tau_disable_group_name_local(char *& group_name, int len) { char *name = (char *) malloc(len+1); strncpy(name, group_name, len); name[len]='\0'; Tau_disable_group_name(name); } void tau_extract_groupinfo(char *& fname, TauGroup_t & gr, char *& gr_name) { /* See if a > appears in the function name. If it does, it separates the group name from the function name. Separate these two */ char *first, *second; first = strtok(fname, ">"); if (first != 0) { second = strtok(NULL, ">"); if (second == NULL) { fname = first; gr = TAU_USER; gr_name = "TAU_DEFAULT"; } else { gr = Tau_get_profile_group(first); gr_name = first; fname = second; } } } void tau_pure_start(char *fname, int flen) { // make a copy so that we can null terminate it char *localname = (char *) malloc((size_t)flen+1); strncpy(localname, fname, flen); localname[flen] = '\0'; // check for unprintable characters for(int i=0; i