1,5 → 1,7 |
#include <stdio.h> |
#include <stdlib.h> |
#include <math.h> |
#include <unistd.h> |
|
#define MAXCONTEXT 100 |
#define MAXJOB 100000 |
12,6 → 14,8 |
#define PERIODICAL 1 |
#define INTERRUPT 2 |
|
#define DRAW_NUM 1000 |
|
struct ctx_exec { |
int ctx; |
unsigned long long dtsc; |
43,7 → 47,43 |
|
unsigned long long log_start_tsc = 0; |
unsigned long long log_end_tsc = 0; |
unsigned long long total_dtsc = 0; |
|
int draw_data[DRAW_NUM]; |
|
int gnuplot_clear() { |
|
int i; |
|
for (i=0;i<DRAW_NUM;i++) |
draw_data[i] = 0; |
|
return 0; |
|
} |
|
int gnuplot_draw(unsigned long long max_limit) { |
|
FILE *gnuplot_data, *gnuplot_command; |
int i; |
|
gnuplot_data = fopen("/tmp/pwcet_tmp","w"); |
gnuplot_command = popen("gnuplot","w"); |
fprintf(gnuplot_command,"plot \"%s\" using 1:2 with lines\n","/tmp/pwcet_tmp"); |
fflush(gnuplot_command); |
|
for (i=0;i<DRAW_NUM;i++) |
fprintf(gnuplot_data,"%f\t%f\n",(double)i * (double)max_limit / (double)DRAW_NUM,(float)draw_data[i]); |
|
fclose(gnuplot_data); |
|
getchar(); |
fclose(gnuplot_command); |
|
return 0; |
|
} |
|
int create_lists(char *filename) { |
|
FILE *input_file; |
301,10 → 341,11 |
|
int elaborate_statistics(int num, int task_type) { |
|
int i,k; |
int i,k,h; |
char pidstr[10]; |
unsigned long long temp_tsc,max_tsc; |
unsigned long long last_start, delta_start; |
unsigned long long temp_tsc,max_tsc,min_tsc; |
unsigned long long last_start, delta_start, first_exec; |
unsigned long long max_limit; |
|
switch (context_list[num].pid) { |
case PID_NO_DEF: |
324,15 → 365,22 |
|
temp_tsc = 0; |
max_tsc = 0; |
min_tsc = 0xFFFFFFFF; |
first_exec = 0; |
k = 0; |
for (i=0;i<exec_total;i++) |
if (exec_list[i].ctx == context_list[num].ctx) { |
if (first_exec == 0) first_exec = exec_list[i].start - log_start_tsc; |
if (exec_list[i].dtsc > max_tsc) max_tsc = exec_list[i].dtsc; |
if (exec_list[i].dtsc < min_tsc) min_tsc = exec_list[i].dtsc; |
temp_tsc += exec_list[i].dtsc; |
k++; |
} |
printf(" Total Execution dTSC [%12llu] us [%12llu]\n",temp_tsc,temp_tsc*1000/clk_per_msec); |
printf(" Mean CPU Bandwidth [%11f%c]\n",(double)(temp_tsc)/(double)(total_dtsc)*100.0,'%'); |
printf(" after first exec [%11f%c]\n",(double)(temp_tsc)/(double)(total_dtsc-first_exec)*100.0,'%'); |
printf(" Execs Number [%12d]\n",k); |
printf(" Min Exec dTSC [%12llu] us [%12llu]\n",min_tsc, min_tsc*1000/clk_per_msec); |
printf(" Mean Exec dTSC [%12llu] us [%12llu]\n",temp_tsc / k, temp_tsc / k*1000/clk_per_msec); |
printf(" Max Exec dTSC [%12llu] us [%12llu]\n\n",max_tsc, max_tsc*1000/clk_per_msec); |
|
344,21 → 392,42 |
|
temp_tsc = 0; |
max_tsc = 0; |
min_tsc = 0xFFFFFFFF; |
first_exec = 0; |
k = 0; |
for (i=0;i<exec_total;i++) |
if (exec_list[i].ctx == context_list[num].ctx) { |
if (first_exec == 0) first_exec = exec_list[i].start - log_start_tsc; |
if (exec_list[i].dtsc > max_tsc) max_tsc = exec_list[i].dtsc; |
if (exec_list[i].dtsc < min_tsc) min_tsc = exec_list[i].dtsc; |
temp_tsc += exec_list[i].dtsc; |
k++; |
} |
|
gnuplot_clear(); |
|
max_limit = max_tsc*1000/clk_per_msec; |
|
printf(" Total Execution dTSC [%12llu] us [%12llu]\n",temp_tsc,temp_tsc*1000/clk_per_msec); |
printf(" Mean CPU Bandwidth [%11f%c]\n",(double)(temp_tsc)/(double)(total_dtsc)*100.0,'%'); |
printf(" after first int [%11f%c]\n",(double)(temp_tsc)/(double)(total_dtsc-first_exec)*100.0,'%'); |
printf(" Interrupts Number [%12d]\n",k); |
printf(" Min Interrupt dTSC [%12llu] us [%12llu]\n",min_tsc,min_tsc*1000/clk_per_msec); |
printf(" Mean Interrupt dTSC [%12llu] us [%12llu]\n",temp_tsc / k,temp_tsc / k*1000/clk_per_msec); |
printf(" Max Interrupt dTSC [%12llu] us [%12llu]\n\n",max_tsc,max_tsc*1000/clk_per_msec); |
|
for (i=0;i<exec_total;i++) |
if (exec_list[i].ctx == context_list[num].ctx) { |
h = (exec_list[i].dtsc*1000/clk_per_msec) * DRAW_NUM / max_limit; |
if (h < DRAW_NUM) draw_data[h]++; |
} |
|
gnuplot_draw(max_limit); |
|
last_start = 0; |
temp_tsc = 0; |
max_tsc = 0; |
min_tsc = 0xFFFFFFFF; |
k = 0; |
for (i=0;i<exec_total;i++) |
if (exec_list[i].ctx == context_list[num].ctx) { |
367,6 → 436,7 |
} else { |
delta_start = exec_list[i].start - last_start; |
if (delta_start > max_tsc) max_tsc = delta_start; |
if (delta_start < min_tsc) min_tsc = delta_start; |
temp_tsc += delta_start; |
k++; |
last_start = exec_list[i].start; |
373,9 → 443,31 |
} |
} |
|
printf(" Min Arr. Delta dTSC [%12llu] us [%12llu]\n",min_tsc,min_tsc*1000/clk_per_msec); |
printf(" Mean Arr. Delta dTSC [%12llu] us [%12llu]\n",temp_tsc / k,temp_tsc / k*1000/clk_per_msec); |
printf(" Max Arr. Delta dTSC [%12llu] us [%12llu]\n\n",max_tsc,max_tsc*1000/clk_per_msec); |
|
gnuplot_clear(); |
|
max_limit = max_tsc*1000/clk_per_msec; |
|
last_start = 0; |
for (i=0;i<exec_total;i++) |
if (exec_list[i].ctx == context_list[num].ctx) { |
if (last_start == 0) { |
last_start = exec_list[i].start; |
} else { |
delta_start = exec_list[i].start - last_start; |
|
h = (delta_start*1000/clk_per_msec) * DRAW_NUM / max_limit; |
if (h < DRAW_NUM) draw_data[h]++; |
|
last_start = exec_list[i].start; |
} |
} |
|
gnuplot_draw(max_limit); |
|
} |
|
if (task_type == PERIODICAL) { |
384,35 → 476,58 |
|
temp_tsc = 0; |
max_tsc = 0; |
min_tsc = 0xFFFFFFFF; |
first_exec = 0; |
k = 0; |
for (i=0;i<exec_total;i++) |
if (exec_list[i].ctx == context_list[num].ctx) { |
if (first_exec == 0) first_exec = exec_list[i].start - log_start_tsc; |
if (exec_list[i].dtsc > max_tsc) max_tsc = exec_list[i].dtsc; |
if (exec_list[i].dtsc < min_tsc) min_tsc = exec_list[i].dtsc; |
temp_tsc += exec_list[i].dtsc; |
k++; |
} |
printf(" Total Execution dTSC [%12llu] us [%12llu]\n",temp_tsc,temp_tsc*1000/clk_per_msec); |
printf(" Mean CPU Bandwidth [%11f%c]\n",(double)(temp_tsc)/(double)(total_dtsc)*100.0,'%'); |
printf(" after first int [%11f%c]\n",(double)(temp_tsc)/(double)(total_dtsc-first_exec)*100.0,'%'); |
printf(" Execs Number [%12d]\n",k); |
printf(" Min Exec dTSC [%12llu] us [%12llu]\n",min_tsc,min_tsc*1000/clk_per_msec); |
printf(" Mean Exec dTSC [%12llu] us [%12llu]\n",temp_tsc / k,temp_tsc / k*1000/clk_per_msec); |
printf(" Max Exec dTSC [%12llu] us [%12llu]\n\n",max_tsc,max_tsc*1000/clk_per_msec); |
|
temp_tsc = 0; |
max_tsc = 0; |
min_tsc = 0xFFFFFFFF; |
k = 0; |
for (i=0;i<job_total;i++) |
if (job_list[i].ctx == context_list[num].ctx) { |
if (job_list[i].dtsc > max_tsc) max_tsc = job_list[i].dtsc; |
if (job_list[i].dtsc < min_tsc) min_tsc = job_list[i].dtsc; |
temp_tsc += job_list[i].dtsc; |
k++; |
} |
printf(" Total Job Exec dTSC [%12llu] us [%12llu]\n",temp_tsc,temp_tsc*1000/clk_per_msec); |
printf(" Jobs Number [%12d]\n",k); |
printf(" Min Job dTSC [%12llu] us [%12llu]\n",min_tsc,min_tsc*1000/clk_per_msec); |
printf(" Mean Job dTSC [%12llu] us [%12llu]\n",temp_tsc / k,temp_tsc / k*1000/clk_per_msec); |
printf(" Max Job dTSC [%12llu] us [%12llu]\n\n",max_tsc,max_tsc*1000/clk_per_msec); |
|
gnuplot_clear(); |
|
max_limit = max_tsc*1000/clk_per_msec; |
|
for (i=0;i<job_total;i++) |
if (job_list[i].ctx == context_list[num].ctx) { |
h = (job_list[i].dtsc*1000/clk_per_msec) * DRAW_NUM / max_limit; |
if (h < DRAW_NUM) draw_data[h]++; |
} |
|
gnuplot_draw(max_limit); |
|
last_start = 0; |
temp_tsc = 0; |
max_tsc = 0; |
min_tsc = 0xFFFFFFFF; |
k = 0; |
for (i=0;i<job_total;i++) |
if (job_list[i].ctx == context_list[num].ctx) { |
421,15 → 536,38 |
} else { |
delta_start = job_list[i].start - last_start; |
if (delta_start > max_tsc) max_tsc = delta_start; |
if (delta_start < min_tsc) min_tsc = delta_start; |
temp_tsc += delta_start; |
k++; |
last_start = job_list[i].start; |
} |
} |
|
|
printf(" Min Arr. Delta dTSC [%12llu] us [%12llu]\n\n",min_tsc,min_tsc*1000/clk_per_msec); |
printf(" Mean Arr. Delta dTSC [%12llu] us [%12llu]\n",temp_tsc / k,temp_tsc / k*1000/clk_per_msec); |
printf(" Max Arr. Delta dTSC [%12llu] us [%12llu]\n\n",max_tsc,max_tsc*1000/clk_per_msec); |
|
gnuplot_clear(); |
|
max_limit = max_tsc*1000/clk_per_msec; |
|
last_start = 0; |
for (i=0;i<job_total;i++) |
if (job_list[i].ctx == context_list[num].ctx) { |
if (last_start == 0) { |
last_start = job_list[i].start; |
} else { |
delta_start = job_list[i].start - last_start; |
|
h = (delta_start*1000/clk_per_msec) * DRAW_NUM / max_limit; |
if (h < DRAW_NUM) draw_data[h]++; |
|
last_start = exec_list[i].start; |
} |
} |
|
gnuplot_draw(max_limit); |
|
} |
|
return 0; |
455,11 → 593,13 |
|
events_total = create_lists(argv[1]); |
|
printf("\nDelta TSC = %llu\n",log_end_tsc - log_start_tsc); |
printf("Events [%8d]\n",events_total); |
printf("Execs [%8d]\n",exec_total); |
printf("EndCycles [%8d]\n",endcycle_total); |
total_dtsc = log_end_tsc - log_start_tsc; |
|
printf("\nTotal dTSC [%12llu] us [%12llu]\n", total_dtsc, total_dtsc*1000/clk_per_msec); |
printf("Events [%12d]\n",events_total); |
printf("Execs [%12d]\n",exec_total); |
printf("EndCycles [%12d]\n",endcycle_total); |
|
total_tsc = 0; |
for (i=0;i<exec_total;i++) |
total_tsc += exec_list[i].dtsc; |
493,7 → 633,7 |
elaborate_statistics(i,task_type); |
|
} |
|
|
return 0; |
|
} |