diff --git a/2025.03.21/08Ex/solve.c b/2025.03.21/08Ex/solve.c index 35901f7..f4fb849 100644 --- a/2025.03.21/08Ex/solve.c +++ b/2025.03.21/08Ex/solve.c @@ -5,50 +5,57 @@ int t8_solve(double *a, int m, int n) { + const int BS = 30; int max_i = 0, max_j = 0; double maximum = 0; - - for (int j = 0; j < n; j++) - { - double sum_j = 0; - for (int k = 0; k < m; k++) - sum_j += fabs(a[k*n + j]); - - for (int i = 0; i < m; i++) - { - double sum_i = 0; - double aij = fabs(a[i*n + j]); - sum_j -= aij; - - if (j == 0) + + for (int jj = 0; jj < n; jj += BS) + for (int j = jj; j < jj + BS && j < n; j++) { - double num = a[i*n]; - for (int k = 1; k < n; k++) - sum_i += fabs(a[i*n + k]); - - a[i*n] = copysign(fabs(num) + sum_i, num); - } - else - sum_i = fabs(a[i*n]) - fabs(a[i*n + j]); - - if (((sum_j + sum_i) - maximum) > eps) - maximum = (sum_j + sum_i), max_i = i, max_j = j; + double sum_j = 0; + for (int ii = 0; ii < m; ii += BS) + for (int k = ii; k < ii + BS && k < m; k++) + sum_j += fabs(a[k*n + j]); - sum_j += aij; - } - } + for (int ii = 0; ii < m; ii += BS) + for (int i = ii; i < ii + BS && i < m; i++) + { + double sum_i = 0; + double aij = fabs(a[i*n + j]); + sum_j -= aij; + + if (j == 0) + { + double num = a[i*n]; + for (int kk = 1; kk < n; kk += BS) + for (int k = kk; k < kk + BS && k < n; k++) + sum_i += fabs(a[i*n + k]); + + a[i*n] = copysign(fabs(num) + sum_i, num); + } + else + sum_i = fabs(a[i*n]) - fabs(a[i*n + j]); + + if (((sum_j + sum_i) - maximum) > eps) + maximum = (sum_j + sum_i), max_i = i, max_j = j; + + sum_j += aij; + } + } if (max_j != 0) - for (int i = 0; i < m; i++) - { - double orig = a[i*n]; - double num = fabs(orig); + for (int ii = 0; ii < m; ii += BS) + for (int i = ii; i < ii + BS && i < m; i++) + { + double orig = a[i*n]; + double num = fabs(orig); + + for (int jj = 1; jj < n; jj += BS) + for (int j = jj; j < jj + BS && j < n; j++) + num -= fabs(a[i*n + j]); - for (int j = 1; j < n; j++) - num -= fabs(a[i*n + j]); - - a[i*n] = copysign(num, orig); - } + a[i*n] = copysign(num, orig); + } for (int l = max_j+1, del_j = 1; l < max_i*n; l++) { diff --git a/2025.03.21/09Ex/solve.c b/2025.03.21/09Ex/solve.c index 51263ae..c0a4814 100644 --- a/2025.03.21/09Ex/solve.c +++ b/2025.03.21/09Ex/solve.c @@ -5,25 +5,30 @@ int t9_solve(double *a, int m, int n) { + const int BS = 32; int max_i = 0, max_j = 0; double maximum = 0; - for (int j = 0; j < n; j++) - for (int i = 0; i < m; i++) - { - double sum_i = 0; - double sum_j = 0; - double aij = a[i*n + j]; + for (int jj = 0; jj < n; jj += BS) + for (int ii = 0; ii < m; ii += BS) + for (int j = jj; j < jj + BS && j < n; j++) + for (int i = ii; i < ii + BS && i < m; i++) + { + double sum_i = 0; + double sum_j = 0; + double aij = a[i*n + j]; + + for (int kk = 0; kk < n; kk += BS) + for (int k = kk; k < kk + BS && k < n; k++) if (k != j) + sum_i += fabs(a[i*n + k] - aij); - for (int k = 0; k < n; k++) if (k != j) - sum_i += fabs(a[i*n + k] - aij); - - for (int k = 0; k < m; k++) if (i != k) - sum_j += fabs(a[k*n + j] - aij); + for (int kk = 0; kk < m; kk += BS) + for (int k = kk; k < kk + BS && k < m; k++) if (i != k) + sum_j += fabs(a[k*n + j] - aij); - if (((sum_j + sum_i) - maximum) > eps) - maximum = (sum_j + sum_i), max_i = i, max_j = j; - } + if (((sum_j + sum_i) - maximum) > eps) + maximum = (sum_j + sum_i), max_i = i, max_j = j; + } for (int l = max_j+1, del_j = 1; l < max_i*n; l++) { diff --git a/2025.03.21/10Ex/solve.c b/2025.03.21/10Ex/solve.c index 0c814b6..5e33c03 100644 --- a/2025.03.21/10Ex/solve.c +++ b/2025.03.21/10Ex/solve.c @@ -5,16 +5,19 @@ int t10_solve(double *a, int m, int n) { + const int BS = 30; int min_i = 0, min_j = 0; double minimum = DBL_MAX; double inn = 1./n, inm = 1./m; - for (int i = 0; i < m; i++) + for (int ii = 0; ii < m; ii += BS) + for (int i = ii; i < ii + BS && i < m; i++) { double cur = 0; double sum = 0; double sq_sum = 0; - for (int j = 0; j < n; j++) + for (int jj = 0; jj < n; jj += BS) + for (int j = jj; j < jj + BS && j < n; j++) { double temp = a[i*n + j]; sum += temp; @@ -29,9 +32,10 @@ int t10_solve(double *a, int m, int n) } minimum = DBL_MAX; - for (int j = 0; j < n; j++) + + for (int jj = 0; jj < n; jj += BS) + for (int j = jj; j < jj + BS && j < n; j++) { - const int BS = 32; double cur = 0; double sum = 0; double sq_sum = 0;