Bridge++  Ver. 2.0.3
fprop_alt_Standard_eo-tmpl.h
Go to the documentation of this file.
1 
10 template<typename AFIELD>
12  = "Fprop_alt_Standard_eo";
13 //====================================================================
14 template<typename AFIELD>
16  const Parameters& params_solver)
17 {
18  // this constructor assumes that the factories are available.
19  vout.general(m_vl, "\n");
20  vout.general(m_vl, "%s: being setup (without link smearing).\n",
21  class_name.c_str());
23 
24  typedef AFopr<AFIELD> AltFopr;
25  typedef ASolver<AFIELD> AltSolver;
26 
27  string fopr_type = params_fopr.get_string("fermion_type");
28  if(fopr_type.substr(fopr_type.size()-3 ,3) != "_eo")
29  fopr_type += "_eo";
30 
31  m_fopr = AltFopr::New(fopr_type, params_fopr);
32 
33  m_dr_smear = 0;
34 
35  m_kernel = 0;
36 
37  string solver_type = params_solver.get_string("solver_type");
38  m_solver = AltSolver::New(solver_type, m_fopr);
39  m_solver->set_parameters(params_solver);
40 
41  reset_performance();
42 
44  vout.general(m_vl, "%s: setup finished.\n", class_name.c_str());
45 }
46 
47 
48 //====================================================================
49 template<typename AFIELD>
51  const Parameters& params_solver,
52  Director_Smear *dr_smear)
53 {
55 
56  vout.general(m_vl, "\n");
57  vout.general(m_vl, "%s: being setup (with link smearing).\n",
58  class_name.c_str());
60 
61  typedef AFopr<AFIELD> AltFopr;
62  typedef ASolver<AFIELD> AltSolver;
63 
64  m_dr_smear = dr_smear;
65 
66  string fopr_type = params_fopr.get_string("fermion_type");
67  if(fopr_type.substr(fopr_type.size()-3 ,3) != "_eo")
68  fopr_type += "_eo";
69 
70  m_kernel = AltFopr::New(fopr_type, params_fopr);
71 
72  // m_fopr = AltFopr::New("Smeared", m_kernel, m_dr_smear);
73  m_fopr = new AFopr_Smeared<AFIELD>(m_kernel, m_dr_smear);
74 
75  string solver_type = params_solver.get_string("solver_type");
76  m_solver = AltSolver::New(solver_type, m_fopr);
77  m_solver->set_parameters(params_solver);
78 
79  reset_performance();
80 
82  vout.general(m_vl, "%s: setup finished.\n", class_name.c_str());
83 }
84 
85 
86 //====================================================================
87 template<typename AFIELD>
89 {
90  delete m_solver;
91  delete m_fopr;
92  if (m_kernel != 0) delete m_kernel;
93 }
94 
95 
96 //====================================================================
97 template<typename AFIELD>
99 {
100  m_fopr->set_config(U);
101 }
102 
103 
104 //====================================================================
105 template<typename AFIELD>
107  int& nconv, double& diff)
108 {
109  vout.paranoiac(m_vl, "%s: invert is called.\n", class_name.c_str());
110  vout.paranoiac(m_vl, "mode = %s.\n", m_mode.c_str());
111 
112  if ((m_mode == "D") || (m_mode == "D_prec")) {
113  invert_D(xq, b, nconv, diff);
114  } else if ((m_mode == "DdagD") || (m_mode == "DdagD_prec")) {
115  invert_DdagD(xq, b, nconv, diff);
116  } else if (m_mode == "D_even") {
117  m_fopr->set_mode("D");
118  invert_De(xq, b, nconv, diff);
119  } else if (m_mode == "Ddag_even") {
120  m_fopr->set_mode("Ddag");
121  invert_De(xq, b, nconv, diff);
122  } else if (m_mode == "DdagD_even") {
123  m_fopr->set_mode("DdagD");
124  invert_De(xq, b, nconv, diff);
125  } else {
126  vout.crucial(m_vl, "%s: unsupported mode: %s\n",
127  class_name.c_str(), m_mode.c_str());
128  exit(EXIT_FAILURE);
129  }
130 }
131 
132 
133 //====================================================================
134 template<typename AFIELD>
136  int& nconv, double& diff)
137 {
138  vout.paranoiac(m_vl, "%s: invert is called.\n", class_name.c_str());
139  vout.paranoiac(m_vl, "mode = %s.\n", m_mode.c_str());
140 
141  if (m_mode == "D") {
142  invert_D(xq, b, nconv, diff);
143  } else if (m_mode == "DdagD") {
144  invert_DdagD(xq, b, nconv, diff);
145  } else if (m_mode == "D_even") {
146  m_fopr->set_mode("D");
147  invert_De(xq, b, nconv, diff);
148  } else if (m_mode == "Ddag_even") {
149  m_fopr->set_mode("Ddag");
150  invert_De(xq, b, nconv, diff);
151  } else if (m_mode == "DdagD_even") {
152  m_fopr->set_mode("DdagD");
153  invert_De(xq, b, nconv, diff);
154  } else {
155  vout.crucial(m_vl, "%s: unsupported mode: %s\n",
156  class_name.c_str(), m_mode.c_str());
157  exit(EXIT_FAILURE);
158  }
159 }
160 
161 
162 //====================================================================
163 template<typename AFIELD>
165  int& nconv, double& diff)
166 {
168  vout.paranoiac(m_vl, "invert_D(Field) start.\n");
169 
170  m_timer.reset();
171  m_timer.start();
172 
173  int nin = m_fopr->field_nin();
174  int nvol2 = m_fopr->field_nvol();
175  int nex = m_fopr->field_nex();
176  int nvol = 2 * nvol2;
177 
178  AFIELD axq(nin, nvol, nex);
179  AFIELD abq(nin, nvol, nex);
180 
181  AFIELD be(nin, nvol2, nex), bo(nin, nvol2, nex);
182  AFIELD xe(nin, nvol2, nex), xo(nin, nvol2, nex);
183 
186 
187 #pragma omp parallel
188  {
189  if (m_fopr->needs_convert()) {
190  vout.detailed(m_vl, "convert required.\n");
191  m_fopr->convert(abq, b);
192  } else {
193  vout.detailed(m_vl, "convert not required.\n");
194  convert(index_alt, abq, b);
195  }
196 #pragma omp barrier
197  index_eo.split(be, bo, abq);
198  }
199 
200  invert_De(xe, xo, be, bo, nconv, diff);
201 
202  vout.detailed(m_vl, "%s: diff = %e\n", class_name.c_str(), diff);
203 
204 #pragma omp parallel
205  {
206  index_eo.merge(axq, xe, xo);
207 #pragma omp barrier
208 
209  if (m_fopr->needs_convert()) {
210  m_fopr->reverse(xq, axq);
211  } else {
212  reverse(index_alt, xq, axq);
213  }
214  }
215 
216  m_timer.stop();
217  m_elapsed_time += m_timer.elapsed_sec();
218  m_flop_count += m_solver->flop_count();
219 }
220 
221 
222 //====================================================================
223 template<typename AFIELD>
225  int& nconv, double& diff)
226 {
228  vout.paranoiac(m_vl, "invert_DdagD start.\n");
229 
230  m_timer.reset();
231  m_timer.start();
232 
233  // xq.set(0.0);
234 
235  int nin = m_fopr->field_nin();
236  int nvol2 = m_fopr->field_nvol();
237  int nex = m_fopr->field_nex();
238  int nvol = 2 * nvol2;
239 
240  AFIELD axq(nin, nvol, nex);
241  AFIELD abq(nin, nvol, nex);
242 
243  AFIELD be(nin, nvol2, nex), bo(nin, nvol2, nex);
244  AFIELD xe(nin, nvol2, nex), xo(nin, nvol2, nex);
245  AFIELD y1(nin, nvol2, nex), y2(nin, nvol2, nex);
246 
249 
250 #pragma omp parallel
251  {
252  if (m_fopr->needs_convert()) {
253  vout.detailed(m_vl, "convert required.\n");
254  m_fopr->convert(abq, b);
255  } else {
256  vout.detailed(m_vl, "convert not required.\n");
257  convert(index_alt, abq, b);
258  }
259 #pragma omp barrier
260 
261  index_eo.split(be, bo, abq);
262  }
263 
264  int nconv1;
265  double diff1;
266  invert_De_dag(y1, y2, be, bo, nconv1, diff1);
267 
268  nconv = nconv1;
269  diff = diff1;
270 
271  invert_De(xe, xo, y1, y2, nconv1, diff1);
272 
273  nconv += nconv1;
274  diff += diff1;
275 
276 #pragma omp parallel
277  {
278  index_eo.merge(axq, xe, xo);
279 #pragma omp barrier
280 
281  if (m_fopr->needs_convert()) {
282  m_fopr->reverse(xq, axq);
283  } else {
284  reverse(index_alt, xq, axq);
285  }
286  }
287 
288  m_timer.stop();
289  m_elapsed_time += m_timer.elapsed_sec();
290  m_flop_count += m_solver->flop_count();
291 
292 }
293 
294 //====================================================================
295 template<typename AFIELD>
297  int& nconv, double& diff)
298 {
300  vout.paranoiac(m_vl, "invert_D start.\n");
301 
302  m_timer.reset();
303  m_timer.start();
304 
305  // xq.set(0.0);
306 
307  int nin = m_fopr->field_nin();
308  int nvol2 = m_fopr->field_nvol();
309  int nex = m_fopr->field_nex();
310 
311  AFIELD be(nin, nvol2, nex), bo(nin, nvol2, nex);
312  AFIELD xe(nin, nvol2, nex), xo(nin, nvol2, nex);
313 
315 
316 #pragma omp parallel
317  {
318  index_eo.split(be, bo, b);
319  }
320 
321  //m_fopr->set_mode("D");
322  invert_De(xe, xo, be, bo, nconv, diff);
323 
324 #pragma omp parallel
325  {
326  index_eo.merge(xq, xe, xo);
327  }
328 
329  m_timer.stop();
330  m_elapsed_time += m_timer.elapsed_sec();
331  m_flop_count += m_solver->flop_count();
332 }
333 
334 
335 //====================================================================
336 template<typename AFIELD>
338  int& nconv, double& diff)
339 {
341  vout.paranoiac(m_vl, "invert_De(Field) start.\n");
342 
343  m_timer.reset();
344  m_timer.start();
345 
346  // xq.set(0.0);
347 
348  int nin = m_fopr->field_nin();
349  int nvol2 = m_fopr->field_nvol();
350  int nex = m_fopr->field_nex();
351 
352  AFIELD abq(nin, nvol2, nex);
353  AFIELD axq(nin, nvol2, nex);
354 
356 
357 #pragma omp parallel
358  {
359  if (m_fopr->needs_convert()) {
360  vout.detailed(m_vl, "convert required.\n");
361  m_fopr->convert(abq, b);
362  } else {
363  vout.detailed(m_vl, "convert not required.\n");
364  convert(index_eo, abq, b);
365  }
366  }
367 
368  invert_De(axq, abq, nconv, diff);
369 
370 #pragma omp parallel
371  {
372  if (m_fopr->needs_convert()) {
373  m_fopr->reverse(xq, axq);
374  } else {
375  reverse(index_eo, xq, axq);
376  }
377  }
378 
379  m_timer.stop();
380  m_elapsed_time += m_timer.elapsed_sec();
381  m_flop_count += m_solver->flop_count();
382 }
383 
384 
385 //====================================================================
386 template<typename AFIELD>
388  int& nconv, double& diff)
389 {
391  vout.paranoiac(m_vl, "invert_DdagD start.\n");
392 
393  m_timer.reset();
394  m_timer.start();
395 
396  // xq.set(0.0);
397 
398  int nin = m_fopr->field_nin();
399  int nvol2 = m_fopr->field_nvol();
400  int nex = m_fopr->field_nex();
401 
402  AFIELD be(nin, nvol2, nex), bo(nin, nvol2, nex);
403  AFIELD xe(nin, nvol2, nex), xo(nin, nvol2, nex);
404  AFIELD y1(nin, nvol2, nex), y2(nin, nvol2, nex);
405 
407 
408 #pragma omp parallel
409  {
410  index_eo.split(be, bo, b);
411  }
412 
413  int nconv1;
414  double diff1;
415  invert_De_dag(y1, y2, be, bo, nconv1, diff1);
416 
417  nconv = nconv1;
418  diff = diff1;
419 
420  invert_De(xe, xo, y1, y2, nconv1, diff1);
421 
422  nconv += nconv1;
423  diff += diff1;
424 
425 #pragma omp parallel
426  {
427  index_eo.merge(xq, xe, xo);
428  }
429 
430  m_timer.stop();
431  m_elapsed_time += m_timer.elapsed_sec();
432  m_flop_count += m_solver->flop_count();
433 }
434 
435 
436 //====================================================================
437 template<typename AFIELD>
439  AFIELD& be, AFIELD& bo,
440  int& nconv, double& diff)
441 {
442  int nin = m_fopr->field_nin();
443  int nvol2 = m_fopr->field_nvol();
444  int nex = m_fopr->field_nex();
445  int nvol = 2 * nvol2;
446 
447  AFIELD y1(nin, nvol2, nex), y2(nin, nvol2, nex);
448 
449  vout.paranoiac(m_vl, "invert_De(AFIELD)(6arg) start.\n");
450 
451 #pragma omp parallel
452  {
453  // set even source vector.
454  m_fopr->mult(y1, bo, "Doo_inv");
455 #pragma omp barrier
456  m_fopr->mult(y2, y1, "Deo");
457 
458 #pragma omp barrier
459  axpy(be, real_t(-1.0), y2);
460 
461 #pragma omp barrier
462  m_fopr->mult(y1, be, "Dee_inv");
463 
464 
465  real_t diff2;
466  m_fopr->set_mode("D");
467  m_solver->solve(xe, y1, nconv, diff2);
468 #pragma omp barrier
469 
470  m_fopr->normalize_fprop(xe);
471 
472  m_fopr->mult(y1, xe, "Doe");
473 #pragma omp barrier
474 
475  aypx(real_t(-1.0), y1, bo);
476 #pragma omp barrier
477 
478  m_fopr->mult(xo, y1, "Doo_inv");
479 
480 #pragma omp master
481  {
482  diff = double(diff2);
483  }
484  }
485 
486  vout.detailed(m_vl, "diff(invert_De) = %e\n", diff);
487 
488 }
489 
490 
491 //====================================================================
492 template<typename AFIELD>
494  AFIELD& be, AFIELD& bo,
495  int& nconv, double& diff)
496 {
497  int nin = m_fopr->field_nin();
498  int nvol2 = m_fopr->field_nvol();
499  int nex = m_fopr->field_nex();
500  int nvol = 2 * nvol2;
501 
502  AFIELD y1(nin, nvol2, nex), y2(nin, nvol2, nex);
503 
504  vout.detailed(m_vl, "invert_De_dag(AFIELD)(6arg) start.\n");
505 
506 #pragma omp parallel
507  {
508  // set even source vector.
509  m_fopr->mult_dag(y1, bo, "Doo_inv");
510 #pragma omp barrier
511  m_fopr->mult_dag(y2, y1, "Deo");
512 
513 #pragma omp barrier
514  axpy(be, real_t(-1.0), y2);
515 
516  real_t diff2;
517  m_fopr->set_mode("Ddag");
518  m_solver->solve(y2, be, nconv, diff2);
519 #pragma omp barrier
520 
521  m_fopr->normalize_fprop(y2);
522 
523  m_fopr->mult_dag(xe, y2, "Dee_inv");
524 #pragma omp barrier
525 
526  m_fopr->mult_dag(y1, xe, "Doe");
527 #pragma omp barrier
528 
529  aypx(real_t(-1.0), y1, bo);
530 #pragma omp barrier
531 
532  m_fopr->mult_dag(xo, y1, "Doo_inv");
533 
534 #pragma omp master
535  {
536  diff = double(diff2);
537  }
538  }
539 
540  vout.detailed(m_vl, "diff(invert_De_dag) = %e\n", diff);
541 
542 }
543 
544 
545 //====================================================================
546 template<typename AFIELD>
548  const AFIELD& be,
549  int& nconv, double& diff)
550 {
551  real_t diff2;
552 
553  vout.detailed("invert_De(AFIELD)(4 arg) start.\n");
554 
555 #pragma omp parallel
556  {
557  m_solver->solve(xe, be, nconv, diff2);
558  }
559 
560  diff = double(diff2);
561 
562 }
563 
564 
565 //====================================================================
566 template<typename AFIELD>
568 {
569  return m_solver->flop_count();
570 }
571 
572 
573 //====================================================================
574 template<typename AFIELD>
576 {
577  m_flop_count = 0.0;
578  m_elapsed_time = 0.0;
579 }
580 
581 
582 //====================================================================
583 template<typename AFIELD>
585 {
586  double flops = m_flop_count / m_elapsed_time;
587  double gflops = flops * 1.0e-9;
588 
589  vout.general(m_vl, "\n");
590  vout.general(m_vl, "%s: solver performance:\n", class_name.c_str());
591  vout.general(m_vl, " Elapsed time = %14.6f sec\n", m_elapsed_time);
592  vout.general(m_vl, " Flop(total) = %18.0f\n", m_flop_count);
593  vout.general(m_vl, " Performance = %11.3f GFlops\n", gflops);
594 }
595 
596 
597 //====================================================================
598 template<typename AFIELD>
600  const std::string mode,
601  const int Nrepeat)
602 {
603  int nin = m_fopr->field_nin();
604  int nvol = m_fopr->field_nvol();
605  int nex = m_fopr->field_nex();
606 
607  AFIELD axq(nin, nvol, nex), abq(nin, nvol, nex);
608  abq.set(0.0);
609  abq.set(0, 1.0);
610 
611  unique_ptr<Timer> timer(new Timer);
612 
613  std::string mode_prev = m_fopr->get_mode();
614  m_fopr->set_mode(mode);
615 
616  timer->start();
617 
618 #pragma omp parallel
619  {
620  for (int i = 0; i < Nrepeat; ++i) {
621  m_fopr->mult(axq, abq);
622  m_fopr->mult(abq, axq);
623  }
624  }
625 
626  timer->stop();
627 
628  double flop_fopr = m_fopr->flop_count();
629  double flop_total = flop_fopr * double(2 * Nrepeat);
630 
631  double elapsed_time = timer->elapsed_sec();
632  double flops = flop_total / elapsed_time;
633  double gflops = flops * 1.0e-9;
634 
635  vout.general(m_vl, "\n");
636  vout.general(m_vl, "%s: mult performance:\n", class_name.c_str());
637  vout.general(m_vl, " mult mode = %s\n", mode.c_str());
638  vout.general(m_vl, " Number of mult = %18d\n", 2 * Nrepeat);
639  vout.general(m_vl, " Elapsed time = %14.6f sec\n", elapsed_time);
640  vout.general(m_vl, " Flop(Fopr) = %18.0f\n", flop_fopr);
641  vout.general(m_vl, " Flop(total) = %18.0f\n", flop_total);
642  vout.general(m_vl, " Performance = %11.3f GFlops\n", gflops);
643 
644  m_fopr->set_mode(mode_prev);
645 }
646 
647 //============================================================END=====
Fprop_alt_Standard_eo::report_performance
void report_performance()
Definition: fprop_alt_Standard_eo-tmpl.h:584
AFopr
Definition: afopr.h:48
ASolver
Definition: asolver.h:23
Fprop_alt_Standard_eo::invert
void invert(Field &, const Field &, int &, double &)
invert accordingly to the mode. [22 Sep 2018 H.Matsufuru]
Definition: fprop_alt_Standard_eo-tmpl.h:106
Field::set
void set(const int jin, const int site, const int jex, double v)
Definition: field.h:175
Parameters
Class for parameters.
Definition: parameters.h:46
AIndex_lex
Definition: aindex_lex_base.h:17
Bridge::BridgeIO::decrease_indent
void decrease_indent()
Definition: bridgeIO.h:86
convert
void convert(INDEX &index, AFIELD &v, const Field &w)
Definition: afield-inc.h:129
Bridge::BridgeIO::increase_indent
void increase_indent()
Definition: bridgeIO.h:85
Bridge::BridgeIO::detailed
void detailed(const char *format,...)
Definition: bridgeIO.cpp:219
aypx
void aypx(const double a, Field &y, const Field &x)
aypx(y, a, x): y := a * y + x
Definition: field.cpp:509
Fprop_alt_Standard_eo::init
void init(const Parameters &params_fopr, const Parameters &params_solver)
Definition: fprop_alt_Standard_eo-tmpl.h:15
axpy
void axpy(Field &y, const double a, const Field &x)
axpy(y, a, x): y := a * x + y
Definition: field.cpp:380
Fprop_alt_Standard_eo::mult_performance
void mult_performance(const std::string mode, const int Nrepeat)
Definition: fprop_alt_Standard_eo-tmpl.h:599
Fprop_alt_Standard_eo::set_config
void set_config(Field *)
Definition: fprop_alt_Standard_eo-tmpl.h:98
Fprop_alt_Standard_eo::invert_De
void invert_De(Field &, const Field &, int &, double &)
Definition: fprop_alt_Standard_eo-tmpl.h:337
real_t
double real_t
Definition: bridgeQXS_Clover_coarse_double.cpp:16
Fprop_alt_Standard_eo::flop_count
double flop_count()
Definition: fprop_alt_Standard_eo-tmpl.h:567
Timer
Definition: timer.h:31
Bridge::BridgeIO::paranoiac
void paranoiac(const char *format,...)
Definition: bridgeIO.cpp:238
Fprop_alt_Standard_eo
Get quark propagator for Fopr with lexical site index: alternative version.
Definition: fprop_alt_Standard_eo.h:30
Fprop_alt_Standard_eo::reset_performance
void reset_performance()
Definition: fprop_alt_Standard_eo-tmpl.h:575
AFopr_Smeared
smeared fermion operator: alternative version.
Definition: afopr_Smeared.h:41
Fprop_alt::real_t
AFIELD::real_t real_t
Definition: fprop_alt.h:32
Fprop_alt_Standard_eo::invert_DdagD
void invert_DdagD(Field &, const Field &, int &, double &)
Definition: fprop_alt_Standard_eo-tmpl.h:224
Fprop_alt_Standard_eo::invert_D
void invert_D(Field &, const Field &, int &, double &)
Definition: fprop_alt_Standard_eo-tmpl.h:164
Director_Smear
Manager of smeared configurations.
Definition: director_Smear.h:39
Fprop_alt_Standard_eo::invert_De_dag
void invert_De_dag(AFIELD &, AFIELD &, AFIELD &, AFIELD &, int &, double &)
Definition: fprop_alt_Standard_eo-tmpl.h:493
Fprop_alt_Standard_eo::tidyup
void tidyup()
Definition: fprop_alt_Standard_eo-tmpl.h:88
reverse
void reverse(INDEX &index, Field &v, const AFIELD &w)
Definition: afield-inc.h:159
Parameters::get_string
string get_string(const string &key) const
Definition: parameters.cpp:221
Bridge::BridgeIO::crucial
void crucial(const char *format,...)
Definition: bridgeIO.cpp:180
Field
Container of Field-type object.
Definition: field.h:46
Bridge::BridgeIO::general
void general(const char *format,...)
Definition: bridgeIO.cpp:200
ThreadManager::assert_single_thread
static void assert_single_thread(const std::string &class_name)
assert currently running on single thread.
Definition: threadManager.cpp:372
Bridge::vout
BridgeIO vout
Definition: bridgeIO.cpp:512
AIndex_eo< real_t, AFIELD::IMPL >