diff --git a/Q6-cache/info.txt b/Q6-cache/info.txt index b3d861e..3b0d10e 100644 --- a/Q6-cache/info.txt +++ b/Q6-cache/info.txt @@ -12,6 +12,6 @@ Βήμα 1: Λόγος διάμεσων χρόνων: 20.265193309 -Βήμα 2: Λόγος διάμεσων χρόνων: xxxx +Βήμα 2: Λόγος διάμεσων χρόνων: 24.61113257 (s=1024) Βήμα 3: Λόγος διάμεσων χρόνων: xxxx \ No newline at end of file diff --git a/Q6-cache/src/main.c b/Q6-cache/src/main.c index 47d6093..09460ff 100644 --- a/Q6-cache/src/main.c +++ b/Q6-cache/src/main.c @@ -52,7 +52,16 @@ mMult_ft multSelect (char* order) { else return matrixMult_ijk; } +mMultBlock_ft multBlockSelect (char* order) { + if (! strcmp ((const char*)order, "ijk")) return matrixMult_ijk_block; + else if (! strcmp ((const char*)order, "ikj")) return matrixMult_ikj_block; + else if (! strcmp ((const char*)order, "jik")) return matrixMult_jik_block; + else if (! strcmp ((const char*)order, "jki")) return matrixMult_jki_block; + else if (! strcmp ((const char*)order, "kij")) return matrixMult_kij_block; + else if (! strcmp ((const char*)order, "kji")) return matrixMult_kji_block; + else return matrixMult_ijk_block; +} /*! * A unit testing like main function to profile our code @@ -61,36 +70,48 @@ int main(int argc, char **argv) { struct timeval start, end; /* time structs */ double time[MAX_ITER] = {0.0}; /* execution time array in ms */ float *A, *B, *C; /* matrix declarations */ + mMult_ft mMult =NULL; + mMultBlock_ft mMultBlock =NULL; /* read matrix size (or use default) */ - if (argc != 3){ + if (argc < 3){ fprintf( stderr, "Usage:\n" - "%s n order, where \n" + "%s n order [block], where \n" " n: is the matrix size.\n" - " order: the loop order ex: ijk , jik, ...\n", + " order: the loop order ex: ijk , jik, ...\n" + " block: Optional block size\n", argv[0]); exit(1); } int n = atoi( argv[1] ); - mMult_ft mMult = multSelect(argv[2]); + if (argc == 4) + mMultBlock = multBlockSelect(argv[2]); + else + mMult = multSelect(argv[2]); /* initialize matrices */ A = matrixInit( n ); B = matrixInit( n ); C = (float *) malloc( n*n*sizeof(float) ); - /* compute matrix multiplication */ - for (int it = 0; it < MAX_ITER; it++) { - gettimeofday(&start, NULL); - mMult( C, A, B, n ); - gettimeofday(&end, NULL); - - time[it] = (end.tv_sec - start.tv_sec) * 1000.0 + /* sec to ms */ - (end.tv_usec - start.tv_usec) / 1000.0; /* us to ms */ + /* compute matrix multiplication */ + for (int it = 0; it < MAX_ITER; it++) { + if (argc == 4) { + gettimeofday(&start, NULL); + mMultBlock( C, A, B, n, atoi(argv[3]) ); + gettimeofday(&end, NULL); + } + else { + gettimeofday(&start, NULL); + mMult( C, A, B, n ); + gettimeofday(&end, NULL); + } + 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[it]); - } + printf("Iter: %d Time: %f ms\n", it, time[it]); + } /* we need to use the result -- verify it */ for (int i = 0; i < n; i++) { /* rows */ diff --git a/Q6-cache/src/matmul.c b/Q6-cache/src/matmul.c index bf24135..0f495e0 100644 --- a/Q6-cache/src/matmul.c +++ b/Q6-cache/src/matmul.c @@ -116,7 +116,6 @@ void matrixMult_kij(float * const C, float const * const A, float const * const * \param B pointer to input matrix B * \param n Size of matrices (both sizes) * \return none - * xxx */ void matrixMult_kji(float * const C, float const * const A, float const * const B, int const n) { for (int k = 0; k < n; ++k) { @@ -132,6 +131,147 @@ void matrixMult_kji(float * const C, float const * const A, float const * const } } +/*! + * Square Matrix multiplication in blocks - ijk + * \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) + * \param s The block size + * \return none + */ +void matrixMult_ijk_block(float * const C, float const * const A, float const * const B, int const n, int const s) { + for (int I =0; I