voidInitMatrix(int** a, int lines, int columns){ for (int i = 0; i < lines; i++) { for (int j = 0; j < columns; j++) { a[i][j] = i * columns + j; } } }
voidInitMatrixAsZero(int** a, int lines, int columns){ for (int i = 0; i < MATRIX_SIZE; i++) { for (int j = 0; j < MATRIX_SIZE; j++) { a[i][j] = 0; } } }
voidTrivialMatrixMatMul(int** a, int** b, int** c, int lines, int columns){ for (int i = 0; i < lines; i++) { for (int j = 0; j < columns; j++) { for (int k = 0; k < columns; k++) { c[i][j] += a[i][k] * b[k][j]; } } } }
intmain(int argc, char* argv[]){ int** a, ** b, ** c; a = newint* [MATRIX_SIZE]; b = newint* [MATRIX_SIZE]; c = newint* [MATRIX_SIZE]; for (int i = 0; i < MATRIX_SIZE; i++) { a[i] = newint[MATRIX_SIZE]; b[i] = newint[MATRIX_SIZE]; c[i] = newint[MATRIX_SIZE]; } InitMatrix(a, MATRIX_SIZE, MATRIX_SIZE); InitMatrix(b, MATRIX_SIZE, MATRIX_SIZE); InitMatrixAsZero(c, MATRIX_SIZE, MATRIX_SIZE);
voidTiledMatrixMatMul(int** a, int** b, int** c, int lines, int columns){ int tile_size = 80; for (int i = 0; i < lines; i += tile_size) { for (int j = 0; j < columns; j += tile_size) { for (int k = 0; k < columns; k += tile_size) { for (int ii = i; ii < i + tile_size; ii++) { if (ii >= lines) break; for (int kk = k; kk < k + tile_size; kk++) { if (kk >= columns) break; for (int jj = j; jj < j + tile_size; jj++) { if (jj >= columns) break; c[ii][jj] += a[ii][kk] * b[kk][jj]; } } } } } } }