CSAPP: Cache Lab Part_1

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值