Fix large overhead with itt notifications on region/barrier name composing

Currently, there is a big overhead in reporting of loop metadata through
ittnotify.  The pair of functions: __kmp_str_loc_init/__kmp_str_loc_free are
replaced with strchr/atoi calls.  Thus, a lot of time consuming actions are
skipped - many memory allocations/deallocations, heavy string duplication, etc.
The loop metadata only needs line and column info from the source string, so no
allocations and string splitting actually needed.

Patch by Andrey Churbanov

Differential Revision: http://reviews.llvm.org/D21309

llvm-svn: 272698
This commit is contained in:
Jonathan Peyton 2016-06-14 19:27:22 +00:00
parent e85ba3f58f
commit 614bb6618e
1 changed files with 19 additions and 5 deletions

View File

@ -348,17 +348,31 @@ __kmp_itt_metadata_loop( ident_t * loc, kmp_uint64 sched_type, kmp_uint64 iterat
}
__itt_string_handle * string_handle = __itt_string_handle_create( "omp_metadata_loop");
kmp_str_loc_t str_loc = __kmp_str_loc_init( loc->psource, 1 );
// Parse line and column from psource string: ";file;func;line;col;;"
char * s_line;
char * s_col;
KMP_DEBUG_ASSERT(loc->psource);
#ifdef __cplusplus
s_line = strchr((char*)loc->psource, ';');
#else
s_line = strchr(loc->psource, ';');
#endif
KMP_DEBUG_ASSERT(s_line);
s_line = strchr(s_line + 1, ';'); // 2-nd semicolon
KMP_DEBUG_ASSERT(s_line);
s_line = strchr(s_line + 1, ';'); // 3-rd semicolon
KMP_DEBUG_ASSERT(s_line);
s_col = strchr(s_line + 1, ';'); // 4-th semicolon
KMP_DEBUG_ASSERT(s_col);
kmp_uint64 loop_data[ 5 ];
loop_data[ 0 ] = str_loc.line;
loop_data[ 1 ] = str_loc.col;
loop_data[ 0 ] = atoi(s_line + 1); // read line
loop_data[ 1 ] = atoi(s_col + 1); // read column
loop_data[ 2 ] = sched_type;
loop_data[ 3 ] = iterations;
loop_data[ 4 ] = chunk;
__kmp_str_loc_free( &str_loc );
__itt_metadata_add(metadata_domain, __itt_null, string_handle, __itt_metadata_u64, 5, loop_data);
#endif
} // __kmp_itt_metadata_loop