@@ -27,8 +27,37 @@ typedef struct _Chebiter_Data {
27
27
#endif
28
28
/* communicator */
29
29
MPI_Comm comm ;
30
+ /* stats */
31
+ size_t n_chebmv ;
32
+ double t_chebmv ;
30
33
} Chebiter_Data ;
31
34
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
+
32
61
/** @brief Return the residuals in Chebyshev iterations
33
62
*
34
63
* */
@@ -57,6 +86,9 @@ int pEVSL_ChebIterSetup(double lmin, double lmax, int deg, pevsl_Parcsr *A,
57
86
pEVSL_ParvecDupl (w , r );
58
87
pEVSL_ParvecDupl (w , p );
59
88
89
+ cheb -> n_chebmv = 0 ;
90
+ cheb -> t_chebmv = 0.0 ;
91
+
60
92
/* save the solver settings */
61
93
deg = PEVSL_MAX (deg , 0 );
62
94
cheb -> lb = lmin ;
@@ -108,7 +140,7 @@ void pEVSL_ChebIterSolv1(double *db, double *dx, void *data) {
108
140
int deg = Chebdata -> deg ;
109
141
MPI_Comm comm = Chebdata -> comm ;
110
142
/* matvec */
111
- pevsl_Matvec * mv = Chebdata -> mv ;
143
+ // pevsl_Matvec *mv = Chebdata->mv;
112
144
113
145
/* center and half width */
114
146
d = (Chebdata -> ub + Chebdata -> lb ) * 0.5 ;
@@ -131,7 +163,8 @@ void pEVSL_ChebIterSolv1(double *db, double *dx, void *data) {
131
163
pEVSL_ParvecCopy (p , & x );
132
164
pEVSL_ParvecScal (& x , alp );
133
165
/* 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);
135
168
/* r = b - w */
136
169
pEVSL_ParvecCopy (& b , r );
137
170
pEVSL_ParvecAxpy (-1.0 , w , r );
@@ -150,7 +183,8 @@ void pEVSL_ChebIterSolv1(double *db, double *dx, void *data) {
150
183
/* x = x + alp * p */
151
184
pEVSL_ParvecAxpy (alp , p , & x );
152
185
/* 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);
154
188
/* r = b - w */
155
189
pEVSL_ParvecCopy (& b , r );
156
190
pEVSL_ParvecAxpy (-1.0 , w , r );
@@ -189,7 +223,7 @@ void pEVSL_ChebIterSolv2(double *db, double *dx, void *data) {
189
223
int deg = Chebdata -> deg ;
190
224
MPI_Comm comm = Chebdata -> comm ;
191
225
/* matvec */
192
- pevsl_Matvec * mv = Chebdata -> mv ;
226
+ // pevsl_Matvec *mv = Chebdata->mv;
193
227
194
228
/* wrap b and x into pevsl_Parvec */
195
229
pEVSL_ParvecCreateShell (N , n , nfirst , comm , & b , db );
@@ -217,7 +251,8 @@ void pEVSL_ChebIterSolv2(double *db, double *dx, void *data) {
217
251
/* x = x + d */
218
252
pEVSL_ParvecAxpy (1.0 , d , & x );
219
253
/* 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 );
221
256
/* r = r - w */
222
257
pEVSL_ParvecAxpy (-1.0 , w , r );
223
258
/* rho1 = 1.0 / (2*sigma-rho) */
@@ -249,3 +284,25 @@ void pEVSL_ChebIterFree(void *vdata) {
249
284
PEVSL_FREE (vdata );
250
285
}
251
286
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
+
0 commit comments