#include<stdio.h>
#include<stdlib.h>
#include<getopt.h>
#include<limits.h>
#include<unistd.h>
#include"cachelab.h"
typedef unsigned long int uint64;
int v=0,s,E,b,S,B;
int hits=0,misses=0,evictions=0;
FILE *fp;
const char* usage = "Usage: %s [-hv] -s <s> -E <E> -b <b> -t <tracefile>\n";
typedef struct Line{
uint64 tag,lru;
int flag;
}Line,*line;
typedef struct Cache{
line CL;
}Cache,*cache;
cache MCa = NULL;
void Get_Data(int argc, char *argv []){
int opt;
while ( (opt = getopt(argc,argv,"hvs:E:b:t:")) != -1 ){
switch (opt){
case 'h':
fprintf(stdout, usage, argv[0]);
break;
case 'v':
v=1;
break;
case 's':
s = atoi(optarg);
S = 1<<s;
break;
case 'E':
E = atoi(optarg);
break;
case 'b':
b = atoi(optarg);
B = 1<<b;
break;
case 't':
fp = fopen(optarg,"r");
break;
default:
printf("error\n");
exit(1);
}
}
}
void Init(){
int i=0,j=0;
MCa = (cache) malloc( S*sizeof(Cache) );
for ( i = 0; i < S; i++){
MCa[i].CL = (line) malloc( E*sizeof(Line) );
for ( j = 0; j < E; j++){
MCa[i].CL[j].flag = 0;
MCa[i].CL[j].tag = 0;
MCa[i].CL[j].lru=-1;
}
}
}
void UpDate(){
int i=0,j=0;
for ( i = 0; i < S; i++){
for( j = 0; j < E; j++){
if (MCa[i].CL[j].flag)
MCa[i].CL[j].lru++;
}
}
}
void Hit(uint64 address){
// 查看组号
//int set = (address >>b ) & ( (1<<s) - 1 ) ;
// 查看标记
//int tag = (address >> (b+s) ) & ( ( 1<<(64-b-s) ) -1 );
uint64 tag = address >> (s + b);
unsigned int set = address >> b & ((1 << s) - 1);
int i = 0;
int full = 1 , sucess=0 , emptyid;
int evi_index = -1;
uint64 evi_lru = ( (1<<63)-1 );
for ( i = 0; i < E; i++){
if( MCa[set].CL[i].flag && MCa[set].CL[i].tag == tag){
sucess = 1;
MCa[set].CL[i].lru = 1;
hits++;
if(v) printf(" hit");
break;
}
if(full && !MCa[set].CL[i].flag ){
full = 0;
emptyid = i;
}
if(evi_index==-1 && MCa[set].CL[i].flag ){
evi_index = i;
evi_lru = MCa[set].CL[i].lru;
}
}
if(sucess==0 && full==0){
MCa[set].CL[ emptyid ].tag = tag;
MCa[set].CL[ emptyid ].lru = 1;
MCa[set].CL[ emptyid ].flag = 1;
misses++;
if(v) printf(" miss");
}
else if(sucess==0 && full==1){
for ( i = 0; i < E; i++){
if(evi_lru <= MCa[set].CL[i].lru ){
evi_lru = MCa[set].CL[i].lru;
evi_index = i;
}
}
MCa[set].CL[evi_index].tag = tag;
MCa[set].CL[evi_index].lru = 1;
misses++;
evictions++;
if(v) printf(" eviction");
}
}
void Stimulate(){
char operation; // 命令开头的 I L M S
uint64 address; // 地址参数
int size,i; // 大小
while ( fscanf(fp, " %c %lx,%d\n", &operation, &address, &size) > 0 ){
if(v) printf("%c %lx,%d",operation,address,size);
switch(operation){
case 'I': continue; // 不用写关于 I 的判断也可以
case 'L':
Hit(address);
break;
case 'M':
Hit(address);
UpDate();
Hit(address);
break;
case 'S':
Hit(address);
break;
}
if(v) printf("\n");
UpDate();
}
fclose(fp);
for ( i = 0; i < S; i++){
free(MCa[i].CL);
MCa[i].CL = NULL;
}
free(MCa);
MCa = NULL;
}
int main(int argc, char *argv []){
Get_Data(argc,argv);
Init();
Stimulate();
printSummary(hits, misses, evictions);
return 0;
}
07-13
4万+
10-10
2256
07-28
2万+
10-10