1906 double startTime, stopTime;
1907 startTime = CkWallTimer();
1917 stopTime = CkWallTimer();
1927 startTime = stopTime;
1933 int gia =
pgc->
ia();
1934 int gib =
pgc->
ib();
1935 int gja =
pgc->
ja();
1936 int gjb =
pgc->
jb();
1937 int gka =
pgc->
ka();
1938 int gkb =
pgc->
kb();
1939 int gni =
pgc->
ni();
1940 int gnj =
pgc->
nj();
1967 #ifndef MSM_COMM_ONLY
1969 for (
int k = ka; k <= kb; k++) {
1971 int mka = ( qka >= gka + k ? qka : gka + k );
1972 int mkb = ( qkb <= gkb + k ? qkb : gkb + k );
1974 for (
int j = ja; j <= jb; j++) {
1976 int mja = ( qja >= gja + j ? qja : gja + j );
1977 int mjb = ( qjb <= gjb + j ? qjb : gjb + j );
1979 for (
int i = ia; i <= ib; i++) {
1981 int mia = ( qia >= gia + i ? qia : gia + i );
1982 int mib = ( qib <= gib + i ? qib : gib + i );
1989 for (
int qk = mka; qk <= mkb; qk++) {
1990 int qkoff = (qk - qka) * qnj;
1991 int gkoff = ((qk-k) - gka) * gnj;
1993 for (
int qj = mja; qj <= mjb; qj++) {
1994 int qjkoff = (qkoff + qj - qja) * qni;
1995 int gjkoff = (gkoff + (qj-j) - gja) * gni;
1998 #if defined(__INTEL_COMPILER)
1999 #pragma vector always
2001 for (
int qi = mia; qi <= mib; qi++) {
2002 int qijkoff = qjkoff + qi - qia;
2003 int gijkoff = gjkoff + (qi-i) - gia;
2005 ehsum += gcbuffer[gijkoff] * qhbuffer[qijkoff];
2013 int nn = mib - mia + 1;
2014 for (
int qk = mka; qk <= mkb; qk++) {
2015 int qkoff = (qk - qka) * qnj;
2016 int gkoff = ((qk-k) - gka) * gnj;
2018 for (
int qj = mja; qj <= mjb; qj++) {
2019 int qjkoff = (qkoff + qj - qja) * qni;
2020 int gjkoff = (gkoff + (qj-j) - gja) * gni;
2022 const Float *qbuf = qhbuffer + (qjkoff - qia + mia);
2023 const Float *gbuf = gcbuffer + (gjkoff - i - gia + mia);
2024 #ifdef MSM_PROFILING
2028 #if defined(__INTEL_COMPILER)
2029 #pragma vector always
2031 for (
int ii = 0; ii < nn; ii++) {
2032 ehsum += gbuf[ii] * qbuf[ii];
2038 int nn = mib - mia + 1;
2040 int qnji = qnj * qni;
2041 int qkoff = -qka*qnji - qja*qni - qia + mia;
2042 int gnji = gnj * gni;
2043 int gkoff = (-k-gka)*gnji + (-j-gja)*gni - i - gia + mia;
2045 for (
int qk = mka; qk <= mkb; qk++) {
2046 int qjkoff = qkoff + qk*qnji;
2047 int gjkoff = gkoff + qk*gnji;
2049 for (
int qj = mja; qj <= mjb; qj++) {
2050 const Vtype *qbuf = qhbuffer + (qjkoff + qj*qni);
2051 const Mtype *gbuf = gcbuffer + (gjkoff + qj*gni);
2054 #ifdef MSM_PROFILING
2058 #if defined(__INTEL_COMPILER)
2059 #pragma vector always
2061 for (
int ii = 0; ii < 8; ii++) {
2062 ehsum += gbuf[ii] * qbuf[ii];
2069 int qnji = qnj * qni;
2070 int qkoff = -qka*qnji - qja*qni - qia + mia;
2071 int gnji = gnj * gni;
2072 int gkoff = (-k-gka)*gnji + (-j-gja)*gni - i - gia + mia;
2074 for (
int qk = mka; qk <= mkb; qk++) {
2075 int qjkoff = qkoff + qk*qnji;
2076 int gjkoff = gkoff + qk*gnji;
2078 for (
int qj = mja; qj <= mjb; qj++) {
2079 const Vtype *qbuf = qhbuffer + (qjkoff + qj*qni);
2080 const Mtype *gbuf = gcbuffer + (gjkoff + qj*gni);
2083 #ifdef MSM_PROFILING
2087 #if defined(__INTEL_COMPILER)
2088 #pragma vector always
2090 for (
int ii = 0; ii < nn; ii++) {
2091 ehsum += gbuf[ii] * qbuf[ii];
2101 ehbuffer[index] = ehsum;
2106 #endif // !MSM_COMM_ONLY
2108 #ifdef MSM_PROFILING
2116 #ifdef MSM_FOLD_FACTOR
2125 #ifdef DEBUG_MSM_GRID
2126 printf(
"level=%d ehfold: [%d..%d] x [%d..%d] x [%d..%d] "
2128 " eh: [%d..%d] x [%d..%d] x [%d..%d] "
2130 " eh lower: %d %d %d\n",
2150 for (
int k = ka; k <= kb; k++) {
2152 if (kk <
eka)
do { kk +=
enk; }
while (kk <
eka);
2153 else if (kk >
ekb)
do { kk -=
enk; }
while (kk >
ekb);
2154 int koff = (kk -
eka) *
enj;
2155 for (
int j = ja; j <= jb; j++) {
2157 if (jj <
eja)
do { jj +=
enj; }
while (jj <
eja);
2158 else if (jj >
ejb)
do { jj -=
enj; }
while (jj >
ejb);
2159 int jkoff = (koff + (jj -
eja)) *
eni;
2160 for (
int i = ia; i <= ib; i++, index++) {
2162 if (ii <
eia)
do { ii +=
eni; }
while (ii <
eia);
2163 else if (ii >
eib)
do { ii -=
eni; }
while (ii >
eib);
2164 int ijkoff = jkoff + (ii -
eia);
2165 ehbuf[ijkoff] += ehfoldbuf[index];
2174 #else // !MSM_FOLD_FACTOR
2177 #endif // MSM_FOLD_FACTOR
2180 stopTime = CkWallTimer();
const Array< T > & data() const
msm::Grid< Vtype > ehfold
msm::BlockSend ehblockSend
msm::BlockIndex qhblockIndex
void set(int pia, int pni, int pja, int pnj, int pka, int pnk)
void init(const IndexRange &n)
const msm::Grid< Mtype > * pgc
void updateLower(const Ivec &n)
void get(msm::Grid< T > &g, int &id, int &seq)