This repository was archived by the owner on Nov 9, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsolver_blas.c
78 lines (72 loc) · 1.84 KB
/
solver_blas.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
/*
* Tema 2 ASC
* 2020 Spring
*/
#include <cblas.h>
#include "utils.h"
#define IDX2L(i, j, N) (((i) * (N)) + (j))
/*
* Add your BLAS implementation here
*/
double* my_solver(int N, double *A, double *B) {
int i, j;
double alpha = 1.0;
/* Calculate the final result in C matrix */
double *C = calloc(N * N, sizeof(double));
if (C == NULL) {
return NULL;
}
/* Calculate the B*At part in D */
double *D = calloc(N * N, sizeof(double));
if (D == NULL) {
return NULL;
}
/* Calculate the A * A in A_square */
double *A_square = calloc(N * N, sizeof(double));
if (A_square == NULL) {
return NULL;
}
/* Copy B matrix in D matrix */
for (i = 0; i != N; i++) {
for (j = 0; j != N; j++) {
D[IDX2L(i, j, N)] = B[IDX2L(i, j, N)];
}
}
/* Copy A matrix in A_square matrix */
for (i = 0; i != N; i++) {
for (j = 0; j != N; j++) {
if ( i <= j) {
A_square[IDX2L(i, j, N)] = A[IDX2L(i, j, N)];
}
}
}
/*
* Multiply matrixes B * At, where At is A transposed
* The result is saved in D matrix
*/
cblas_dtrmm(CblasRowMajor, CblasRight, CblasUpper, CblasTrans,
CblasNonUnit, N, N, alpha, A, N, D, N);
/*
* Multiply matrixes A * A, saved result in A_square
* Matrix A_square is a triangular matrix
*/
cblas_dtrmm(CblasRowMajor, CblasRight, CblasUpper, CblasNoTrans,
CblasNonUnit, N, N, alpha, A, N, A_square, N);
/*
* Multiply matrixes A_square * B, where A_square = A * A
* The result is saved in B matrix
*/
cblas_dtrmm(CblasRowMajor, CblasLeft, CblasUpper, CblasNoTrans,
CblasNonUnit, N, N, alpha, A_square, N, B, N);
/* Add matrixes D and B, save the result in C matrix */
for (i = 0; i != N; i++) {
for (j = 0; j != N; j++) {
C[IDX2L(i, j, N)] = D[IDX2L(i, j, N)] + B[IDX2L(i, j, N)];
}
}
/* Free memory from D and A_square */
free(D);
free(A_square);
printf("BLAS SOLVER\n");
return C;
}