hw1: compiler flags

This commit is contained in:
Claudio Maggioni 2022-10-12 11:02:19 +02:00
parent abbd0275ec
commit fc03b33196
2 changed files with 25 additions and 29 deletions

View File

@ -3,8 +3,8 @@
#
CC = gcc
OPT = -O2
CFLAGS = -Wall -std=gnu99 $(OPT)
OPT = -O3
CFLAGS = -Wall -std=gnu99 -march=haswell -ffast-math $(OPT)
LDFLAGS = -Wall
# librt is needed for clock_gettime
LDLIBS = -lrt -Wl,--no-as-needed -L${MKLROOT}/lib/intel64 -lmkl_intel_lp64 -lmkl_core -lmkl_sequential -lpthread -lm -ldl -m64 -I${MKLROOT}/include

View File

@ -15,29 +15,11 @@ LDLIBS = -lrt -Wl,--start-group $(MKLROOT)/lib/intel64/libmkl_intel_lp64.a $(MKL
*/
#define MIN(a,b) (((a)<(b))?(a):(b))
const char* dgemm_desc = "Block-based dgemm.";
const int block_size = 26;
inline int min(int a, int b) {
return a < b ? a : b;
}
inline void naivemm(int r_min, int r_max, int k_min, int k_max, int c_min, int c_max, int n, double* A_row, double* B, double* C_temp) {
for (int i = r_min, ii = 0; i < r_max; ++i, ++ii) {
for (int j = c_min, jj = 0; j < c_max; ++j, ++jj) {
for (int k = k_min; k < k_max; k++) {
C_temp[ii + jj * block_size] += A_row[i * n + k] * B[k + j * n];
}
}
}
}
inline void store_c(double* C, double* C_temp, int r_min, int r_max, int c_min, int c_max, int n) {
for (int j = c_min, jj = 0; j < c_max; ++j, ++jj) {
memcpy(C + j * n + r_min, C_temp + jj * block_size, (r_max - r_min) * sizeof(double));
}
}
int block_size = 32;
/* This routine performs a dgemm operation
* C := C + A * B
@ -57,19 +39,33 @@ void square_dgemm(int n, double* A, double* B, double* C) {
}
for (int i = 0; i < n; i += block_size) {
int i_next = min(i + block_size, n);
int i_next = MIN(i + block_size, n);
for (int j = 0; j < n; j += block_size) {
int j_next = min(j + block_size, n);
int j_next = MIN(j + block_size, n);
// clear matrix C_temp
memset(C_temp, 0, block_size * block_size * sizeof(double));
for (int k = 0; k < n; k += block_size) {
int k_next = min(k + block_size, n);
naivemm(i, i_next, k, k_next, j, j_next, n, A_row, B, C_temp);
int k_next = MIN(k + block_size, n);
// begin naivemm
for (int i2 = i, ii2 = 0; i2 < i_next; ++i2, ++ii2) {
for (int j2 = j, jj2 = 0; j2 < j_next; ++j2, ++jj2) {
for (int k2 = k; k2 < k_next; k2++) {
C_temp[ii2 + jj2 * block_size] += A_row[i2 * n + k2] * B[k2 + j2 * n];
}
}
}
// end naivemm
}
store_c(C, C_temp, i, i_next, j, j_next, n);
// store C_temp in C
for (int j2 = j, jj2 = 0; j2 < j_next; ++j2, ++jj2) {
memcpy(C + j2 * n + i, C_temp + jj2 * block_size, (i_next - i) * sizeof(double));
}
// end store C_temp
}
}
}