update cachelab

This commit is contained in:
18218461270@163.com 2025-08-30 20:10:27 +08:00
parent 8c17521359
commit 738bb9531f
2 changed files with 230 additions and 6 deletions

86
cache/csim.c vendored
View File

@ -1,7 +1,87 @@
#include <stdio.h>
#include <getopt.h>
#include <limits.h>
#include <stdlib.h>
#include "cachelab.h" #include "cachelab.h"
int main() typedef struct {
{ int valid;
printSummary(0, 0, 0); int last_use_time;
long t;
} cache_line;
void cache(cache_line *set, int E, unsigned long t, int time_stamp, int *hits, int *misses, int *evictions) {
for (int i = 0; i < E; i++) {
if (set[i].valid && set[i].t == t) {
set[i].last_use_time = time_stamp;
(*hits)++;
return;
}
}
(*misses)++;
int least_use_time = INT_MAX, least_used_id;
for (int i = 0; i < E; i++) {
if (!set[i].valid) {
set[i].valid = 1;
set[i].last_use_time = time_stamp;
set[i].t = t;
return;
}
if (set[i].last_use_time < least_use_time) {
least_use_time = set[i].last_use_time;
least_used_id = i;
}
}
(*evictions)++;
set[least_used_id].last_use_time = time_stamp;
set[least_used_id].t = t;
}
int main(int argc, char *argv[]) {
int s, E, b;
char *trace;
char op;
while ((op = getopt(argc, argv, "s:E:b:t:")) != -1) {
switch (op) {
case 's':
s = atoi(optarg);
break;
case 'E':
E = atoi(optarg);
break;
case 'b':
b = atoi(optarg);
break;
case 't':
trace = optarg;
}
}
int S = 1 << s;
FILE *infile = fopen(trace, "r");
char instr[1];
unsigned long addr;
cache_line **sets = (cache_line**) malloc(sizeof(cache_line*) * S);
for (int i = 0; i < S; i++) {
sets[i] = (cache_line*) malloc(sizeof(cache_line) * E);
for (int j = 0; j < E; j++) {
sets[i][j].valid = 0;
}
}
int time_stamp = 0;
int hits = 0, misses = 0, evictions = 0;
while (fscanf(infile, "%s %lx,%*d", instr, &addr) != -1) {
if (instr[0] == 'I') {
continue;
}
cache(sets[(addr >> b) & (S - 1)], E, addr >> (s + b), time_stamp, &hits, &misses, &evictions);
if (instr[0] == 'M') {
hits++;
}
time_stamp++;
}
printSummary(hits, misses, evictions);
return 0; return 0;
} }

148
cache/trans.c vendored
View File

@ -20,8 +20,152 @@ int is_transpose(int M, int N, int A[N][M], int B[M][N]);
* be graded. * be graded.
*/ */
char transpose_submit_desc[] = "Transpose submission"; char transpose_submit_desc[] = "Transpose submission";
void transpose_submit(int M, int N, int A[N][M], int B[M][N]) void transpose_sub(int N, int t, int l, int size, int B[][N]) {
{ for (int i = 0; i < size; i++) {
for (int j = i + 1; j < size; j++) {
B[t + i][l + j] ^= B[t + j][l + i];
B[t + j][l + i] ^= B[t + i][l + j];
B[t + i][l + j] ^= B[t + j][l + i];
}
}
}
void transpose_submit(int M, int N, int A[N][M], int B[M][N]) {
int v0, v1, v2, v3, v4, v5, v6, v7;
if (M == 32) {
for (int j = 0; j < M; j += 8) {
for (int i = 0; i < N; i++) {
v0 = A[i][j];
v1 = A[i][j + 1];
v2 = A[i][j + 2];
v3 = A[i][j + 3];
v4 = A[i][j + 4];
v5 = A[i][j + 5];
v6 = A[i][j + 6];
v7 = A[i][j + 7];
B[j][i] = v0;
B[j + 1][i] = v1;
B[j + 2][i] = v2;
B[j + 3][i] = v3;
B[j + 4][i] = v4;
B[j + 5][i] = v5;
B[j + 6][i] = v6;
B[j + 7][i] = v7;
}
}
} else if (M == 64) {
for (int i = 0; i < N; i += 8) {
for (int j = 0; j < M; j += 8) {
if (i == j) {
for (int ii = i; ii < i + 4; ii++) {
v0 = A[ii][j];
v1 = A[ii][j + 1];
v2 = A[ii][j + 2];
v3 = A[ii][j + 3];
v4 = A[ii][j + 4];
v5 = A[ii][j + 5];
v6 = A[ii][j + 6];
v7 = A[ii][j + 7];
B[ii][j] = v0;
B[ii][j + 1] = v1;
B[ii][j + 2] = v2;
B[ii][j + 3] = v3;
B[ii][j + 4] = v4;
B[ii][j + 5] = v5;
B[ii][j + 6] = v6;
B[ii][j + 7] = v7;
}
transpose_sub(N, i, j, 4, B);
transpose_sub(N, i, j + 4, 4, B);
for (int ii = i + 4; ii < i + 8; ii++) {
v0 = A[ii][j];
v1 = A[ii][j + 1];
v2 = A[ii][j + 2];
v3 = A[ii][j + 3];
v4 = A[ii][j + 4];
v5 = A[ii][j + 5];
v6 = A[ii][j + 6];
v7 = A[ii][j + 7];
B[ii][j] = v0;
B[ii][j + 1] = v1;
B[ii][j + 2] = v2;
B[ii][j + 3] = v3;
B[ii][j + 4] = v4;
B[ii][j + 5] = v5;
B[ii][j + 6] = v6;
B[ii][j + 7] = v7;
}
transpose_sub(N, i + 4, j, 4, B);
transpose_sub(N, i + 4, j + 4, 4, B);
for (int ii = i; ii < i + 4; ii++) {
v0 = B[ii + 4][j];
v1 = B[ii + 4][j + 1];
v2 = B[ii + 4][j + 2];
v3 = B[ii + 4][j + 3];
v4 = B[ii][j + 4];
v5 = B[ii][j + 5];
v6 = B[ii][j + 6];
v7 = B[ii][j + 7];
B[ii][j + 4] = v0;
B[ii][j + 5] = v1;
B[ii][j + 6] = v2;
B[ii][j + 7] = v3;
B[ii + 4][j] = v4;
B[ii + 4][j + 1] = v5;
B[ii + 4][j + 2] = v6;
B[ii + 4][j + 3] = v7;
}
} else {
for (int ii = i; ii < i + 4; ii++) {
for (int jj = j; jj < j + 4; jj++) {
B[jj][ii] = A[ii][jj];
}
for (int jj = j + 4; jj < j + 8; jj++) {
B[jj - 4][ii + 4] = A[ii][jj];
}
}
for (int jj = j; jj < j + 4; jj++) {
v0 = B[jj][i + 4];
v1 = B[jj][i + 5];
v2 = B[jj][i + 6];
v3 = B[jj][i + 7];
B[jj][i + 4] = A[i + 4][jj];
B[jj][i + 5] = A[i + 5][jj];
B[jj][i + 6] = A[i + 6][jj];
B[jj][i + 7] = A[i + 7][jj];
B[jj + 4][i] = v0;
B[jj + 4][i + 1] = v1;
B[jj + 4][i + 2] = v2;
B[jj + 4][i + 3] = v3;
}
for (int ii = i + 4; ii < i + 8; ii++) {
for (int jj = j + 4; jj < j + 8; jj++) {
B[jj][ii] = A[ii][jj];
}
}
}
}
}
} else if (M == 61) {
for (int j = 0; j < M; j += 17) {
for (int i = 0; i < N; i++) {
for (int jj = j; jj < j + 17 && jj < M; jj++) {
B[jj][i] = A[i][jj];
}
}
}
}
} }
/* /*