23 #if __TBB_STATISTICS_STDOUT 35 const char* StatGroupTitles[] = {
36 "task objects",
"tasks executed",
"stealing attempts",
"task proxies",
"arena",
"market",
"priority ops",
"prio ops details" 42 const char* StatFieldTitles[] = {
43 "active",
"freed",
"big", NULL,
44 "total",
"w/o spawn", NULL,
45 "succeeded",
"failed",
"conflicts",
"backoffs", NULL,
46 "mailed",
"revoked",
"stolen",
"bypassed",
"ignored", NULL,
47 "switches",
"roundtrips",
"avg.conc",
"avg.allot", NULL,
49 "ar.switch",
"mkt.switch",
"ar.reset",
"ref.fixup",
"avg.ar.pr",
"avg.mkt.pr", NULL,
50 "winnows",
"reloads",
"orphaned",
"winnowed",
"reloaded", NULL
56 class statistics_logger {
58 statistics_logger () {
59 __TBB_ASSERT( sg_end - 1 == 1 << (
sizeof(StatGroupTitles)/
sizeof(*StatGroupTitles) - 1), NULL );
61 my_file = fopen(
"statistics.txt",
"w");
63 perror(
"fopen(\"statistics.txt\"\")");
65 group_start_field[0] = 0;
66 for (
size_t i = 0, j = 0; i < NumGroups; ++i, ++j ) {
67 __TBB_ASSERT( StatFieldTitles[j],
"Empty group occurred" );
68 while ( StatFieldTitles[j] )
70 group_start_field[i + 1] = j - i;
73 "Wrong number of elements in StatFieldTitles" );
74 dump(
"\n%-*s", IDColumnWidth,
"");
75 process_groups( &statistics_logger::print_group_title );
76 dump(
"%-*s", IDColumnWidth,
"ID");
77 process_groups( &statistics_logger::print_field_titles );
80 ~statistics_logger () { fclose(my_file); }
82 void record(
const statistics_counters& c,
size_t id ) {
84 counters_to_dump = &c;
85 #if __TBB_STATISTICS_TOTALS_ONLY 86 if (
id == arena_counters_total ) {
87 dump(
"%-*s", IDColumnWidth,
"Tot" );
88 process_groups( &statistics_logger::print_field_values );
91 const char* idString = NULL;
94 idString =
"M";
break;
95 case workers_counters_total:
96 idString =
"Wtot";
break;
97 case arena_counters_total:
98 idString =
"Tot";
break;
100 dump(
"W%-*u", IDColumnWidth - 1,
id );
103 dump(
"%-*s", IDColumnWidth, idString );
104 process_groups( &statistics_logger::print_field_values );
108 static const size_t IDColumnWidth = 5;
109 static const size_t StatisticsColumnWidth = 10;
110 static const size_t NumGroups =
sizeof(StatGroupTitles)/
sizeof(
char*);
118 size_t group_start_field[NumGroups + 1];
120 const statistics_counters* counters_to_dump;
122 static const size_t NumFields =
sizeof(StatFieldTitles)/
sizeof(*StatFieldTitles) - NumGroups;
123 bool averages_fields[NumFields];
125 void dump (
char const* fmt, ... ) {
128 va_start( args, fmt );
129 vfprintf( my_file, fmt, args );
132 #if __TBB_STATISTICS_STDOUT 133 va_start( args, fmt );
134 vprintf( fmt, args );
139 void process_groups (
void (statistics_logger::*per_group_action)(
size_t group_idx) ) {
140 for (
size_t i = 0, group_flag = 1; i < NumGroups; ++i, group_flag <<= 1 ) {
141 __TBB_ASSERT( group_flag < sg_end,
"StatGroupTitles contents is incompatible with statistics_groups definition" );
142 if ( __TBB_ActiveStatisticsGroups & group_flag )
143 (this->*per_group_action)( i );
148 void print_group_title (
size_t group_idx ) {
149 dump(
"%-*s", (group_start_field[group_idx + 1] - group_start_field[group_idx]) * (StatisticsColumnWidth + 1),
150 StatGroupTitles[group_idx] );
153 void print_field_titles (
size_t group_idx ) {
155 size_t i = group_start_field[group_idx] + group_idx;
156 while ( StatFieldTitles[i] ) {
157 averages_fields[i - group_idx] = strncmp(StatFieldTitles[i],
"avg.", 4) == 0;
158 dump(
"%-*s ", StatisticsColumnWidth, StatFieldTitles[i++] );
162 void print_field_values (
size_t group_idx ) {
163 size_t begin = group_start_field[group_idx],
164 end = group_start_field[group_idx + 1];
165 for (
size_t i =
begin; i <
end; ++i ) {
166 if ( averages_fields[i] )
167 dump(
"%-*.2f ", StatisticsColumnWidth, (
double)counters_to_dump->field(i)/counters_to_dump->tasks_executed );
169 dump(
"%-*ld ", StatisticsColumnWidth, counters_to_dump->field(i) );
174 static statistics_logger the_statistics;
176 void dump_statistics (
const statistics_counters& c,
size_t id ) {
177 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
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 size
#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 * lock