26 int minMN =
min(M, N);
28 float *work = (
float *)malloc(minMN*
sizeof(
float));
30 eps = LAPACKE_slamch_work(
'e');
35 float *Id = (
float *) malloc(minMN*minMN*
sizeof(
float));
36 memset((
void*)Id, 0, minMN*minMN*
sizeof(
float));
37 for (i = 0; i < minMN; i++)
38 Id[i*minMN+i] = (
float)1.0;
42 cblas_ssyrk(
CblasColMajor,
CblasUpper,
CblasTrans, N, M, alpha, Q, LDQ, beta, Id, N);
44 cblas_ssyrk(
CblasColMajor,
CblasUpper,
CblasNoTrans, M, N, alpha, Q, LDQ, beta, Id, M);
46 normQ = LAPACKE_slansy_work(LAPACK_COL_MAJOR,
'i',
'u', minMN, Id, minMN, work);
48 printf(
"============\n");
49 printf(
"Checking the orthogonality of Q \n");
50 printf(
"||Id-Q'*Q||_oo / (N*eps) = %e \n",normQ/(minMN*eps));
52 if ( isnan(normQ / (minMN * eps)) || (normQ / (minMN * eps) > 10.0) ) {
53 printf(
"-- Orthogonality is suspicious ! \n");
57 printf(
"-- Orthogonality is CORRECT ! \n");
74 int info_factorization;
78 eps = LAPACKE_slamch_work(
'e');
80 float *Ql = (
float *)malloc(M*N*
sizeof(
float));
81 float *Residual = (
float *)malloc(M*N*
sizeof(
float));
82 float *work = (
float *)malloc(
max(M,N)*
sizeof(float));
89 float *R = (
float *)malloc(N*N*
sizeof(
float));
90 memset((
void*)R, 0, N*N*
sizeof(
float));
91 LAPACKE_slacpy_work(LAPACK_COL_MAJOR,
'u', M, N, A2, LDA, R, N);
94 memset((
void*)Ql, 0, M*N*
sizeof(
float));
95 cblas_sgemm(
CblasColMajor,
CblasNoTrans,
CblasNoTrans, M, N, N, (alpha), Q, LDA, R, N, (beta), Ql, M);
100 float *
L = (
float *)malloc(M*M*
sizeof(
float));
101 memset((
void*)L, 0, M*M*
sizeof(
float));
102 LAPACKE_slacpy_work(LAPACK_COL_MAJOR,
'l', M, N, A2, LDA, L, M);
105 memset((
void*)Ql, 0, M*N*
sizeof(
float));
106 cblas_sgemm(
CblasColMajor,
CblasNoTrans,
CblasNoTrans, M, N, M, (alpha), L, M, Q, LDA, (beta), Ql, M);
111 for (i = 0; i < M; i++)
112 for (j = 0 ; j < N; j++)
113 Residual[j*M+i] = A1[j*LDA+i]-Ql[j*M+i];
115 Rnorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', M, N, Residual, M, work);
116 Anorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', M, N, A2, LDA, work);
119 printf(
"============\n");
120 printf(
"Checking the QR Factorization \n");
121 printf(
"-- ||A-QR||_oo/(||A||_oo.N.eps) = %e \n",Rnorm/(Anorm*N*eps));
124 printf(
"============\n");
125 printf(
"Checking the LQ Factorization \n");
126 printf(
"-- ||A-LQ||_oo/(||A||_oo.N.eps) = %e \n",Rnorm/(Anorm*N*eps));
129 if (isnan(Rnorm / (Anorm * N *eps)) || (Rnorm / (Anorm * N * eps) > 10.0) ) {
130 printf(
"-- Factorization is suspicious ! \n");
131 info_factorization = 1;
134 printf(
"-- Factorization is CORRECT ! \n");
135 info_factorization = 0;
138 free(work); free(Ql); free(Residual);
140 return info_factorization;
151 int info_factorization;
155 eps = LAPACKE_slamch_work(
'e');
157 float *Residual = (
float *)malloc(N*N*
sizeof(
float));
158 float *L1 = (
float *)malloc(N*N*
sizeof(
float));
159 float *L2 = (
float *)malloc(N*N*
sizeof(
float));
160 float *work = (
float *)malloc(N*
sizeof(
float));
162 memset((
void*)L1, 0, N*N*
sizeof(
float));
163 memset((
void*)L2, 0, N*N*
sizeof(
float));
167 LAPACKE_slacpy_work(LAPACK_COL_MAJOR,
' ', N, N, A1, LDA, Residual, N);
171 LAPACKE_slacpy_work(LAPACK_COL_MAJOR,
'u', N, N, A2, LDA, L1, N);
172 LAPACKE_slacpy_work(LAPACK_COL_MAJOR,
'u', N, N, A2, LDA, L2, N);
173 cblas_strmm(
CblasColMajor,
CblasLeft,
CblasUpper,
CblasTrans,
CblasNonUnit, N, N, (alpha), L1, N, L2, N);
176 LAPACKE_slacpy_work(LAPACK_COL_MAJOR,
'l', N, N, A2, LDA, L1, N);
177 LAPACKE_slacpy_work(LAPACK_COL_MAJOR,
'l', N, N, A2, LDA, L2, N);
178 cblas_strmm(
CblasColMajor,
CblasRight,
CblasLower,
CblasTrans,
CblasNonUnit, N, N, (alpha), L1, N, L2, N);
182 for (i = 0; i < N; i++)
183 for (j = 0; j < N; j++)
184 Residual[j*N+i] = L2[j*N+i] - Residual[j*N+i];
186 Rnorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', N, N, Residual, N, work);
187 Anorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', N, N, A1, LDA, work);
189 printf(
"============\n");
190 printf(
"Checking the Cholesky Factorization \n");
191 printf(
"-- ||L'L-A||_oo/(||A||_oo.N.eps) = %e \n",Rnorm/(Anorm*N*eps));
193 if ( isnan(Rnorm/(Anorm*N*eps)) || (Rnorm/(Anorm*N*eps) > 10.0) ){
194 printf(
"-- Factorization is suspicious ! \n");
195 info_factorization = 1;
198 printf(
"-- Factorization is CORRECT ! \n");
199 info_factorization = 0;
202 free(Residual); free(L1); free(L2); free(work);
204 return info_factorization;
211 float alpha,
float *
A,
int LDA,
213 float beta,
float *Cplasma,
214 float *Cref,
int LDC,
215 float *Cinitnorm,
float *Cplasmanorm,
float *Clapacknorm )
217 float beta_const = -1.0;
219 float *work = (
float *)malloc(
max(K,
max(M, N))*
sizeof(float));
221 *Cinitnorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', M, N, Cref, LDC, work);
222 *Cplasmanorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', M, N, Cplasma, LDC, work);
225 (alpha), A, LDA, B, LDB, (beta), Cref, LDC);
227 *Clapacknorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', M, N, Cref, LDC, work);
229 cblas_saxpy(LDC * N, (beta_const), Cplasma, 1, Cref, 1);
231 Rnorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', M, N, Cref, LDC, work);
242 int M,
int NRHS,
float alpha,
244 float *Bplasma,
float *Bref,
int LDB,
245 float *Binitnorm,
float *Bplasmanorm,
float *Blapacknorm )
247 float beta_const = -1.0;
249 float *work = (
float *)malloc(
max(M, NRHS)*
sizeof(float));
252 *Binitnorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', M, NRHS, Bref, LDB, work);
253 *Bplasmanorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'm', M, NRHS, Bplasma, LDB, work);
257 (alpha), A, LDA, Bref, LDB);
259 *Blapacknorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'm', M, NRHS, Bref, LDB, work);
261 cblas_saxpy(LDB * NRHS, (beta_const), Bplasma, 1, Bref, 1);
263 Rnorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'm', M, NRHS, Bref, LDB, work);
264 Rnorm = Rnorm / *Blapacknorm;
277 float *
B,
float *X,
int LDB,
278 float *anorm,
float *bnorm,
float *xnorm )
284 float *work = (
float *)malloc(
max(M, N)*
sizeof(float));
286 *anorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', M, N, A, LDA, work);
287 *xnorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', M, NRHS, X, LDB, work);
288 *bnorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', N, NRHS, B, LDB, work);
290 cblas_sgemm(
CblasColMajor,
CblasNoTrans,
CblasNoTrans, M, NRHS, N, (zone), A, LDA, X, LDB, (mzone), B, LDB);
292 Rnorm = LAPACKE_slange_work(LAPACK_COL_MAJOR,
'i', N, NRHS, B, M, work);