From 0ef1eba093d74c1bc86bfe2a6e180fa3879ace0a Mon Sep 17 00:00:00 2001 From: TuDatTr Date: Thu, 17 Dec 2020 13:07:26 +0100 Subject: [PATCH] 37/51 points\test 2,5 6 still fail for some reason --- src/.csim_results | 1 + src/csim | Bin 0 -> 25424 bytes src/csim.c | 166 +++++++++++++++++++++++++------------------- src/test-trans | Bin 0 -> 31360 bytes src/tracegen | Bin 0 -> 25904 bytes src/trans.o | Bin 0 -> 4896 bytes src/tuan-handin.tar | Bin 0 -> 10240 bytes 7 files changed, 97 insertions(+), 70 deletions(-) create mode 100644 src/.csim_results create mode 100755 src/csim create mode 100755 src/test-trans create mode 100755 src/tracegen create mode 100644 src/trans.o create mode 100644 src/tuan-handin.tar diff --git a/src/.csim_results b/src/.csim_results new file mode 100644 index 0000000..fba0781 --- /dev/null +++ b/src/.csim_results @@ -0,0 +1 @@ +167 71 67 diff --git a/src/csim b/src/csim new file mode 100755 index 0000000000000000000000000000000000000000..f74ea8285102362d2c5ad18ae739c6f8f834c429 GIT binary patch literal 25424 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 #include "cachelab.h" -int v = -1; /* verbose */ -int s = -1; /* set index */ -int E = -1; /* Set of cache lines */ -int b = -1; /* Block offset */ +int v = 0; /* verbose */ +int s = 0; /* set index */ +int E = 0; /* Set of cache lines */ +int b = 0; /* Block offset */ int S; /* Set of Set of cache lines*/ int B; /* Block size */ long long time = 0; @@ -27,7 +27,7 @@ int hit = 0, miss = 0, eviction = 0; struct cache_line { unsigned char v; unsigned int tag; - unsigned int timestamp; + unsigned int time; }; void print_help() { @@ -40,23 +40,95 @@ void print_help() { printf(" -t : Name of the valgrind trace to replay\n"); } -void accessMem (struct cache_line **cache, unsigned int address) { - unsigned int set_bits = address >> (s + b); - unsigned int tag_bits = address << (64-s-b) >> (64 - s); - - for (int i = 0; i < E; i++) { - if (cache[set_bits][i].v == 1 && cache[set_bits][i].tag == tag_bits) { - cache[set_bits][i].timestamp = time; - hit++; - break; - } else { - +void init() { + cache = (struct cache_line **) malloc(S*sizeof(struct cache_line *)); + for (int i = 0; i < S; i++) { + struct cache_line* cache_set = (struct cache_line *) malloc(E*sizeof(struct cache_line)); + cache[i] = cache_set; + for (int j = 0; j < E; j++) { + cache_set[j].v = 0; + cache_set[j].tag = 0; + cache_set[j].time = 0; } } - time++; } -void opt (int argc, char **argv) { +void clean() { + for (int i = 0; i < S; i++) { + free(cache[i]); + } + free(cache); + fclose(tracefile); +} + +void accessMem (int addr) { + unsigned int set = ((addr >> b) & ((1LL << s) - 1)); + unsigned int tag = addr >> (b + s); + printf("addr %x, set %x, tag %x ", addr, set, tag); + struct cache_line *cache_set = cache[set]; + long evic_time = 0xffffffffffffffff; + int evic_line = 0; + for (int i = 0; i < E; i++) { + if (cache_set[i].tag == tag && cache_set[i].v != 0){ + if (v) { printf("hit "); } + hit++; + cache_set[i].time = time; + time++; + return; + } + } + + if (v) { printf("miss "); } + miss++; + + for (int i = 0; i < E; i++) { + if (cache_set[i].time < evic_time) { + evic_line = i; + evic_time = cache_set[i].time; + } + } + + if (cache_set[evic_line].v == 1) { + eviction++; + if (v) { printf("eviction "); } + } + + cache_set[evic_line].v = 1; + cache_set[evic_line].tag = tag; + cache_set[evic_line].time = time; + time++; + + return; +} + +void trace() { + char op; + unsigned address; + int size; + + while (fscanf(tracefile, " %c %x,%d", &op, &address, &size) > 0 ) { + switch (op) { + case 'M': + if (v) { printf("%c %x,%d ", op, address, size); } + accessMem(address); + accessMem(address); + printf("\n"); + break; + case 'L': + if (v) { printf("%c %x,%d ", op, address, size); } + accessMem(address); + printf("\n"); + break; + case 'S': + if (v) { printf("%c %x,%d ", op, address, size); } + accessMem(address); + printf("\n"); + break; + } + } +} + +int main(int argc, char *argv[]) { char c; while ((c = getopt(argc, argv, "s:E:b:t:vh")) != -1) { switch (c) { @@ -82,68 +154,22 @@ void opt (int argc, char **argv) { } } - if (s == -1 || E == -1 || b == -1 || tracefile == NULL) { + if (s == 0 || E == 0 || b == 0 || tracefile == NULL) { print_help(); - exit(0); + exit(1); } S = pow(2, s); B = pow(2, b); -} - -void Init() { - cache = (struct cache_line **) malloc(S*sizeof(struct cache_line *)); + init(); + trace(); for (int i = 0; i < S; i++) { - struct cache_line* cache_set = (struct cache_line *) malloc(E*sizeof(struct cache_line)); - cache[i] = cache_set; for (int j = 0; j < E; j++) { - cache_set[j].v = '\0'; - cache_set[j].tag = 0; - cache_set[j].timestamp = 0; + // printf("cache[%d][%d]: %c %x %ul\n", i, j, cache[i][j].v, cache[i][j].tag, cache[i][j].time); } } -} - -void CleanUp() { - for (int i = 0; i < S; i++) { - free(cache[i]); - } - free(cache); - fclose(tracefile); -} - -void traceCache() { - char op; // I = instruction, L = data load, S = data store, M = data modify - unsigned address; - int size; - - while (fscanf(tracefile, " %c %x,%d", &op, &address, &size) > 0 ) { - if (v == 1) { - printf("%c %x,%d", op, address, size); - } - switch (op) { - case 'M': - accessMem(cache, address); - accessMem(cache, address); - break; - case 'L': - accessMem(cache, address); - break; - case 'S': - accessMem(cache, address); - break; - } - printf("\n"); - } -} - -int main(int argc, char *argv[]) { - opt(argc, argv); - - Init(); - traceCache(); - CleanUp(); + clean(); printSummary(hit, miss, eviction); return 0; diff --git a/src/test-trans b/src/test-trans new file mode 100755 index 0000000000000000000000000000000000000000..37d0e871c554ff402cc5a5232f3e58e94129d8ec GIT binary patch literal 31360 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 F_8;`=qz?c9 literal 0 HcmV?d00001 diff --git a/src/trans.o b/src/trans.o new file mode 100644 index 0000000000000000000000000000000000000000..897598cd5de6b261de37bd201fca234c7f40cc96 GIT binary patch literal 4896 zcmb_ec~p~E7XOm4C}U+45vnzIFrtJUP|<^^4QL=(Q>+MTtzduv5t3+@5*T$FkEkm^sYK0j$>e{-{C^#ddtyrNcTQwdVjebbsQlffo6C44V6$=c15E@^6; zwCEuRA&;e1v8KkzFCfD#vGoUfAkYwb3IY{Nzp|IPVKTI%q&8Hh*(|xy&wh-|Sku37 zorHF2YKye!0ct?jgUnb{v%OH0#0K>`mp4i7(MEzn=!3Czk>&HOtzh zoC{{zJ!z`dJfzGd>!NMMYhm%4rKQt{(nYLhLziiCd6DEE2azLWH*)tCNo>frMabH7 z%PR07q@`hW6Qwgi(cN(X{U1l%1?_aI$Tg!(s`}GO8B2}5 zyH z&8jUr-x9eqJFjBo@uo1(XTm#YLd&zJ%rcw}yUyXQlx5vnQRi{BD{i;#m!!@9PKmm& zkGs78eO!-wP|eJjWIiwBMIk<#-_rV_g<_A{8R3-|FUQ}Anvy8+kI2q!n?2;_uQk6O z&Y2L}E)zVtH7~Y_-_RSqJqb$|p;(wYGyriLFM~_AsOLm|CFv((> zIdX%gWTcD8GC>@)=*N2hJZ@!k;-Ck|in*oRb~pT$s&x_^nPWWGl3y~RQ5_ODE+{p? z+q>;c>T{nlPRwzw`pvjhak6*MhIo7%XSFWbrLH{p*6IqM(;MBsxl^BZam?Us!Nf_N zm(TVu2`o;!_4ntiHT(H7YGde46Ujvri|E85c5Nxbx$#Iox4W#+7sgD$2(0IMeyX zF1Lu6NzVBryk?bl^dxAcmfL}UIyzqRv}2F&^@Q3^!#?*b&c+iNcZX{auCpH0X!fu3 zqGD#vn#K=|c`so+KQu%%Q51qEW*AHk63*)R6vybnd2@*Cpb9icBM}BakQn$x4)xf; zo%MzbHwrQAvFU&#IR~Gs38M<;_xWOp8^6R&7<5I zUcbqs-spF*H5h46#&~@&J{oB+#{AH0iZIv%z~>_k0z8li^aDQO(QAybNQ@7Gg+M~D zEz4#6BoTkwI7PZqDF-oh*Q0nvw zZL~q1sz;Bdj!KT18y6KhH#sgkI$p9Mc|l~uw4kg4f_%n-h%zP zEc_<+VZVWpIuGnFCC8fJ2eF^Y!fUa=hJ}+8Rg7_%2Z8~#596f%AF+P~Yv40aEB%KY zVT3Qmyt52G%riL$OQ8S~!l(Z*B0mk|pny-#Uk;0Z6vaUDSbTDh1$a?O{U>%h6^wCG zAH#in4EW4jk(_BZpWFv*oR14aGq@=l5wmd8&t)u}j5nW!lX;^=x>YK@JOydJ)~+*& zrB!6hMS6u%Pl?jxdO0OZ(dj4=jixD53>nEvb-D({Xj`6=qE&n}AS_3Jr!y1-Q?iw6 z1xZ2eP@+_gN~KVvCe#|eLWCaKV4Yr`nuQA~GLzG_a+L!2{`V_BN`<*)o_(k$h7S_< zA3NYOKeSESC;e9<%u)XvaQl}~ zoGB!qU}?y3)IPZ+NjuO!Oex7HxB+3%eh3L58>9+fE z{;=DI6saqGDXIr|*bCWElARC7oPG8XM2YeFF9C-k?D0dt9OWBv{|_*7!DQ$E4;GAj AE&u=k literal 0 HcmV?d00001 diff --git a/src/tuan-handin.tar b/src/tuan-handin.tar new file mode 100644 index 0000000000000000000000000000000000000000..3659cb0ea3ade5f155f774626197a2b252fb3a9d GIT binary patch literal 10240 zcmeHM`%fFo73OFE6{l1rHV=anLL^=i=#s0dkXD7Os-hH)cW3P(-d$^FZJ@dN-}{|2 z58K!z^fpoN4_+zkdS=dJzVnzfCy6zAJ6ZXm&kmlw-Q5+uI`7}@_;-ij{JekH*<0zn zeZRN2_jY&h9mYF5?>jpywDUu?^2|rJRu$1oJyONjnKx~^0#;i;shX}TRbXtp(fFe&lEEm|bZF~z zV7l%8@$8r>XNP*aE{FB(SW-U@_3V(XD^v7l$8uHoXGT^NmGt#MLF#IwVTzi@bVNG` zw7pJaU3E*VSxKI-al-1FOp)q`Fm)EEE-_VRBwT4=3T?xhZd`LZD3ecEl`$XB{8A)( z>Uk!9)v2s<^w#`aR2!5X(rK~D*mJN_b zN$vE#WqoOVU6dCZw+$>40Q#n8_M4O&D`0Gr9-E{#W#Pmw;P$yeG%Bp=6*{E^ogj!IZzsq`Tb0h}daFOa zp)Ct{I;O2NIy}RxONU*&YC4Rd9RIUeZL!?IifF69Pk$Nme$;?i7-a+1qq+}&l~tBT zEDy%d$_3=(De~Yv6Ar1d!-0CV-U83?5WV;5>yQwQW@E#78qu79bssNmnj>1MK~&)ESp}SUa=fn14Oq#ZZo!uQ zk|?Tn=Ty6cYG(&@H&M+~Gs*ScP21%zp?xxg7!w`~=VIPqps#z4eikfxGETYI5%XAzaAl`}$2A(Ds%_GXi(>G+ts zEqX=GX6O8z4iCw;Xp1@y+!-HR)e4DpUlbcgkNEvzbC6J zU5~25%{i~)Ej|?}he?pgKbXO9+%`M%p+k^W2?0zqpqilVv_0l_wm|L4nrI^lxg)rn z97;|OpC18)x!p3Q9GGFpaQ$gqXE{@c)mSLkc{Bb#zk<<#6X3;bf^F~_3=_gmLNTOO zKBLPaQ^e?D??+tnn8Y74s+j1$&oxCevxzFQNkDJXDy=1moXxcqvGb}N;*aNnFF73O zn06?jX75d%^r=}6!$_h~cfG!Nje=61IUECj4o>DD*$elH`^JnS*#eu8*kzv2&xC>? zoTa?FTWR%)0bp~mZs$Kzw-;$}`G3?P9un*ixiW>EpsMO6o36@R$M^X9#@SQqzJ$^9 z9@9+Vn68X(IwD>Uzp?vg``!I|f81YfwK!94#n1{)lFa%@KcXO@`5Mt#3i0@WdSNHp ze9nsFNX5(?K#B#T_S zQ_@ZlS#o4uAog*DeRQvr>yJ0r7dP(5DZcQVBUR*{EE0-axW?6Wq-yjxx{s8UqoPLJ z>B-%k>soDDd-O^ab^d%xsi`zNFS!~Hxi!M6hfoLgF+I6Nv-)q}fN`yD8|2&c)z;X2 zH_O;t*(~Gu@(nkpZNj9tcGS&rGuWc5KDO+854IePq?nB&C|X0BCXeNa_sq||84Rea zsaL5K`vnY~zyGSL8s_yq0A;yRlniJi-&sH_(oP_AB|&Sh(USZ zroZdg2p30^^41igjW$G4UxJ4$;+CPb!eC1-*?>80rc<|XitW@%?zgHL!iL}QG(u)-3IRZWlyP8$|lmuMuKBsSVaCpA@^x^j&c2ZxzV zNZ1DQkmyKr2KF%7ZOce5Vkv`JBLg