From e08b4c56169e45c71e5087f52e5e13eaf2b18a1d Mon Sep 17 00:00:00 2001 From: AquaOH <2863896505@qq.com> Date: Fri, 1 Dec 2023 15:11:52 +0800 Subject: [PATCH] init --- Makefile | 19 + README | 27 + cachelab.c | 83 + cachelab.h | 37 + csim-ref | Bin 0 -> 25368 bytes csim.c | 7 + test-csim | Bin 0 -> 21320 bytes traces/dave.trace | 5 + traces/long.trace | 267988 ++++++++++++++++++++++++++++++++++++++++++++++++++ traces/trans.trace | 596 + traces/yi.trace | 7 + traces/yi2.trace | 16 + 12 files changed, 268785 insertions(+) create mode 100644 Makefile create mode 100644 README create mode 100644 cachelab.c create mode 100644 cachelab.h create mode 100755 csim-ref create mode 100644 csim.c create mode 100755 test-csim create mode 100644 traces/dave.trace create mode 100644 traces/long.trace create mode 100644 traces/trans.trace create mode 100644 traces/yi.trace create mode 100644 traces/yi2.trace diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..063e0ff --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +# +# Student makefile for Cache Lab +# Note: requires a 64-bit x86-64 system +# +CC = gcc +CFLAGS = -g -Wall -Werror -std=c99 -m64 + +all: csim + +csim: csim.c cachelab.c cachelab.h + $(CC) $(CFLAGS) -o csim csim.c cachelab.c -lm + +# +# Clean the src dirctory +# +clean: + rm -rf *.o + rm -f *.tar + rm -f csim diff --git a/README b/README new file mode 100644 index 0000000..6f4ec85 --- /dev/null +++ b/README @@ -0,0 +1,27 @@ +This is the handout directory for the CS:APP Cache Lab. + +************************ +Running the autograders: +************************ + +Before running the autograders, compile your code: + linux> make + +Check the correctness of your simulator: + linux> ./test-csim + +****** +Files: +****** + +# You will modifying and handing in the file +csim.c Your cache simulator + +# Tools for evaluating your simulator and transpose function +Makefile Builds the simulator and tools +README This file +cachelab.c Required helper functions +cachelab.h Required header file +csim-ref* The executable reference cache simulator +test-csim* Tests your cache simulator +traces/ Trace files used by test-csim.c diff --git a/cachelab.c b/cachelab.c new file mode 100644 index 0000000..85ac5e4 --- /dev/null +++ b/cachelab.c @@ -0,0 +1,83 @@ +/* + * cachelab.c - Cache Lab helper functions + */ +#include +#include +#include +#include "cachelab.h" +#include + +trans_func_t func_list[MAX_TRANS_FUNCS]; +int func_counter = 0; + +/* + * printSummary - Summarize the cache simulation statistics. Student cache simulators + * must call this function in order to be properly autograded. + */ +void printSummary(int hits, int misses, int evictions) +{ + printf("hits:%d misses:%d evictions:%d\n", hits, misses, evictions); + FILE* output_fp = fopen(".csim_results", "w"); + assert(output_fp); + fprintf(output_fp, "%d %d %d\n", hits, misses, evictions); + fclose(output_fp); +} + +/* + * initMatrix - Initialize the given matrix + */ +void initMatrix(int M, int N, int A[N][M], int B[M][N]) +{ + int i, j; + srand(time(NULL)); + for (i = 0; i < N; i++){ + for (j = 0; j < M; j++){ + // A[i][j] = i+j; /* The matrix created this way is symmetric */ + A[i][j]=rand(); + B[j][i]=rand(); + } + } +} + +void randMatrix(int M, int N, int A[N][M]) { + int i, j; + srand(time(NULL)); + for (i = 0; i < N; i++){ + for (j = 0; j < M; j++){ + // A[i][j] = i+j; /* The matrix created this way is symmetric */ + A[i][j]=rand(); + } + } +} + +/* + * correctTrans - baseline transpose function used to evaluate correctness + */ +void correctTrans(int M, int N, int A[N][M], int B[M][N]) +{ + int i, j, tmp; + for (i = 0; i < N; i++){ + for (j = 0; j < M; j++){ + tmp = A[i][j]; + B[j][i] = tmp; + } + } +} + + + +/* + * registerTransFunction - Add the given trans function into your list + * of functions to be tested + */ +void registerTransFunction(void (*trans)(int M, int N, int[N][M], int[M][N]), + char* desc) +{ + func_list[func_counter].func_ptr = trans; + func_list[func_counter].description = desc; + func_list[func_counter].correct = 0; + func_list[func_counter].num_hits = 0; + func_list[func_counter].num_misses = 0; + func_list[func_counter].num_evictions =0; + func_counter++; +} diff --git a/cachelab.h b/cachelab.h new file mode 100644 index 0000000..02f7730 --- /dev/null +++ b/cachelab.h @@ -0,0 +1,37 @@ +/* + * cachelab.h - Prototypes for Cache Lab helper functions + */ + +#ifndef CACHELAB_TOOLS_H +#define CACHELAB_TOOLS_H + +#define MAX_TRANS_FUNCS 100 + +typedef struct trans_func{ + void (*func_ptr)(int M,int N,int[N][M],int[M][N]); + char* description; + char correct; + unsigned int num_hits; + unsigned int num_misses; + unsigned int num_evictions; +} trans_func_t; + +/* + * printSummary - This function provides a standard way for your cache + * simulator * to display its final hit and miss statistics + */ +void printSummary(int hits, /* number of hits */ + int misses, /* number of misses */ + int evictions); /* number of evictions */ + +/* Fill the matrix with data */ +void initMatrix(int M, int N, int A[N][M], int B[M][N]); + +/* The baseline trans function that produces correct results. */ +void correctTrans(int M, int N, int A[N][M], int B[M][N]); + +/* Add the given function to the function list */ +void registerTransFunction( + void (*trans)(int M,int N,int[N][M],int[M][N]), char* desc); + +#endif /* CACHELAB_TOOLS_H */ diff --git a/csim-ref b/csim-ref new file mode 100755 index 0000000000000000000000000000000000000000..7f72cb4e43192deb32e8c87106c717863468df73 GIT binary patch literal 25368 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 E2eyM7`Tzg` literal 0 HcmV?d00001 diff --git a/csim.c b/csim.c new file mode 100644 index 0000000..44fdd4b --- /dev/null +++ b/csim.c @@ -0,0 +1,7 @@ +#include "cachelab.h" + +int main() +{ + printSummary(0, 0, 0); + return 0; +} diff --git a/test-csim b/test-csim new file mode 100755 index 0000000000000000000000000000000000000000..b87edf7a7f413907585fdae5179859748c17f46c GIT binary patch literal 21320 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