blob: a360a25558a7eabeb9f9d10b799cae8519ade482 [file] [log] [blame]
#include <stdio.h>
#include <string.h>
#include "types.h"
#include "functs.h"
extern hard_raw_t *hard_raw_list;
uint32 prog_time, loop_time;
void speedup_test(FILE *fp)
{
char string[100],ostring[100],slask[100];
uint32 address;
uint32 issue_no1, issue_no2, issue_no3;
rewind(fp);
fscanf(fp,"%s %lu",string,&issue_no1);
do {
strcpy(ostring,string);
fgets(string,100,fp);
} while (string[0]!='E');
sscanf(ostring,"%s %lx %lu",slask,&address,&issue_no2);
sscanf(string,"%s %lu %lu",slask,&address,&issue_no3);
loop_time=issue_no2-issue_no1;
printf("Time for loop: %lu issues\n",loop_time);
prog_time=issue_no3;
printf("Time for program: %lu issues\n",prog_time);
printf("Loop is %0.3g %% of program\n",(double)(issue_no2-issue_no1)/(double)issue_no3*100);
rewind(fp);
}
uint32 imix_test(FILE *fp)
{
char string[100],ostring[100],slask[100];
uint32 address;
uint32 issue_no1, issue_no2;
uint32 data_access=0;
rewind(fp);
fgets(string, 100, fp);
fscanf(fp,"%s %lu",string,&issue_no1);
do {
if (string[2]==':')
data_access++;
strcpy(ostring,string);
fgets(string,100,fp);
} while (string[0]!='E');
sscanf(ostring,"%s %lx %lu",slask,&address,&issue_no2);
/* printf("Instuction mix: Data accesses are %0.3g %% of loop\n",(double)data_access/(double)(issue_no2-issue_no1)*100); */
rewind(fp);
return data_access;
}
void find_hard_raws()
{
hard_raw_t *iter=NULL;
iter=hard_raw_list;
while (iter!=NULL) {
if (iter->r_issue>iter->w_issue) {
if (iter->prev!=NULL) {
iter->prev->next=iter->next;
}
iter=iter->next;
} else {
iter=iter->next;
}
}
}
/* This function calculates the "optimal" execution time with speculation */
void specul_time_o(epoch_t *epoch, int num_epochs, FILE *graphfile, int show_speedup, int thread_pen, int commit_pen)
{
int i;
uint32 max;
uint32 restarts=0;
for (i=0;i<num_epochs;i++) {
epoch[i].run_time=epoch[i].end_time-epoch[i].start_time;
epoch[i].stall_time=0;
}
{
hard_raw_t *iter=NULL;
iter=hard_raw_list;
while(iter!=NULL) {
if ((iter->w_issue+epoch[iter->w_epoch].stall_time) > epoch[iter->r_epoch].stall_time) {
epoch[iter->r_epoch].stall_time=iter->w_issue+epoch[iter->w_epoch].stall_time;
restarts++;
}
iter=iter->next;
}
}
for (i=0;i<num_epochs;i++) {
epoch[i].run_time=epoch[i].run_time+epoch[i].stall_time;
}
max=epoch[0].run_time;
for (i=0;i<num_epochs;i++) {
if (epoch[i].run_time>max)
max=epoch[i].run_time;
}
printf("OPTIMUM RESTART RESULTS\n");
max+=(restarts+num_epochs)*thread_pen+num_epochs*commit_pen;
printf("Time for speculative loop is %lu issues\n",max);
if (show_speedup == 1 || show_speedup == 3)
printf("Potential speedup for loop: %0.3g times\n", (double)loop_time/(double)max);
if (show_speedup == 2 || show_speedup == 3)
printf("Potential speedup for program: %0.3g times\n", (double)prog_time/(max+prog_time-loop_time));
if (graphfile!=NULL) {
if (show_speedup == 1 || show_speedup == 3)
fprintf(graphfile,"optloop: %0.3g\n", (double)loop_time/(double)max);
if (show_speedup == 2 || show_speedup == 3)
fprintf(graphfile,"optprog: %0.3g\n", (double)prog_time/(double)(max+prog_time-loop_time));
}
}
/* These functions calculates the "realistic" execution time with speculation */
void specul_time_r(epoch_t *epoch, int num_epochs, int cpulimit, FILE *graphfile, int show_speedup, int thread_pen, int commit_pen)
{
int i;
uint32 max=0;
uint32 restarts=0;
if (cpulimit==0) { /* "Unlimited" amount of CPUs simulated */
printf("REALISTIC RESTART RESULTS -- Unlimited amount of CPUs\n");
for (i=0;i<num_epochs;i++) {
epoch[i].run_time=epoch[i].end_time-epoch[i].start_time;
epoch[i].stall_time=0;
}
{
hard_raw_t *iter=NULL;
iter=hard_raw_list;
while(iter!=NULL) {
if ((iter->w_issue+epoch[iter->w_epoch].stall_time) > epoch[iter->r_epoch].stall_time) {
epoch[iter->r_epoch].stall_time=epoch[iter->w_epoch].run_time+epoch[iter->w_epoch].stall_time;
restarts++;
}
iter=iter->next;
}
}
for (i=0;i<num_epochs;i++) {
epoch[i].run_time=epoch[i].run_time+epoch[i].stall_time;
}
max=epoch[0].run_time;
for (i=0;i<num_epochs;i++) {
if (epoch[i].run_time>max)
max=epoch[i].run_time;
}
} else { /* Limited amount of CPUs simulated */
int j;
uint32 current_stall=0;
printf("REALISTIC RESTART RESULTS -- %d CPUs\n",cpulimit);
for (i=0;i<num_epochs;i++) {
epoch[i].run_time=epoch[i].end_time-epoch[i].start_time;
epoch[i].stall_time=0;
}
for (i=cpulimit;i<num_epochs;i+=cpulimit) {
current_stall=0;
for (j=i-cpulimit;j<i;j++) {
if (epoch[j].run_time+epoch[j].stall_time>current_stall)
current_stall=epoch[j].run_time+epoch[j].stall_time;
}
for (j=i;j<cpulimit+i;j++) {
epoch[j].stall_time=current_stall;
}
}
{
hard_raw_t *iter=NULL;
iter=hard_raw_list;
while(iter!=NULL) {
if ((iter->w_issue+epoch[iter->w_epoch].stall_time) > epoch[iter->r_epoch].stall_time) {
epoch[iter->r_epoch].stall_time+=epoch[iter->w_epoch].run_time+epoch[iter->w_epoch].stall_time;
restarts++;
}
iter=iter->next;
}
}
for (i=0;i<num_epochs;i++) {
epoch[i].run_time=epoch[i].run_time+epoch[i].stall_time;
}
max=epoch[0].run_time;
for (i=0;i<num_epochs;i++) {
if (epoch[i].run_time>max)
max=epoch[i].run_time;
}
}
max+=(restarts+num_epochs)*thread_pen+num_epochs*commit_pen;
printf("Time for speculative loop is %lu issues\n",max);
if (show_speedup == 1 || show_speedup == 3)
printf("Potential speedup for loop: %0.3g times\n", (double)loop_time/(double)max);
if (show_speedup == 2 || show_speedup == 3)
printf("Potential speedup for program: %0.3g times\n", (double)prog_time/(double)(max+prog_time-loop_time));
if (graphfile!=NULL) {
if (show_speedup == 1 || show_speedup == 3)
fprintf(graphfile,"realloop: %d %0.3g\n", cpulimit, (double)loop_time/(double)max);
if (show_speedup == 2 || show_speedup == 3)
fprintf(graphfile,"realprog: %d %0.3g\n", cpulimit, (double)prog_time/(double)(max+prog_time-loop_time));
}
}