10 template<
typename AFIELD>
12 =
"Fprop_alt_Standard_lex";
14 template<
typename AFIELD>
21 vout.
general(m_vl,
"%s: being setup (without link smearing).\n",
29 string fopr_type = params_fopr.
get_string(
"fermion_type");
30 m_fopr = AltFopr::New(fopr_type, params_fopr);
36 string solver_type = params_solver.
get_string(
"solver_type");
37 m_solver = AltSolver::New(solver_type, m_fopr);
38 m_solver->set_parameters(params_solver);
42 vout.
general(m_vl,
"%s: setup finished.\n", class_name.c_str());
47 template<
typename AFIELD>
53 vout.
general(m_vl,
"%s: being setup (with link smearing).\n",
59 m_dr_smear = dr_smear;
61 string fopr_type = params_fopr.
get_string(
"fermion_type");
62 m_kernel = AltFopr::New(fopr_type, params_fopr);
67 string solver_type = params_solver.
get_string(
"solver_type");
68 m_solver = AltSolver::New(solver_type, m_fopr);
69 m_solver->set_parameters(params_solver);
73 vout.
general(m_vl,
"%s: setup finished.\n", class_name.c_str());
78 template<
typename AFIELD>
83 if (m_kernel != 0)
delete m_kernel;
88 template<
typename AFIELD>
91 m_fopr->set_config(U);
96 template<
typename AFIELD>
98 int& nconv,
double& diff)
100 vout.
paranoiac(m_vl,
"%s: invert is called.\n", class_name.c_str());
104 invert_D(xq, b, nconv, diff);
105 }
else if (m_mode ==
"DdagD") {
106 invert_DdagD(xq, b, nconv, diff);
107 }
else if (m_mode ==
"D_prec") {
108 invert_D_prec(xq, b, nconv, diff);
109 }
else if (m_mode ==
"DdagD_prec") {
110 invert_DdagD_prec(xq, b, nconv, diff);
113 class_name.c_str(), m_mode.c_str());
120 template<
typename AFIELD>
122 int& nconv,
double& diff)
127 int nin = m_fopr->field_nin();
128 int nvol = m_fopr->field_nvol();
129 int nex = m_fopr->field_nex();
131 vout.
detailed(m_vl,
"%s::invert_D() is called\n", class_name.c_str());
133 vout.
paranoiac(m_vl,
"nin = %d nvol = %d nex = %d\n", nin, nvol, nex);
135 AFIELD axq(nin, nvol, nex);
136 AFIELD abq(nin, nvol, nex);
142 if (m_fopr->needs_convert()) {
144 m_fopr->convert(abq, b);
151 vout.
detailed(m_vl,
"%s: convert finished.\n", class_name.c_str());
153 m_fopr->set_mode(
"D");
159 m_solver->solve(axq, abq, nconv, diff2);
161 diff = double(diff2);
165 if (m_fopr->needs_convert()) {
166 m_fopr->reverse(xq, axq);
173 double elapsed_sec = m_timer.elapsed_sec();
174 double flop_count = m_solver->flop_count();
176 m_elapsed_time += elapsed_sec;
177 m_flop_count += flop_count;
179 vout.
general(m_vl,
"%s::invert_D():\n", class_name.c_str());
180 vout.
general(m_vl,
" elapase time = %e sec\n", elapsed_sec);
181 vout.
general(m_vl,
" flop count = %e\n", flop_count);
182 double gflops = 1.e-9 * flop_count/elapsed_sec;
183 vout.
general(m_vl,
" performance = %e GFlops\n", gflops);
189 template<
typename AFIELD>
191 int& nconv,
double& diff)
196 vout.
detailed(m_vl,
"%s::invert_DdagD() is called\n", class_name.c_str());
198 int nin = m_fopr->field_nin();
199 int nvol = m_fopr->field_nvol();
200 int nex = m_fopr->field_nex();
202 AFIELD axq(nin, nvol, nex);
203 AFIELD abq(nin, nvol, nex);
209 if (m_fopr->needs_convert()) {
210 m_fopr->convert(abq, b);
218 m_fopr->set_mode(
"DdagD");
222 m_solver->solve(axq, abq, nconv, diff2);
224 diff = double(diff2);
228 if (m_fopr->needs_convert()) {
229 m_fopr->reverse(xq, axq);
236 double elapsed_sec = m_timer.elapsed_sec();
237 double flop_count = m_solver->flop_count();
239 m_elapsed_time += elapsed_sec;
240 m_flop_count += flop_count;
242 vout.
general(m_vl,
"%s::invert_DdagD():\n", class_name.c_str());
243 vout.
general(m_vl,
" elapase time = %e sec\n", elapsed_sec);
244 vout.
general(m_vl,
" flop count = %e\n", flop_count);
245 double gflops = 1.e-9 * flop_count/elapsed_sec;
246 vout.
general(m_vl,
" performance = %e GFlops\n", gflops);
252 template<
typename AFIELD>
255 int& nconv,
double& diff)
260 int nin = m_fopr->field_nin();
261 int nvol = m_fopr->field_nvol();
262 int nex = m_fopr->field_nex();
264 AFIELD axq(nin, nvol, nex);
265 AFIELD abq(nin, nvol, nex);
269 if (m_fopr->needs_convert()) {
270 m_fopr->convert(abq, b);
275 m_fopr->set_mode(
"D_prec");
281 m_solver->solve(axq, abq, nconv, diff2);
283 m_flop_count += m_solver->flop_count();
285 m_fopr->mult(abq, axq,
"Prec");
287 if (m_fopr->needs_convert()) {
288 m_fopr->reverse(xq, abq);
293 diff = double(diff2);
296 m_elapsed_time += m_timer.elapsed_sec();
298 m_flop_count += 2 * m_fopr->flop_count();
303 template<
typename AFIELD>
306 int& nconv,
double& diff)
313 int nin = m_fopr->field_nin();
314 int nvol = m_fopr->field_nvol();
315 int nex = m_fopr->field_nex();
317 AFIELD axq(nin, nvol, nex);
318 AFIELD abq(nin, nvol, nex);
322 if (m_fopr->needs_convert()) {
323 m_fopr->convert(axq, b);
328 m_fopr->mult(abq, axq,
"Precdag");
330 m_fopr->set_mode(
"DdagD_prec");
336 m_solver->solve(axq, abq, nconv, diff2);
338 m_flop_count += m_solver->flop_count();
340 m_fopr->mult(abq, axq,
"Prec");
342 if (m_fopr->needs_convert()) {
343 m_fopr->reverse(xq, abq);
348 diff = double(diff2);
351 m_elapsed_time += m_timer.elapsed_sec();
353 m_flop_count += 2 * m_fopr->flop_count();
358 template<
typename AFIELD>
361 int& nconv,
double& diff)
363 vout.
paranoiac(m_vl,
"%s: invert is called.\n", class_name.c_str());
367 invert_D(xq, b, nconv, diff);
368 }
else if (m_mode ==
"DdagD") {
369 invert_DdagD(xq, b, nconv, diff);
370 }
else if (m_mode ==
"D_prec") {
371 invert_D_prec(xq, b, nconv, diff);
372 }
else if (m_mode ==
"DdagD_prec") {
373 invert_DdagD_prec(xq, b, nconv, diff);
376 class_name.c_str(), m_mode.c_str());
383 template<
typename AFIELD>
386 int& nconv,
double& diff)
391 m_fopr->set_mode(
"D");
397 m_solver->solve(axq, abq, nconv, diff2);
399 diff = double(diff2);
402 m_elapsed_time += m_timer.elapsed_sec();
403 m_flop_count += m_solver->flop_count();
408 template<
typename AFIELD>
411 int& nconv,
double& diff)
418 m_fopr->set_mode(
"DdagD");
422 m_solver->solve(axq, abq, nconv, diff2);
424 diff = double(diff2);
427 m_elapsed_time += m_timer.elapsed_sec();
428 m_flop_count += m_solver->flop_count();
433 template<
typename AFIELD>
436 int& nconv,
double& diff)
441 int nin = m_fopr->field_nin();
442 int nvol = m_fopr->field_nvol();
443 int nex = m_fopr->field_nex();
444 AFIELD atmp(nin, nvol, nex);
446 m_fopr->set_mode(
"D_prec");
452 m_solver->solve(atmp, abq, nconv, diff2);
454 m_flop_count += m_solver->flop_count();
455 m_fopr->mult(axq, atmp,
"Prec");
457 diff = double(diff2);
460 m_elapsed_time += m_timer.elapsed_sec();
462 m_flop_count += 2 * m_fopr->flop_count();
467 template<
typename AFIELD>
470 int& nconv,
double& diff)
477 int nin = m_fopr->field_nin();
478 int nvol = m_fopr->field_nvol();
479 int nex = m_fopr->field_nex();
480 AFIELD atmp(nin, nvol, nex);
482 m_fopr->mult(axq, abq,
"Precdag");
484 m_fopr->set_mode(
"DdagD_prec");
490 m_solver->solve(atmp, axq, nconv, diff2);
492 m_flop_count += m_solver->flop_count();
494 m_fopr->mult(axq, atmp,
"Prec");
496 diff = double(diff2);
499 m_elapsed_time += m_timer.elapsed_sec();
501 m_flop_count += 2 * m_fopr->flop_count();
506 template<
typename AFIELD>
509 return m_solver->flop_count();
514 template<
typename AFIELD>
518 m_elapsed_time = 0.0;
523 template<
typename AFIELD>
525 double& elapsed_time)
527 flop_count = m_flop_count;
528 elapsed_time = m_elapsed_time;
533 template<
typename AFIELD>
536 double flops = m_flop_count / m_elapsed_time;
537 double gflops = flops * 1.0e-9;
540 vout.
general(m_vl,
"%s: solver performance:\n", class_name.c_str());
541 vout.
general(m_vl,
" Elapsed time = %14.6f sec\n", m_elapsed_time);
542 vout.
general(m_vl,
" Flop(total) = %18.0f\n", m_flop_count);
543 vout.
general(m_vl,
" Performance = %11.3f GFlops\n", gflops);
548 template<
typename AFIELD>
550 const std::string mode,
555 int nin = m_fopr->field_nin();
556 int nvol = m_fopr->field_nvol();
557 int nex = m_fopr->field_nex();
559 AFIELD axq(nin, nvol, nex), abq(nin, nvol, nex);
563 unique_ptr<Timer> timer(
new Timer);
565 std::string mode_prev = m_fopr->get_mode();
567 m_fopr->set_mode(mode);
573 for (
int i = 0; i < Nrepeat; ++i) {
574 m_fopr->mult(axq, abq);
575 m_fopr->mult(abq, axq);
581 double flop_fopr = m_fopr->flop_count();
582 double flop_total = flop_fopr * double(2 * Nrepeat);
584 double elapsed_time = timer->elapsed_sec();
585 double flops = flop_total / elapsed_time;
586 double gflops = flops * 1.0e-9;
589 vout.
general(m_vl,
"%s: mult performance:\n", class_name.c_str());
590 vout.
general(m_vl,
" mult mode = %s\n", mode.c_str());
591 vout.
general(m_vl,
" Elapsed time = %14.6f sec\n", elapsed_time);
592 vout.
general(m_vl,
" Flop(Fopr) = %18.0f\n", flop_fopr);
593 vout.
general(m_vl,
" Flop(total) = %18.0f\n", flop_total);
594 vout.
general(m_vl,
" Performance = %11.3f GFlops\n", gflops);
596 m_fopr->set_mode(mode_prev);