Skip to content

Commit

Permalink
tm_sub_Hopping_Matrix using bgq layout
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Kruse committed Dec 5, 2012
1 parent 32db77c commit 06d9b2e
Show file tree
Hide file tree
Showing 6 changed files with 153 additions and 20 deletions.
18 changes: 18 additions & 0 deletions bgq/bgq_HoppingMatrix.c
Original file line number Diff line number Diff line change
Expand Up @@ -327,3 +327,21 @@ void tm_times_Hopping_Matrix(const int ieo, spinor * const l, spinor * const k,
bgq_spinorfield_cmul_double(targetfield, ieo, targetfield, cfactor);
}
#endif


#if BGQ_REPLACE
void tm_sub_Hopping_Matrix(const int ieo, spinor * const l, spinor * p, spinor * const k, complex double const cfactor) {
bgq_weylfield_controlblock *targetfield = bgq_translate_spinorfield(l);
bgq_weylfield_controlblock *sourcefield = bgq_translate_spinorfield(k);
bgq_weylfield_controlblock *sourcefield_sub = bgq_translate_spinorfield(p);

#ifdef _GAUGE_COPY
if(g_update_gauge_copy) {
update_backward_gauge(g_gauge_field);
}
#endif

bgq_HoppingMatrix(ieo, targetfield, sourcefield, 0);
bgq_spinorfield_icjgmul_plain_sub_double(targetfield, ieo, sourcefield_sub, targetfield, cfactor);
}
#endif
15 changes: 2 additions & 13 deletions bgq/bgq_reduction.inc.c
Original file line number Diff line number Diff line change
Expand Up @@ -229,19 +229,8 @@ static inline void REDUCTION_NAME(
IF2ARG(, bgq_weylfield_controlblock *argfield2)
REDUCTION_EXTRAPARMLIST) {

IF1ARG(
if (isOdd==tri_unknown)
isOdd = argfield1->isOdd;
else
assert(argfield1->isOdd==tri_unknown || argfield1->isOdd==isOdd);
)

IF2ARG(
if (isOdd==tri_unknown)
isOdd = argfield2->isOdd;
else
assert(argfield2->isOdd==tri_unknown || argfield2->isOdd==isOdd);
)
IF1ARG(isOdd = tristate_combine(isOdd, argfield1->isOdd);)
IF2ARG(isOdd = tristate_combine(isOdd, argfield2->isOdd);)

#if REDUCTION_ARGFIELDS==0
bgq_worker_func workerfunc = NAME2(REDUCTION_NAME,worker_funcs);
Expand Down
124 changes: 120 additions & 4 deletions bgq/bgq_stdoperators.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@



static inline void bgq_site_diff(bgq_su3_spinor_params(*target), bgq_su3_spinor_params(spinor1), bgq_su3_spinor_params(spinor2), ucoord ic) {
static inline void bgq_site_sub(bgq_su3_spinor_params(*target), bgq_su3_spinor_params(spinor1), bgq_su3_spinor_params(spinor2), ucoord ic) {
bgq_su3_spinor_decl(result);

bgq_su3_vsub(result_v0, spinor1_v0, spinor2_v0);
Expand All @@ -24,6 +24,75 @@ static inline void bgq_site_diff(bgq_su3_spinor_params(*target), bgq_su3_spinor_
}


static inline void bgq_site_cmul_plain_sub(bgq_su3_spinor_params(*target), bgq_su3_spinor_params(spinor1), bgq_su3_spinor_params(spinor2), bgq_params(qc), ucoord ic) {
bgq_su3_spinor_decl(result);
bgq_su3_spinor_decl(cmul1);

// Unfortunately, there is no fused-multiply-sub for this
bgq_mul(cmul1_v0_c0, qc, spinor1_v0_c0);
bgq_mul(cmul1_v0_c1, qc, spinor1_v0_c1);
bgq_mul(cmul1_v0_c2, qc, spinor1_v0_c2);
bgq_mul(cmul1_v1_c0, qc, spinor1_v1_c0);
bgq_mul(cmul1_v1_c1, qc, spinor1_v1_c1);
bgq_mul(cmul1_v1_c2, qc, spinor1_v1_c2);
bgq_mul(cmul1_v2_c0, qc, spinor1_v2_c0);
bgq_mul(cmul1_v2_c1, qc, spinor1_v2_c1);
bgq_mul(cmul1_v2_c2, qc, spinor1_v2_c2);
bgq_mul(cmul1_v3_c0, qc, spinor1_v3_c0);
bgq_mul(cmul1_v3_c1, qc, spinor1_v3_c1);
bgq_mul(cmul1_v3_c2, qc, spinor1_v3_c2);

bgq_su3_vsub(result_v0, cmul1_v0, spinor2_v0);
bgq_su3_vsub(result_v1, cmul1_v1, spinor2_v1);
bgq_su3_vsub(result_v2, cmul1_v2, spinor2_v2);
bgq_su3_vsub(result_v3, cmul1_v3, spinor2_v3);

bgq_su3_spinor_mov(*target, result);
}


static inline void bgq_site_icjgmul_plain_sub(bgq_su3_spinor_params(*target), bgq_su3_spinor_params(spinor1), bgq_su3_spinor_params(spinor2), bgq_params(qc), bgq_params(qw), ucoord ic) {
bgq_su3_spinor_decl(result);
bgq_su3_spinor_decl(imul1);

assert(bgq_cmplxval1(qc) == bgq_cmplxval2(qc));

bgq_su3_cvmul(imul1_v0, qc, spinor1_v0);
bgq_su3_cvmul(imul1_v1, qc, spinor1_v1);
bgq_su3_vsub(result_v0, imul1_v0, spinor2_v0);
bgq_su3_vsub(result_v1, imul1_v1, spinor2_v1);

#if 1
assert(bgq_cmplxval1(qw) == bgq_cmplxval2(qw));
assert(bgq_cmplxval1(qc) == -bgq_cmplxval1(qw));

// re = spinor2.re + qw.re * spinor1.re + qw.im * spinor1.im
// im = spinor2.im + qw.re * spinor1.im - qw.im * spinor1.re

bgq_xmadd(result_v2_c0, qw, spinor1_v2_c0, spinor2_v2_c0);
bgq_xxcpnmadd(result_v2_c0, spinor1_v2_c0, qw, result_v2_c0);
bgq_xmadd(result_v2_c1, qw, spinor1_v2_c1, spinor2_v2_c1);
bgq_xxcpnmadd(result_v2_c1, spinor1_v2_c1, qw, result_v2_c1);
bgq_xmadd(result_v2_c2, qw, spinor1_v2_c2, spinor2_v2_c2);
bgq_xxcpnmadd(result_v2_c2, spinor1_v2_c2, qw, result_v2_c2);

bgq_xmadd(result_v3_c0, qw, spinor1_v3_c0, spinor2_v3_c0);
bgq_xxcpnmadd(result_v3_c0, spinor1_v3_c0, qw, result_v3_c0);
bgq_xmadd(result_v3_c1, qw, spinor1_v3_c1, spinor2_v3_c1);
bgq_xxcpnmadd(result_v3_c1, spinor1_v3_c1, qw, result_v3_c1);
bgq_xmadd(result_v3_c2, qw, spinor1_v3_c2, spinor2_v3_c2);
bgq_xxcpnmadd(result_v3_c2, spinor1_v3_c2, qw, result_v3_c2);
#else
bgq_su3_cjgvmul(imul1_v2, qc, spinor1_v2);
bgq_su3_cjgvmul(imul1_v3, qc, spinor1_v3);
bgq_su3_vsub(result_v2, spinor2_v2, imul1_v2);
bgq_su3_vsub(result_v3, spinor2_v3, imul1_v3);
#endif

bgq_su3_spinor_mov(*target, result);
}


static inline void bgq_site_set(bgq_su3_spinor_params(*target), bgq_su3_spinor_params(spinor), ucoord ic) {
bgq_su3_spinor_decl(result);

Expand Down Expand Up @@ -106,9 +175,9 @@ static inline void bgq_site_gamma5(bgq_su3_spinor_params(*target), bgq_su3_spino



#define OPERATOR_NAME bgq_spinorfield_diff
#define OPERATOR_NAME bgq_spinorfield_sub
#define OPERATOR_ARGFIELDS 2
#define OPERATOR_VECSITEFUNC bgq_site_diff
#define OPERATOR_VECSITEFUNC bgq_site_sub
#include "bgq_operator.inc.c"

#if BGQ_REPLACE
Expand All @@ -118,7 +187,7 @@ void diff(spinor * const Q, const spinor * const R, const spinor * const S, cons
bgq_weylfield_controlblock *sourcefield1 = bgq_translate_spinorfield(R);
bgq_weylfield_controlblock *sourcefield2 = bgq_translate_spinorfield(S);

bgq_spinorfield_diff_double(targetfield, tri_unknown, sourcefield1, sourcefield2);
bgq_spinorfield_sub_double(targetfield, tri_unknown, sourcefield1, sourcefield2);
}
#endif

Expand Down Expand Up @@ -292,3 +361,50 @@ void bgq_spinorfield_cmul_float(bgq_weylfield_controlblock *targetfield, tristat
bgq_cconst(qc, c, c);
bgq_spinorfield_cmul_raw_float(targetfield, isOdd, sourcefield, bgq_vars(qc));
}



#define OPERATOR_NAME bgq_spinorfield_cmul_plain_sub_raw
#define OPERATOR_ARGFIELDS 2
#define OPERATOR_VECSITEFUNC bgq_site_cmul_plain_sub
#define OPERATOR_EXTRAPARMS bgq_params(qc)
#define OPERATOR_EXTRAARGS bgq_vars(qc)
#include "bgq_operator.inc.c"

void bgq_spinorfield_cmul_plain_sub_double(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *sourcefield1, bgq_weylfield_controlblock *sourcefield2, double c) {
bgq_vector4double_decl(qc);
bgq_cconst(qc, c, c);
bgq_spinorfield_cmul_plain_sub_raw_double(targetfield, isOdd, sourcefield1, sourcefield2,bgq_vars(qc));
}

void bgq_spinorfield_cmul_plain_sub_float(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *sourcefield1, bgq_weylfield_controlblock *sourcefield2, double c) {
bgq_vector4double_decl(qc);
bgq_cconst(qc, c, c);
bgq_spinorfield_cmul_plain_sub_raw_float(targetfield, isOdd, sourcefield1, sourcefield2, bgq_vars(qc));
}


#define OPERATOR_NAME bgq_spinorfield_icjgmul_plain_sub_raw
#define OPERATOR_ARGFIELDS 2
#define OPERATOR_VECSITEFUNC bgq_site_icjgmul_plain_sub
#define OPERATOR_EXTRAPARMS bgq_params(qc),bgq_params(qw)
#define OPERATOR_EXTRAARGS bgq_vars(qc),bgq_vars(qw)
#include "bgq_operator.inc.c"

void bgq_spinorfield_icjgmul_plain_sub_double(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *sourcefield1, bgq_weylfield_controlblock *sourcefield2, complex_double c) {
bgq_vector4double_decl(qc);
bgq_cconst(qc, creal(c), cimag(c));
bgq_vector4double_decl(qw);
bgq_neg(qw, qc);
bgq_spinorfield_icjgmul_plain_sub_raw_double(targetfield, isOdd, sourcefield1, sourcefield2, bgq_vars(qc), bgq_vars(qw));
}

void bgq_spinorfield_icjgmul_plain_sub_float(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *sourcefield1, bgq_weylfield_controlblock *sourcefield2, complex_double c) {
bgq_vector4double_decl(qc);
bgq_cconst(qc, creal(c), cimag(c));
bgq_vector4double_decl(qw);
bgq_neg(qw, qc);
bgq_spinorfield_icjgmul_plain_sub_raw_float(targetfield, isOdd, sourcefield1, sourcefield2, bgq_vars(qc), bgq_vars(qw));
}


10 changes: 8 additions & 2 deletions bgq/bgq_stdoperators.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,18 @@
#include "bgq_spinorfield.h"


void bgq_spinorfield_diff_double(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *argfield1, bgq_weylfield_controlblock *argfield2);
void bgq_spinorfield_diff_float(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *argfield1, bgq_weylfield_controlblock *argfield2);
void bgq_spinorfield_sub_double(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *argfield1, bgq_weylfield_controlblock *argfield2);
void bgq_spinorfield_sub_float(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *argfield1, bgq_weylfield_controlblock *argfield2);

void bgq_spinorfield_copy(bgq_weylfield_controlblock *target, bgq_spinorfield_layout targetLayout, bgq_weylfield_controlblock *source);

void bgq_spinorfield_cmul_double(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *sourcefield, double c);
void bgq_spinorfield_cmul_float(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *sourcefield, double c);

void bgq_spinorfield_cmul_plain_sub_double(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *sourcefield1, bgq_weylfield_controlblock *sourcefield2, double c);
void bgq_spinorfield_cmul_plain_sub_float(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *sourcefield1, bgq_weylfield_controlblock *sourcefield2, double c);

void bgq_spinorfield_icjgmul_plain_sub_double(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *sourcefield1, bgq_weylfield_controlblock *sourcefield2, complex_double c);
void bgq_spinorfield_icjgmul_plain_sub_float(bgq_weylfield_controlblock *targetfield, tristate isOdd, bgq_weylfield_controlblock *sourcefield1, bgq_weylfield_controlblock *sourcefield2, complex_double c);

#endif /* BGQ_STDOPERATORS_H_ */
2 changes: 1 addition & 1 deletion bgqbench.c
Original file line number Diff line number Diff line change
Expand Up @@ -1071,7 +1071,7 @@ static int check_linalg(void *arg_untyped) {


diff(g_spinor_field[g_linalgidx+2], g_spinor_field[g_linalgidx], g_spinor_field[g_linalgidx+1], VOLUME/2);
bgq_spinorfield_diff_double(&g_bgq_spinorfields[g_linalgidx+3], true, &g_bgq_spinorfields[g_linalgidx+0], &g_bgq_spinorfields[g_linalgidx+1]);
bgq_spinorfield_sub_double(&g_bgq_spinorfields[g_linalgidx+3], true, &g_bgq_spinorfields[g_linalgidx+0], &g_bgq_spinorfields[g_linalgidx+1]);
#ifndef BGQ_COORDCHECK
compare = bgq_spinorfield_compare(true, &g_bgq_spinorfields[g_linalgidx+3], &g_bgq_spinorfields[g_linalgidx+2], false);
master_print("Compare: %g\n", compare);
Expand Down
4 changes: 4 additions & 0 deletions tm_sub_Hopping_Matrix.c
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
*
****************************************************************/

#if !BGQ_REPLACE

#ifdef HAVE_CONFIG_H
# include<config.h>
#endif
Expand Down Expand Up @@ -165,3 +167,5 @@ void tm_sub_Hopping_Matrix(const int ieo, spinor * const l, spinor * p, spinor *
return;
}
#endif

#endif

0 comments on commit 06d9b2e

Please sign in to comment.