diff --git a/cache/csim.c b/cache/csim.c index 44fdd4b..620f3a6 100644 --- a/cache/csim.c +++ b/cache/csim.c @@ -1,7 +1,87 @@ +#include +#include +#include +#include #include "cachelab.h" -int main() -{ - printSummary(0, 0, 0); - return 0; +typedef struct { + int valid; + 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; } diff --git a/cache/trans.c b/cache/trans.c index e40f6fc..c45187b 100644 --- a/cache/trans.c +++ b/cache/trans.c @@ -20,8 +20,152 @@ int is_transpose(int M, int N, int A[N][M], int B[M][N]); * be graded. */ 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]; + } + } + } + } } /*