27 #if __TBB_STATISTICS_STDOUT 39 const char* StatGroupTitles[] = {
40 "task objects",
"tasks executed",
"stealing attempts",
"task proxies",
"arena",
"market",
"priority ops",
"prio ops details" 46 const char* StatFieldTitles[] = {
47 "active",
"freed",
"big", NULL,
48 "total",
"w/o spawn", NULL,
49 "succeeded",
"failed",
"conflicts",
"backoffs", NULL,
50 "mailed",
"revoked",
"stolen",
"bypassed",
"ignored", NULL,
51 "switches",
"roundtrips",
"avg.conc",
"avg.allot", NULL,
53 "ar.switch",
"mkt.switch",
"ar.reset",
"ref.fixup",
"avg.ar.pr",
"avg.mkt.pr", NULL,
54 "winnows",
"reloads",
"orphaned",
"winnowed",
"reloaded", NULL
60 class statistics_logger {
62 statistics_logger () {
63 __TBB_ASSERT( sg_end - 1 == 1 << (
sizeof(StatGroupTitles)/
sizeof(*StatGroupTitles) - 1), NULL );
65 my_file = fopen(
"statistics.txt",
"w");
67 perror(
"fopen(\"statistics.txt\"\")");
69 group_start_field[0] = 0;
70 for (
size_t i = 0, j = 0; i < NumGroups; ++i, ++j ) {
71 __TBB_ASSERT( StatFieldTitles[j],
"Empty group occurred" );
72 while ( StatFieldTitles[j] )
74 group_start_field[i + 1] = j - i;
77 "Wrong number of elements in StatFieldTitles" );
78 dump(
"\n%-*s", IDColumnWidth,
"");
79 process_groups( &statistics_logger::print_group_title );
80 dump(
"%-*s", IDColumnWidth,
"ID");
81 process_groups( &statistics_logger::print_field_titles );
84 ~statistics_logger () { fclose(my_file); }
86 void record(
const statistics_counters& c,
size_t id ) {
88 counters_to_dump = &c;
89 #if __TBB_STATISTICS_TOTALS_ONLY 90 if (
id == arena_counters_total ) {
91 dump(
"%-*s", IDColumnWidth,
"Tot" );
92 process_groups( &statistics_logger::print_field_values );
95 const char* idString = NULL;
98 idString =
"M";
break;
99 case workers_counters_total:
100 idString =
"Wtot";
break;
101 case arena_counters_total:
102 idString =
"Tot";
break;
104 dump(
"W%-*u", IDColumnWidth - 1,
id );
107 dump(
"%-*s", IDColumnWidth, idString );
108 process_groups( &statistics_logger::print_field_values );
112 static const size_t IDColumnWidth = 5;
113 static const size_t StatisticsColumnWidth = 10;
114 static const size_t NumGroups =
sizeof(StatGroupTitles)/
sizeof(
char*);
122 size_t group_start_field[NumGroups + 1];
124 const statistics_counters* counters_to_dump;
126 static const size_t NumFields =
sizeof(StatFieldTitles)/
sizeof(*StatFieldTitles) - NumGroups;
127 bool averages_fields[NumFields];
129 void dump (
char const* fmt, ... ) {
132 va_start( args, fmt );
133 vfprintf( my_file, fmt, args );
136 #if __TBB_STATISTICS_STDOUT 137 va_start( args, fmt );
138 vprintf( fmt, args );
143 void process_groups (
void (statistics_logger::*per_group_action)(
size_t group_idx) ) {
144 for (
size_t i = 0, group_flag = 1; i < NumGroups; ++i, group_flag <<= 1 ) {
145 __TBB_ASSERT( group_flag < sg_end,
"StatGroupTitles contents is incompatible with statistics_groups definition" );
146 if ( __TBB_ActiveStatisticsGroups & group_flag )
147 (this->*per_group_action)( i );
152 void print_group_title (
size_t group_idx ) {
153 dump(
"%-*s", (group_start_field[group_idx + 1] - group_start_field[group_idx]) * (StatisticsColumnWidth + 1),
154 StatGroupTitles[group_idx] );
157 void print_field_titles (
size_t group_idx ) {
159 size_t i = group_start_field[group_idx] + group_idx;
160 while ( StatFieldTitles[i] ) {
161 averages_fields[i - group_idx] = strncmp(StatFieldTitles[i],
"avg.", 4) == 0;
162 dump(
"%-*s ", StatisticsColumnWidth, StatFieldTitles[i++] );
166 void print_field_values (
size_t group_idx ) {
167 size_t begin = group_start_field[group_idx],
168 end = group_start_field[group_idx + 1];
169 for (
size_t i =
begin; i <
end; ++i ) {
170 if ( averages_fields[i] )
171 dump(
"%-*.2f ", StatisticsColumnWidth, (
double)counters_to_dump->field(i)/counters_to_dump->tasks_executed );
173 dump(
"%-*ld ", StatisticsColumnWidth, counters_to_dump->field(i) );
178 static statistics_logger the_statistics;
180 void dump_statistics (
const statistics_counters& c,
size_t id ) {
181 the_statistics.record(c,
id);
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp end
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp begin
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void * lock
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t size