Skip to content

Commit a3c43a7

Browse files
committed
WIP: interface for calling two-flavour QPhiX CG and BiCGstab from invert_doublet_eo in place, solver does not converge yet
1 parent 9941c2c commit a3c43a7

10 files changed

+253
-146
lines changed

invert_clover_eo.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ int invert_clover_eo(spinor * const Even_new, spinor * const Odd_new,
6666
const int solver_flag, const int rel_prec, const int even_odd_flag,
6767
solver_params_t solver_params,
6868
su3 *** gf, matrix_mult Qsq, matrix_mult Qm,
69-
const ExternalInverter inverter, const SloppyPrecision sloppy, const CompressionType compression) {
69+
const ExternalInverter external_inverter, const SloppyPrecision sloppy, const CompressionType compression) {
7070
int iter;
7171

7272
if(even_odd_flag) {
@@ -75,7 +75,7 @@ int invert_clover_eo(spinor * const Even_new, spinor * const Odd_new,
7575
}
7676

7777
#ifdef QUDA
78-
if( inverter==QUDA_INVERTER ) {
78+
if( external_inverter==QUDA_INVERTER ) {
7979
return invert_eo_quda(Even_new, Odd_new, Even, Odd,
8080
precision, max_iter,
8181
solver_flag, rel_prec,
@@ -109,10 +109,10 @@ int invert_clover_eo(spinor * const Even_new, spinor * const Odd_new,
109109

110110
/* Here we invert the hermitean operator squared */
111111
#ifdef TM_USE_QPHIX
112-
if( inverter==QPHIX_INVERTER ) {
112+
if( external_inverter==QPHIX_INVERTER ) {
113113
// QPhiX inverts M(mu)M(mu)^dag or M(mu), no gamma_5 multiplication required
114114
iter = invert_eo_qphix_oneflavour(Odd_new, g_spinor_field[DUM_DERI],
115-
precision, max_iter,
115+
max_iter, precision,
116116
solver_flag, rel_prec,
117117
solver_params,
118118
sloppy,

invert_clover_eo.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@ int invert_clover_eo(spinor * const Even_new, spinor * const Odd_new,
1313
const int solver_flag, const int rel_prec,
1414
const int even_odd_flag, solver_params_t solver_params,
1515
su3 *** gf, matrix_mult Qsq, matrix_mult Qm,
16-
const ExternalInverter inverter, const SloppyPrecision sloppy, const CompressionType compression);
16+
const ExternalInverter external_inverter, const SloppyPrecision sloppy, const CompressionType compression);
1717

1818
#endif

invert_doublet_eo.c

+48-39
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,9 @@
5050
#ifdef QUDA
5151
# include "quda_interface.h"
5252
#endif
53-
53+
#ifdef TM_USE_QPHIX
54+
#include "qphix_interface.h"
55+
#endif
5456

5557
#ifdef HAVE_GPU
5658
# include"GPU/cudadefs.h"
@@ -63,20 +65,19 @@ extern su3* g_trafo;
6365
# endif
6466
#endif
6567

66-
6768
int invert_doublet_eo(spinor * const Even_new_s, spinor * const Odd_new_s,
6869
spinor * const Even_new_c, spinor * const Odd_new_c,
6970
spinor * const Even_s, spinor * const Odd_s,
7071
spinor * const Even_c, spinor * const Odd_c,
7172
const double precision, const int max_iter,
7273
const int solver_flag, const int rel_prec,
73-
solver_params_t solver_params, const ExternalInverter inverter,
74+
solver_params_t solver_params, const ExternalInverter external_inverter,
7475
const SloppyPrecision sloppy, const CompressionType compression) {
7576

7677
int iter = 0;
7778

7879
#ifdef QUDA
79-
if( inverter==QUDA_INVERTER ) {
80+
if( external_inverter==QUDA_INVERTER ) {
8081
return invert_doublet_eo_quda( Even_new_s, Odd_new_s, Even_new_c, Odd_new_c,
8182
Even_s, Odd_s, Even_c, Odd_c,
8283
precision, max_iter,
@@ -118,43 +119,51 @@ int invert_doublet_eo(spinor * const Even_new_s, spinor * const Odd_new_s,
118119
printf("# Using CG for TMWILSON flavour doublet!\n");
119120
fflush(stdout);
120121
}
121-
gamma5(g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI], VOLUME/2);
122-
gamma5(g_spinor_field[DUM_DERI+1], g_spinor_field[DUM_DERI+1], VOLUME/2);
123-
122+
if ( external_inverter == NO_EXT_INV ){
123+
gamma5(g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI], VOLUME/2);
124+
gamma5(g_spinor_field[DUM_DERI+1], g_spinor_field[DUM_DERI+1], VOLUME/2);
124125

125126
#ifdef HAVE_GPU
126-
if (usegpu_flag) { // GPU, mixed precision solver
127-
# if ( defined TM_USE_MPI && defined PARALLELT )
128-
iter = mixedsolve_eo_nd(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
129-
max_iter, precision, rel_prec);
130-
# elif ( !defined TM_USE_MPI && !defined PARALLELT )
131-
iter = mixedsolve_eo_nd(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
132-
max_iter, precision, rel_prec);
133-
# else
134-
printf("MPI and/or PARALLELT are not appropriately set for the GPU implementation. Aborting...\n");
135-
exit(-1);
136-
# endif
137-
}
138-
else { // CPU, conjugate gradient
139-
iter = cg_her_nd(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
140-
max_iter, precision, rel_prec,
141-
VOLUME/2, &Qtm_pm_ndpsi);
142-
}
127+
if (usegpu_flag) { // GPU, mixed precision solver
128+
# if ( defined TM_USE_MPI && defined PARALLELT )
129+
iter = mixedsolve_eo_nd(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
130+
max_iter, precision, rel_prec);
131+
# elif ( !defined TM_USE_MPI && !defined PARALLELT )
132+
iter = mixedsolve_eo_nd(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
133+
max_iter, precision, rel_prec);
134+
# else
135+
printf("MPI and/or PARALLELT are not appropriately set for the GPU implementation. Aborting...\n");
136+
exit(-1);
137+
# endif
138+
}
139+
else { // CPU, conjugate gradient
140+
iter = cg_her_nd(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
141+
max_iter, precision, rel_prec,
142+
VOLUME/2, &Qtm_pm_ndpsi);
143+
}
143144
#else // CPU, conjugate gradient
144-
if(solver_flag == RGMIXEDCG){
145-
iter = rg_mixed_cg_her_nd(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
146-
solver_params, max_iter, precision, rel_prec, VOLUME/2,
147-
&Qtm_pm_ndpsi, &Qtm_pm_ndpsi_32);
148-
}
149-
else {
150-
iter = cg_her_nd(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
151-
max_iter, precision, rel_prec, VOLUME/2, &Qtm_pm_ndpsi);
152-
}
145+
if(solver_flag == RGMIXEDCG){
146+
iter = rg_mixed_cg_her_nd(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
147+
solver_params, max_iter, precision, rel_prec, VOLUME/2,
148+
&Qtm_pm_ndpsi, &Qtm_pm_ndpsi_32);
149+
}
150+
else {
151+
iter = cg_her_nd(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
152+
max_iter, precision, rel_prec, VOLUME/2, &Qtm_pm_ndpsi);
153+
}
153154
#endif
154-
155-
156-
Qtm_dagger_ndpsi(Odd_new_s, Odd_new_c,
157-
Odd_new_s, Odd_new_c);
155+
Qtm_dagger_ndpsi(Odd_new_s, Odd_new_c,
156+
Odd_new_s, Odd_new_c);
157+
} // if(NO_EXT_INV)
158+
#ifdef TM_USE_QPHIX
159+
else if (external_inverter == QPHIX_INVERTER ) {
160+
// using QPhiX, we invert M M^dagger y = b, so we don't need gamma_5 multiplications
161+
iter = invert_eo_qphix_twoflavour(Odd_new_s, Odd_new_c, g_spinor_field[DUM_DERI], g_spinor_field[DUM_DERI+1],
162+
max_iter, precision, solver_flag, rel_prec,
163+
solver_params, sloppy, compression);
164+
// and it multiplies y internally by M^dagger, returning M^{-1} b as required
165+
}
166+
#endif // TM_USE_QPHIX
158167

159168
/* Reconstruct the even sites */
160169
Hopping_Matrix(EO, g_spinor_field[DUM_DERI], Odd_new_s);
@@ -188,12 +197,12 @@ int invert_cloverdoublet_eo(spinor * const Even_new_s, spinor * const Odd_new_s,
188197
spinor * const Even_c, spinor * const Odd_c,
189198
const double precision, const int max_iter,
190199
const int solver_flag, const int rel_prec, solver_params_t solver_params,
191-
const ExternalInverter inverter, const SloppyPrecision sloppy, const CompressionType compression) {
200+
const ExternalInverter external_inverter, const SloppyPrecision sloppy, const CompressionType compression) {
192201

193202
int iter = 0;
194203

195204
#ifdef QUDA
196-
if( inverter==QUDA_INVERTER ) {
205+
if( external_inverter==QUDA_INVERTER ) {
197206
return invert_doublet_eo_quda( Even_new_s, Odd_new_s, Even_new_c, Odd_new_c,
198207
Even_s, Odd_s, Even_c, Odd_c,
199208
precision, max_iter,

invert_doublet_eo.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ int invert_doublet_eo(spinor * const Even_new_s, spinor * const Odd_new_s,
4040
spinor * const Even_c, spinor * const Odd_c,
4141
const double precision, const int max_iter,
4242
const int solver_flag, const int rel_prec, solver_params_t solver_params,
43-
const ExternalInverter inverter, const SloppyPrecision sloppy, const CompressionType compression);
43+
const ExternalInverter extenral_inverter, const SloppyPrecision sloppy, const CompressionType compression);
4444

4545

4646
/* This is the full matrix multiplication */
@@ -57,5 +57,5 @@ int invert_cloverdoublet_eo(spinor * const Even_new_s, spinor * const Odd_new_s,
5757
spinor * const Even_c, spinor * const Odd_c,
5858
const double precision, const int max_iter,
5959
const int solver_flag, const int rel_prec, solver_params_t solver_params,
60-
const ExternalInverter inverter, const SloppyPrecision sloppy, const CompressionType compression);
60+
const ExternalInverter external_inverter, const SloppyPrecision sloppy, const CompressionType compression);
6161
#endif

invert_eo.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -86,12 +86,12 @@ int invert_eo(spinor * const Even_new, spinor * const Odd_new,
8686
const int solver_flag, const int rel_prec,
8787
const int sub_evs_flag, const int even_odd_flag,
8888
const int no_extra_masses, double * const extra_masses, solver_params_t solver_params, const int id,
89-
const ExternalInverter inverter, const SloppyPrecision sloppy, const CompressionType compression ) {
89+
const ExternalInverter external_inverter, const SloppyPrecision sloppy, const CompressionType compression ) {
9090

9191
int iter = 0;
9292

9393
#ifdef QUDA
94-
if( inverter==QUDA_INVERTER ) {
94+
if( external_inverter==QUDA_INVERTER ) {
9595
return invert_eo_quda(Even_new, Odd_new, Even, Odd,
9696
precision, max_iter,
9797
solver_flag, rel_prec,
@@ -159,10 +159,10 @@ int invert_eo(spinor * const Even_new, spinor * const Odd_new,
159159
/* matrix to get the odd sites */
160160

161161
#ifdef TM_USE_QPHIX
162-
if( inverter==QPHIX_INVERTER ) {
162+
if( external_inverter==QPHIX_INVERTER ) {
163163
// QPhiX inverts M(mu)M(mu)^dag or M(mu), no gamma_5 source multiplication required
164164
iter = invert_eo_qphix_oneflavour(Odd_new, g_spinor_field[DUM_DERI],
165-
precision, max_iter,
165+
max_iter, precision,
166166
solver_flag, rel_prec,
167167
solver_params,
168168
sloppy,

invert_eo.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,6 @@ int invert_eo(spinor * const Even_new, spinor * const Odd_new,
3636
const int solver_flag, const int rel_prec,
3737
const int sub_evs_flag, const int even_odd_flag,
3838
const int no_extra_masses, double * const extra_masses, solver_params_t solver_params, const int id,
39-
const ExternalInverter inverter, const SloppyPrecision sloppy, const CompressionType compression );
39+
const ExternalInverter external_inverter, const SloppyPrecision sloppy, const CompressionType compression );
4040

4141
#endif

0 commit comments

Comments
 (0)