From 5719ab0b4634e74e56d23e9aa6aa92f5966a719e Mon Sep 17 00:00:00 2001 From: Christos Choutouridis Date: Thu, 14 May 2020 22:40:28 +0300 Subject: [PATCH] Q6: profiling info and preperation --- Q6-cache/Makefile | 2 +- Q6-cache/info.txt | 9 ++++ Q6-cache/src/matmul.c | 103 ++++++++++++++++++++++++------------------ 3 files changed, 69 insertions(+), 45 deletions(-) create mode 100644 Q6-cache/info.txt diff --git a/Q6-cache/Makefile b/Q6-cache/Makefile index b957f78..774f52b 100644 --- a/Q6-cache/Makefile +++ b/Q6-cache/Makefile @@ -112,7 +112,7 @@ debug: $(BUILD_DIR)/$(TARGET) .PHONY: release release: CFLAGS += $(REL_FLAGS) -release: clean $(BUILD_DIR)/$(TARGET) +release: $(BUILD_DIR)/$(TARGET) .PHONY: all diff --git a/Q6-cache/info.txt b/Q6-cache/info.txt new file mode 100644 index 0000000..9654fe8 --- /dev/null +++ b/Q6-cache/info.txt @@ -0,0 +1,9 @@ +Επεξεργαστής: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz +Συχνότητα επεξεργαστή: 800 - 2600 MHz +Μέγεθος μνήμης L1: 192 KiB / 192 KiB (L1d/L1i) +Μέγεθος μνήμης L2: 1.5 MiB +Μέγεθος μνήμης L3: 12 MiB +Μέγεθος μνήμης RAM: 31893MiB +Έκδοση gcc: 9.2.1 20191008 (Ubuntu 9.2.1-9ubuntu2) +Έκδοση Λειτουργικού Συστήματος: Ubuntu 19.10 x86_64 + diff --git a/Q6-cache/src/matmul.c b/Q6-cache/src/matmul.c index 38685cd..bddd926 100644 --- a/Q6-cache/src/matmul.c +++ b/Q6-cache/src/matmul.c @@ -4,10 +4,10 @@ \author Nikos Pitsianis \author Dimitris Floros + \author Christos Choutouridis 8997 \date 2020-05-05 */ - #include #include #include @@ -17,59 +17,67 @@ #define MAX_ITER 10 #define sub2ind(i,j,n) (j) + (i)*(n) -/* - * matrixMult - Matrix multiplication +/*! + * Square Matrix multiplication + * \param C pointer to output matrix + * \param A pointer to input matrix A + * \param B pointer to input matrix B + * \param n Size of matrices (both sizes) + * \return none + * + * \note + * This version executes row major order ijk */ -void matrixMult(float * const C, /* output matrix */ - float const * const A, /* first matrix */ - float const * const B, /* second matrix */ - int const n) { /* number of rows/cols */ - - for (int i = 0; i < n; i++) { /* rows */ - for (int j = 0; j < n; j++) { /* cols */ - - /* initialize output value */ - C[ sub2ind(i,j,n) ] = 0; - - for (int k = 0; k < n; k++) { /* accumulate products */ - C[ sub2ind(i,j,n) ] += - A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; +void matrixMult(float * const C, float const * const A, float const * const B, int const n) { + + for (int i = 0; i < n; i++) { /* rows */ + for (int j = 0; j < n; j++) { /* cols */ + C[ sub2ind(i,j,n) ] = 0; /* initialize output value */ + for (int k = 0; k < n; k++) { /* accumulate products */ + C[ sub2ind(i,j,n) ] += + A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; + } } - - } - } - -} // end function 'matrixMult' + } -/* - * matrixInitAdd: - * Initialize matrix with random indices and return the matrix - * pointer. - * +} + +/*! + * Initialize matrix with random indices and return the matrix pointer. + * + * \param n The size of the matrix (both of them) + * \return Pointer to allocated and initialized matrix */ float * matrixInit(int const n) { - float *M = (float *) malloc( n*n*sizeof(float) ); - - for (int i = 0; i < n; i++) /* rows */ - for (int j = 0; j < n; j++) /* cols */ - M[ sub2ind(i,j,n) ] = (float)rand()/(float)(RAND_MAX); + float *M = (float *) malloc( n*n*sizeof(float) ); - return M; - -} // end function 'matrixInitAdd' + for (int i = 0; i < n; i++) /* rows */ + for (int j = 0; j < n; j++) /* cols */ + M[ sub2ind(i,j,n) ] = (float)rand()/(float)(RAND_MAX); + + return M; +} + +int cmpfunc (const void * a, const void * b) { + double v =*(double*)a - *(double*)b; + return (v < 0) ? -1 : (v > 0) ? 1 : 0; +} +/*! + * A unit testing like main function to profile our code + */ int main(int argc, char **argv) { - struct timeval start, end; /* time structs */ - double time = 0.0; /* execution time in ms */ - float *A, *B, *C; /* matrix declarations */ - int n; /* matrix size */ + struct timeval start, end; /* time structs */ + double time[MAX_ITER] = {0.0}; /* execution time array in ms */ + float *A, *B, *C; /* matrix declarations */ + int n; /* matrix size */ /* read matrix size (or use default) */ if (argc != 2){ - fprintf( stderr, "Uasge:\n %s n\n where n is the matrix size.\n", + fprintf( stderr, "Usage:\n %s n\n where n is the matrix size.\n", argv[0]); exit(1); } @@ -86,13 +94,13 @@ int main(int argc, char **argv) matrixMult( C, A, B, n ); gettimeofday(&end, NULL); - time = ( (end.tv_sec - start.tv_sec) * 1000.0 + /* sec to ms */ - (end.tv_usec - start.tv_usec) / 1000.0 ); /* us to ms */ + time[it] = (end.tv_sec - start.tv_sec) * 1000.0 + /* sec to ms */ + (end.tv_usec - start.tv_usec) / 1000.0; /* us to ms */ - printf("Iter: %d Time: %f ms\n", it, time); + printf("Iter: %d Time: %f ms\n", it, time[it]); } - /* we noeed to use the result -- verify it */ + /* we need to use the result -- verify it */ for (int i = 0; i < n; i++) { /* rows */ for (int j = 0; j < n; j++) { /* cols */ @@ -106,5 +114,12 @@ int main(int argc, char **argv) } } + + // median calculation + qsort ((void*)time, MAX_ITER, sizeof(time[0]), cmpfunc); + printf("Median: %f [msec]\n", (MAX_ITER % 2) ? + time[MAX_ITER/2] : + (time[MAX_ITER/2] + time[MAX_ITER/2 -1]) /2 + ); }