/*! \file matmul.c \brief Matrix multiplication implementation. \author Nikos Pitsianis \author Dimitris Floros \author Christos Choutouridis 8997 \date 2020-05-05 */ #include "matmul.h" /*! * Square Matrix multiplication - 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) * \return none */ void matrixMult_ijk(float * const C, float const * const A, float const * const B, int const n) { for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) { int k =0; C[ sub2ind(i,j,n) ] = A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; for (k = 1; k < n; ++k) C[ sub2ind(i,j,n) ] += A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; } } /*! * Square Matrix multiplication - ikj * \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 */ void matrixMult_ikj(float * const C, float const * const A, float const * const B, int const n) { for (int i = 0; i < n; ++i) for (int k = 0; k < n; ++k) { if (!k) { for (int j = 0; j < n; ++j) C[ sub2ind(i,j,n) ] = A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; } else { for (int j = 0; j < n; ++j) C[ sub2ind(i,j,n) ] += A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; } } } /*! * Square Matrix multiplication - jik * \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 */ void matrixMult_jik(float * const C, float const * const A, float const * const B, int const n) { for (int j = 0; j < n; j++) for (int i = 0; i < n; i++) { int k =0; C[ sub2ind(i,j,n) ] = A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; for (k = 1; k < n; k++) C[ sub2ind(i,j,n) ] += A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; } } /*! * Square Matrix multiplication - jki * \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 */ void matrixMult_jki(float * const C, float const * const A, float const * const B, int const n) { for (int j = 0; j < n; ++j) for (int k = 0; k < n; ++k) { if (!k) { for (int i = 0; i < n; ++i) C[ sub2ind(i,j,n) ] = A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; } else { for (int i = 0; i < n; ++i) C[ sub2ind(i,j,n) ] += A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; } } } /*! * Square Matrix multiplication - kij * \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 */ void matrixMult_kij(float * const C, float const * const A, float const * const B, int const n) { for (int k = 0; k < n; ++k) { if (!k) { for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) C[ sub2ind(i,j,n) ] = A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; } else { for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) C[ sub2ind(i,j,n) ] += A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; } } } /*! * Square Matrix multiplication - kji * \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 */ void matrixMult_kji(float * const C, float const * const A, float const * const B, int const n) { for (int k = 0; k < n; ++k) { if (!k) { for (int j = 0; j < n; ++j) for (int i = 0; i < n; ++i) C[ sub2ind(i,j,n) ] = A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; } else { for (int j = 0; j < n; ++j) for (int i = 0; i < n; ++i) C[ sub2ind(i,j,n) ] += A[ sub2ind(i,k,n) ] * B[ sub2ind(k,j,n) ]; } } } /*! * 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