Skip to content

Commit a887b37

Browse files
committed
print stats for chebiter
1 parent ec15fde commit a887b37

File tree

4 files changed

+75
-5
lines changed

4 files changed

+75
-5
lines changed

EXTERNAL/ITERSOL/chebiter.c

+62-5
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,37 @@ typedef struct _Chebiter_Data {
2727
#endif
2828
/* communicator */
2929
MPI_Comm comm;
30+
/* stats */
31+
size_t n_chebmv;
32+
double t_chebmv;
3033
} Chebiter_Data;
3134

35+
/**
36+
* @brief Perform matrix-vector product y = A * x in Chebiter
37+
*
38+
* */
39+
static inline void pEVSL_ChebMatvec(Chebiter_Data *cheb_data,
40+
pevsl_Parvec *x,
41+
pevsl_Parvec *y) {
42+
43+
PEVSL_CHKERR(!cheb_data->mv);
44+
45+
PEVSL_CHKERR(cheb_data->N != x->n_global);
46+
PEVSL_CHKERR(cheb_data->n != x->n_local);
47+
PEVSL_CHKERR(cheb_data->nfirst != x->n_first);
48+
PEVSL_CHKERR(cheb_data->N != y->n_global);
49+
PEVSL_CHKERR(cheb_data->n != y->n_local);
50+
PEVSL_CHKERR(cheb_data->nfirst != y->n_first);
51+
52+
double tms = pEVSL_Wtime();
53+
54+
cheb_data->mv->func(x->data, y->data, cheb_data->mv->data);
55+
56+
double tme = pEVSL_Wtime();
57+
cheb_data->t_chebmv += tme - tms;
58+
cheb_data->n_chebmv ++;
59+
}
60+
3261
/** @brief Return the residuals in Chebyshev iterations
3362
*
3463
* */
@@ -57,6 +86,9 @@ int pEVSL_ChebIterSetup(double lmin, double lmax, int deg, pevsl_Parcsr *A,
5786
pEVSL_ParvecDupl(w, r);
5887
pEVSL_ParvecDupl(w, p);
5988

89+
cheb->n_chebmv = 0;
90+
cheb->t_chebmv = 0.0;
91+
6092
/* save the solver settings */
6193
deg = PEVSL_MAX(deg, 0);
6294
cheb->lb = lmin;
@@ -108,7 +140,7 @@ void pEVSL_ChebIterSolv1(double *db, double *dx, void *data) {
108140
int deg = Chebdata->deg;
109141
MPI_Comm comm = Chebdata->comm;
110142
/* matvec */
111-
pevsl_Matvec *mv = Chebdata->mv;
143+
//pevsl_Matvec *mv = Chebdata->mv;
112144

113145
/* center and half width */
114146
d = (Chebdata->ub + Chebdata->lb) * 0.5;
@@ -131,7 +163,8 @@ void pEVSL_ChebIterSolv1(double *db, double *dx, void *data) {
131163
pEVSL_ParvecCopy(p, &x);
132164
pEVSL_ParvecScal(&x, alp);
133165
/* w = C * x */
134-
mv->func(x.data, w->data, mv->data);
166+
pEVSL_ChebMatvec(Chebdata, &x, w);
167+
//mv->func(x.data, w->data, mv->data);
135168
/* r = b - w */
136169
pEVSL_ParvecCopy(&b, r);
137170
pEVSL_ParvecAxpy(-1.0, w, r);
@@ -150,7 +183,8 @@ void pEVSL_ChebIterSolv1(double *db, double *dx, void *data) {
150183
/* x = x + alp * p */
151184
pEVSL_ParvecAxpy(alp, p, &x);
152185
/* w = C * x */
153-
mv->func(x.data, w->data, mv->data);
186+
pEVSL_ChebMatvec(Chebdata, &x, w);
187+
//mv->func(x.data, w->data, mv->data);
154188
/* r = b - w */
155189
pEVSL_ParvecCopy(&b, r);
156190
pEVSL_ParvecAxpy(-1.0, w, r);
@@ -189,7 +223,7 @@ void pEVSL_ChebIterSolv2(double *db, double *dx, void *data) {
189223
int deg = Chebdata->deg;
190224
MPI_Comm comm = Chebdata->comm;
191225
/* matvec */
192-
pevsl_Matvec *mv = Chebdata->mv;
226+
//pevsl_Matvec *mv = Chebdata->mv;
193227

194228
/* wrap b and x into pevsl_Parvec */
195229
pEVSL_ParvecCreateShell(N, n, nfirst, comm, &b, db);
@@ -217,7 +251,8 @@ void pEVSL_ChebIterSolv2(double *db, double *dx, void *data) {
217251
/* x = x + d */
218252
pEVSL_ParvecAxpy(1.0, d, &x);
219253
/* w = C * d */
220-
mv->func(d->data, w->data, mv->data);
254+
//mv->func(d->data, w->data, mv->data);
255+
pEVSL_ChebMatvec(Chebdata, d, w);
221256
/* r = r - w */
222257
pEVSL_ParvecAxpy(-1.0, w, r);
223258
/* rho1 = 1.0 / (2*sigma-rho) */
@@ -249,3 +284,25 @@ void pEVSL_ChebIterFree(void *vdata) {
249284
PEVSL_FREE(vdata);
250285
}
251286

287+
void pEVSL_ChebIterStatsPrint(void *data, FILE *fstats) {
288+
289+
Chebiter_Data *cheb = (Chebiter_Data *) data;
290+
291+
MPI_Comm comm = cheb->comm;
292+
double t_chebmv;
293+
unsigned long n_chebmv;
294+
int rank;
295+
296+
/* rank 0 prints */
297+
MPI_Comm_rank(comm, &rank);
298+
299+
MPI_Reduce(&cheb->t_chebmv, &t_chebmv, 1, MPI_DOUBLE, MPI_MAX, 0, comm);
300+
n_chebmv = cheb->n_chebmv;
301+
302+
if (rank == 0) {
303+
fprintf(fstats, "= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =\n");
304+
if (n_chebmv) { fprintf(fstats, " Matvec in ChebIter : %f (%8ld, avg %f)\n", t_chebmv, n_chebmv, t_chebmv / n_chebmv); }
305+
fprintf(fstats, "= = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =\n");
306+
}
307+
}
308+

EXTERNAL/ITERSOL/pevsl_itsol.h

+2
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@ void pEVSL_ChebIterFree(void *vdata);
2323

2424
double* pEVSL_ChebIterGetRes(void *data);
2525

26+
void pEVSL_ChebIterStatsPrint(void *data, FILE *fstats);
27+
2628
#endif

FORTRAN/pevsl_f90.c

+10
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,16 @@ void PEVSL_FORT(pevsl_chebiter)(int *type, double *b, double *x, uintptr_t *cheb
347347
}
348348
}
349349

350+
/** @brief Fortran interface for ChebIterStatsPrint */
351+
void PEVSL_FORT(pevsl_chebiterbstatsprint)(uintptr_t *chebf90) {
352+
353+
FILE *fstats = stdout;
354+
/* cast pointer */
355+
void *cheb = (void *) (*chebf90);
356+
357+
pEVSL_ChebIterStatsPrint(cheb, fstats);
358+
}
359+
350360
/** @brief Fortran interface for ChebIterFree */
351361
void PEVSL_FORT(pevsl_free_chebiterb)(uintptr_t *chebf90) {
352362

TESTS0/Chebiter/LapChebiter.c

+1
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ int main(int argc, char *argv[]) {
117117
PEVSL_SEQ_END(comm.comm_group_leader);
118118
}
119119

120+
pEVSL_ChebIterStatsPrint(Cheb, stdout);
120121
pEVSL_ChebIterFree(Cheb);
121122

122123
pEVSL_ParcsrFree(&A);

0 commit comments

Comments
 (0)