Reduce GPU/CPU data transfer

This commit is contained in:
Stan Moore 2019-04-09 10:23:37 -06:00
parent 82be3ee32c
commit a01bce46bb
8 changed files with 467 additions and 292 deletions

View File

@ -21,10 +21,11 @@
#include "atom_masks.h"
#include "memory_kokkos.h"
#include "error.h"
#include "force.h"
using namespace LAMMPS_NS;
#define DELTA 10000
#define DELTA 16384
/* ---------------------------------------------------------------------- */
@ -1763,55 +1764,79 @@ bigint AtomVecAngleKokkos::memory_usage()
void AtomVecAngleKokkos::sync(ExecutionSpace space, unsigned int mask)
{
int nlocal = atom->nlocal;
int nall = atom->nlocal + atom->nghost;
// avoid unnecessary data transfer
auto k_x = Kokkos::subview(atomKK->k_x,std::make_pair(0,nall),Kokkos::ALL);
auto k_v = Kokkos::subview(atomKK->k_v,std::make_pair(0,nall),Kokkos::ALL);
auto k_f = Kokkos::subview(atomKK->k_f,std::make_pair(0,(!force || force->newton)?nall:nlocal),Kokkos::ALL);
auto k_tag = Kokkos::subview(atomKK->k_tag,std::make_pair(0,nall));
auto k_type = Kokkos::subview(atomKK->k_type,std::make_pair(0,nall));
auto k_mask = Kokkos::subview(atomKK->k_mask,std::make_pair(0,nall));
auto k_image = Kokkos::subview(atomKK->k_image,std::make_pair(0,nall));
auto k_molecule = Kokkos::subview(atomKK->k_molecule,std::make_pair(0,nall));
auto k_nspecial = Kokkos::subview(atomKK->k_nspecial,std::make_pair(0,nall),Kokkos::ALL);
auto k_special = Kokkos::subview(atomKK->k_special,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_bond = Kokkos::subview(atomKK->k_num_bond,std::make_pair(0,nall));
auto k_bond_type = Kokkos::subview(atomKK->k_bond_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_bond_atom = Kokkos::subview(atomKK->k_bond_atom,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_angle = Kokkos::subview(atomKK->k_num_angle,std::make_pair(0,nall));
auto k_angle_type = Kokkos::subview(atomKK->k_angle_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_angle_atom1 = Kokkos::subview(atomKK->k_angle_atom1,std::make_pair(0,nall),Kokkos::ALL);
auto k_angle_atom2 = Kokkos::subview(atomKK->k_angle_atom2,std::make_pair(0,nall),Kokkos::ALL);
auto k_angle_atom3 = Kokkos::subview(atomKK->k_angle_atom3,std::make_pair(0,nall),Kokkos::ALL);
if (space == Device) {
if (mask & X_MASK) atomKK->k_x.sync<LMPDeviceType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPDeviceType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPDeviceType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.sync<LMPDeviceType>();
if (mask & X_MASK) k_x.sync<LMPDeviceType>();
if (mask & V_MASK) k_v.sync<LMPDeviceType>();
if (mask & F_MASK) k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) k_image.sync<LMPDeviceType>();
if (mask & MOLECULE_MASK) k_molecule.sync<LMPDeviceType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.sync<LMPDeviceType>();
atomKK->k_special.sync<LMPDeviceType>();
k_nspecial.sync<LMPDeviceType>();
k_special.sync<LMPDeviceType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.sync<LMPDeviceType>();
atomKK->k_bond_type.sync<LMPDeviceType>();
atomKK->k_bond_atom.sync<LMPDeviceType>();
k_num_bond.sync<LMPDeviceType>();
k_bond_type.sync<LMPDeviceType>();
k_bond_atom.sync<LMPDeviceType>();
}
if (mask & ANGLE_MASK) {
atomKK->k_num_angle.sync<LMPDeviceType>();
atomKK->k_angle_type.sync<LMPDeviceType>();
atomKK->k_angle_atom1.sync<LMPDeviceType>();
atomKK->k_angle_atom2.sync<LMPDeviceType>();
atomKK->k_angle_atom3.sync<LMPDeviceType>();
k_num_angle.sync<LMPDeviceType>();
k_angle_type.sync<LMPDeviceType>();
k_angle_atom1.sync<LMPDeviceType>();
k_angle_atom2.sync<LMPDeviceType>();
k_angle_atom3.sync<LMPDeviceType>();
}
} else {
if (mask & X_MASK) atomKK->k_x.sync<LMPHostType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPHostType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPHostType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPHostType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPHostType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.sync<LMPHostType>();
if (mask & X_MASK) k_x.sync<LMPHostType>();
if (mask & V_MASK) k_v.sync<LMPHostType>();
if (mask & F_MASK) k_f.sync<LMPHostType>();
if (mask & TAG_MASK) k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) k_type.sync<LMPHostType>();
if (mask & MASK_MASK) k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) k_image.sync<LMPHostType>();
if (mask & MOLECULE_MASK) k_molecule.sync<LMPHostType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.sync<LMPHostType>();
atomKK->k_special.sync<LMPHostType>();
k_nspecial.sync<LMPHostType>();
k_special.sync<LMPHostType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.sync<LMPHostType>();
atomKK->k_bond_type.sync<LMPHostType>();
atomKK->k_bond_atom.sync<LMPHostType>();
k_num_bond.sync<LMPHostType>();
k_bond_type.sync<LMPHostType>();
k_bond_atom.sync<LMPHostType>();
}
if (mask & ANGLE_MASK) {
atomKK->k_num_angle.sync<LMPHostType>();
atomKK->k_angle_type.sync<LMPHostType>();
atomKK->k_angle_atom1.sync<LMPHostType>();
atomKK->k_angle_atom2.sync<LMPHostType>();
atomKK->k_angle_atom3.sync<LMPHostType>();
k_num_angle.sync<LMPHostType>();
k_angle_type.sync<LMPHostType>();
k_angle_atom1.sync<LMPHostType>();
k_angle_atom2.sync<LMPHostType>();
k_angle_atom3.sync<LMPHostType>();
}
}
}

View File

@ -25,7 +25,7 @@
using namespace LAMMPS_NS;
#define DELTA 10
#define DELTA 16384
/* ---------------------------------------------------------------------- */
@ -56,8 +56,7 @@ AtomVecAtomicKokkos::AtomVecAtomicKokkos(LAMMPS *lmp) : AtomVecKokkos(lmp)
void AtomVecAtomicKokkos::grow(int n)
{
int step = MAX(DELTA,nmax*0.01);
if (n == 0) nmax += step;
if (n == 0) nmax += DELTA;
else nmax = n;
atomKK->nmax = nmax;
if (nmax < 0 || nmax > MAXSMALLINT)
@ -899,36 +898,35 @@ bigint AtomVecAtomicKokkos::memory_usage()
void AtomVecAtomicKokkos::sync(ExecutionSpace space, unsigned int mask)
{
int nlocal = atom->nlocal;
int nall = atom->nlocal + atom->nghost;
// avoid unnecessary data transfer
auto k_x = Kokkos::subview(atomKK->k_x,std::make_pair(0,nall),Kokkos::ALL);
auto k_v = Kokkos::subview(atomKK->k_v,std::make_pair(0,nall),Kokkos::ALL);
auto k_f = Kokkos::subview(atomKK->k_f,std::make_pair(0,(!force || force->newton)?nall:nlocal),Kokkos::ALL);
auto k_tag = Kokkos::subview(atomKK->k_tag,std::make_pair(0,nall));
auto k_type = Kokkos::subview(atomKK->k_type,std::make_pair(0,nall));
auto k_mask = Kokkos::subview(atomKK->k_mask,std::make_pair(0,nall));
auto k_image = Kokkos::subview(atomKK->k_image,std::make_pair(0,nall));
if (space == Device) {
if (mask & X_MASK) atomKK->k_x.sync<LMPDeviceType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPDeviceType>();
if (mask & F_MASK) {
if (!force || force->newton) {
atomKK->k_f.sync<LMPDeviceType>();
} else {
auto k_f_nlocal = Kokkos::subview(atomKK->k_f,std::make_pair(0,atom->nlocal),Kokkos::ALL);
k_f_nlocal.sync<LMPDeviceType>();
}
}
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPDeviceType>();
if (mask & X_MASK) k_x.sync<LMPDeviceType>();
if (mask & V_MASK) k_v.sync<LMPDeviceType>();
if (mask & F_MASK) k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) k_image.sync<LMPDeviceType>();
} else {
if (mask & X_MASK) atomKK->k_x.sync<LMPHostType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPHostType>();
if (mask & F_MASK) {
if (!force || force->newton) {
atomKK->k_f.sync<LMPHostType>();
} else {
auto k_f_nlocal = Kokkos::subview(atomKK->k_f,std::make_pair(0,atom->nlocal),Kokkos::ALL);
k_f_nlocal.sync<LMPHostType>();
}
}
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPHostType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPHostType>();
if (mask & X_MASK) k_x.sync<LMPHostType>();
if (mask & V_MASK) k_v.sync<LMPHostType>();
if (mask & F_MASK) k_f.sync<LMPHostType>();
if (mask & TAG_MASK) k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) k_type.sync<LMPHostType>();
if (mask & MASK_MASK) k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) k_image.sync<LMPHostType>();
}
}

View File

@ -21,10 +21,11 @@
#include "atom_masks.h"
#include "memory_kokkos.h"
#include "error.h"
#include "force.h"
using namespace LAMMPS_NS;
#define DELTA 10000
#define DELTA 16384
/* ---------------------------------------------------------------------- */
@ -1175,41 +1176,61 @@ bigint AtomVecBondKokkos::memory_usage()
void AtomVecBondKokkos::sync(ExecutionSpace space, unsigned int mask)
{
int nlocal = atom->nlocal;
int nall = atom->nlocal + atom->nghost;
// avoid unnecessary data transfer
auto k_x = Kokkos::subview(atomKK->k_x,std::make_pair(0,nall),Kokkos::ALL);
auto k_v = Kokkos::subview(atomKK->k_v,std::make_pair(0,nall),Kokkos::ALL);
auto k_f = Kokkos::subview(atomKK->k_f,std::make_pair(0,(!force || force->newton)?nall:nlocal),Kokkos::ALL);
auto k_tag = Kokkos::subview(atomKK->k_tag,std::make_pair(0,nall));
auto k_type = Kokkos::subview(atomKK->k_type,std::make_pair(0,nall));
auto k_mask = Kokkos::subview(atomKK->k_mask,std::make_pair(0,nall));
auto k_image = Kokkos::subview(atomKK->k_image,std::make_pair(0,nall));
auto k_q = Kokkos::subview(atomKK->k_q,std::make_pair(0,nall));
auto k_molecule = Kokkos::subview(atomKK->k_molecule,std::make_pair(0,nall));
auto k_nspecial = Kokkos::subview(atomKK->k_nspecial,std::make_pair(0,nall),Kokkos::ALL);
auto k_special = Kokkos::subview(atomKK->k_special,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_bond = Kokkos::subview(atomKK->k_num_bond,std::make_pair(0,nall));
auto k_bond_type = Kokkos::subview(atomKK->k_bond_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_bond_atom = Kokkos::subview(atomKK->k_bond_atom,std::make_pair(0,nall),Kokkos::ALL);
if (space == Device) {
if (mask & X_MASK) atomKK->k_x.sync<LMPDeviceType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPDeviceType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPDeviceType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.sync<LMPDeviceType>();
if (mask & X_MASK) k_x.sync<LMPDeviceType>();
if (mask & V_MASK) k_v.sync<LMPDeviceType>();
if (mask & F_MASK) k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) k_image.sync<LMPDeviceType>();
if (mask & MOLECULE_MASK) k_molecule.sync<LMPDeviceType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.sync<LMPDeviceType>();
atomKK->k_special.sync<LMPDeviceType>();
k_nspecial.sync<LMPDeviceType>();
k_special.sync<LMPDeviceType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.sync<LMPDeviceType>();
atomKK->k_bond_type.sync<LMPDeviceType>();
atomKK->k_bond_atom.sync<LMPDeviceType>();
k_num_bond.sync<LMPDeviceType>();
k_bond_type.sync<LMPDeviceType>();
k_bond_atom.sync<LMPDeviceType>();
}
} else {
if (mask & X_MASK) atomKK->k_x.sync<LMPHostType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPHostType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPHostType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPHostType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPHostType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.sync<LMPHostType>();
if (mask & X_MASK) k_x.sync<LMPHostType>();
if (mask & V_MASK) k_v.sync<LMPHostType>();
if (mask & F_MASK) k_f.sync<LMPHostType>();
if (mask & TAG_MASK) k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) k_type.sync<LMPHostType>();
if (mask & MASK_MASK) k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) k_image.sync<LMPHostType>();
if (mask & MOLECULE_MASK) k_molecule.sync<LMPHostType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.sync<LMPHostType>();
atomKK->k_special.sync<LMPHostType>();
k_nspecial.sync<LMPHostType>();
k_special.sync<LMPHostType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.sync<LMPHostType>();
atomKK->k_bond_type.sync<LMPHostType>();
atomKK->k_bond_atom.sync<LMPHostType>();
k_num_bond.sync<LMPHostType>();
k_bond_type.sync<LMPHostType>();
k_bond_atom.sync<LMPHostType>();
}
}
}

View File

@ -21,10 +21,11 @@
#include "atom_masks.h"
#include "memory_kokkos.h"
#include "error.h"
#include "force.h"
using namespace LAMMPS_NS;
#define DELTA 10000
#define DELTA 16384
/* ---------------------------------------------------------------------- */
@ -1068,24 +1069,38 @@ bigint AtomVecChargeKokkos::memory_usage()
void AtomVecChargeKokkos::sync(ExecutionSpace space, unsigned int mask)
{
int nlocal = atom->nlocal;
int nall = atom->nlocal + atom->nghost;
// avoid unnecessary data transfer
auto k_x = Kokkos::subview(atomKK->k_x,std::make_pair(0,nall),Kokkos::ALL);
auto k_v = Kokkos::subview(atomKK->k_v,std::make_pair(0,nall),Kokkos::ALL);
auto k_f = Kokkos::subview(atomKK->k_f,std::make_pair(0,(!force || force->newton)?nall:nlocal),Kokkos::ALL);
auto k_tag = Kokkos::subview(atomKK->k_tag,std::make_pair(0,nall));
auto k_type = Kokkos::subview(atomKK->k_type,std::make_pair(0,nall));
auto k_mask = Kokkos::subview(atomKK->k_mask,std::make_pair(0,nall));
auto k_image = Kokkos::subview(atomKK->k_image,std::make_pair(0,nall));
auto k_q = Kokkos::subview(atomKK->k_q,std::make_pair(0,nall));
if (space == Device) {
if (mask & X_MASK) atomKK->k_x.sync<LMPDeviceType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPDeviceType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPDeviceType>();
if (mask & Q_MASK) atomKK->k_q.sync<LMPDeviceType>();
if (mask & X_MASK) k_x.sync<LMPDeviceType>();
if (mask & V_MASK) k_v.sync<LMPDeviceType>();
if (mask & F_MASK) k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) k_image.sync<LMPDeviceType>();
if (mask & Q_MASK) k_q.sync<LMPDeviceType>();
} else {
if (mask & X_MASK) atomKK->k_x.sync<LMPHostType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPHostType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPHostType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPHostType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPHostType>();
if (mask & Q_MASK) atomKK->k_q.sync<LMPHostType>();
if (mask & X_MASK) k_x.sync<LMPHostType>();
if (mask & V_MASK) k_v.sync<LMPHostType>();
if (mask & F_MASK) k_f.sync<LMPHostType>();
if (mask & TAG_MASK) k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) k_type.sync<LMPHostType>();
if (mask & MASK_MASK) k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) k_image.sync<LMPHostType>();
if (mask & Q_MASK) k_q.sync<LMPHostType>();
}
}

View File

@ -21,10 +21,11 @@
#include "atom_masks.h"
#include "memory_kokkos.h"
#include "error.h"
#include "force.h"
using namespace LAMMPS_NS;
#define DELTA 10000
#define DELTA 16384
/* ---------------------------------------------------------------------- */
@ -1856,40 +1857,62 @@ bigint AtomVecDPDKokkos::memory_usage()
void AtomVecDPDKokkos::sync(ExecutionSpace space, unsigned int mask)
{
int nlocal = atom->nlocal;
int nall = atom->nlocal + atom->nghost;
// avoid unnecessary data transfer
auto k_x = Kokkos::subview(atomKK->k_x,std::make_pair(0,nall),Kokkos::ALL);
auto k_v = Kokkos::subview(atomKK->k_v,std::make_pair(0,nall),Kokkos::ALL);
auto k_f = Kokkos::subview(atomKK->k_f,std::make_pair(0,(!force || force->newton)?nall:nlocal),Kokkos::ALL);
auto k_tag = Kokkos::subview(atomKK->k_tag,std::make_pair(0,nall));
auto k_type = Kokkos::subview(atomKK->k_type,std::make_pair(0,nall));
auto k_mask = Kokkos::subview(atomKK->k_mask,std::make_pair(0,nall));
auto k_image = Kokkos::subview(atomKK->k_image,std::make_pair(0,nall));
auto k_rho = Kokkos::subview(atomKK->k_rho,std::make_pair(0,nall));
auto k_dpdTheta = Kokkos::subview(atomKK->k_dpdTheta,std::make_pair(0,nall));
auto k_uCond = Kokkos::subview(atomKK->k_uCond,std::make_pair(0,nall));
auto k_uMech = Kokkos::subview(atomKK->k_uMech,std::make_pair(0,nall));
auto k_uChem = Kokkos::subview(atomKK->k_uChem,std::make_pair(0,nall));
auto k_uCG = Kokkos::subview(atomKK->k_uCG,std::make_pair(0,nall));
auto k_uCGnew = Kokkos::subview(atomKK->k_uCGnew,std::make_pair(0,nall));
auto k_duChem = Kokkos::subview(atomKK->k_duChem,std::make_pair(0,nall));
auto k_dvector = Kokkos::subview(atomKK->k_dvector,std::make_pair(0,nall),Kokkos::ALL);
if (space == Device) {
if (mask & X_MASK) atomKK->k_x.sync<LMPDeviceType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPDeviceType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPDeviceType>();
if (mask & DPDRHO_MASK) atomKK->k_rho.sync<LMPDeviceType>();
if (mask & DPDTHETA_MASK) atomKK->k_dpdTheta.sync<LMPDeviceType>();
if (mask & UCOND_MASK) atomKK->k_uCond.sync<LMPDeviceType>();
if (mask & UMECH_MASK) atomKK->k_uMech.sync<LMPDeviceType>();
if (mask & UCHEM_MASK) atomKK->k_uChem.sync<LMPDeviceType>();
if (mask & UCG_MASK) atomKK->k_uCG.sync<LMPDeviceType>();
if (mask & UCGNEW_MASK) atomKK->k_uCGnew.sync<LMPDeviceType>();
if (mask & DUCHEM_MASK) atomKK->k_duChem.sync<LMPDeviceType>();
if (mask & DVECTOR_MASK) atomKK->k_dvector.sync<LMPDeviceType>();
if (mask & X_MASK) k_x.sync<LMPDeviceType>();
if (mask & V_MASK) k_v.sync<LMPDeviceType>();
if (mask & F_MASK) k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) k_image.sync<LMPDeviceType>();
if (mask & DPDRHO_MASK) k_rho.sync<LMPDeviceType>();
if (mask & DPDTHETA_MASK) k_dpdTheta.sync<LMPDeviceType>();
if (mask & UCOND_MASK) k_uCond.sync<LMPDeviceType>();
if (mask & UMECH_MASK) k_uMech.sync<LMPDeviceType>();
if (mask & UCHEM_MASK) k_uChem.sync<LMPDeviceType>();
if (mask & UCG_MASK) k_uCG.sync<LMPDeviceType>();
if (mask & UCGNEW_MASK) k_uCGnew.sync<LMPDeviceType>();
if (mask & DUCHEM_MASK) k_duChem.sync<LMPDeviceType>();
if (mask & DVECTOR_MASK) k_dvector.sync<LMPDeviceType>();
} else {
if (mask & X_MASK) atomKK->k_x.sync<LMPHostType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPHostType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPHostType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPHostType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPHostType>();
if (mask & DPDRHO_MASK) atomKK->k_rho.sync<LMPHostType>();
if (mask & DPDTHETA_MASK) atomKK->k_dpdTheta.sync<LMPHostType>();
if (mask & UCOND_MASK) atomKK->k_uCond.sync<LMPHostType>();
if (mask & UMECH_MASK) atomKK->k_uMech.sync<LMPHostType>();
if (mask & UCHEM_MASK) atomKK->k_uChem.sync<LMPHostType>();
if (mask & UCG_MASK) atomKK->k_uCG.sync<LMPHostType>();
if (mask & UCGNEW_MASK) atomKK->k_uCGnew.sync<LMPHostType>();
if (mask & DUCHEM_MASK) atomKK->k_duChem.sync<LMPHostType>();
if (mask & DVECTOR_MASK) atomKK->k_dvector.sync<LMPHostType>();
if (mask & X_MASK) k_x.sync<LMPHostType>();
if (mask & V_MASK) k_v.sync<LMPHostType>();
if (mask & F_MASK) k_f.sync<LMPHostType>();
if (mask & TAG_MASK) k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) k_type.sync<LMPHostType>();
if (mask & MASK_MASK) k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) k_image.sync<LMPHostType>();
if (mask & DPDRHO_MASK) k_rho.sync<LMPHostType>();
if (mask & DPDTHETA_MASK) k_dpdTheta.sync<LMPHostType>();
if (mask & UCOND_MASK) k_uCond.sync<LMPHostType>();
if (mask & UMECH_MASK) k_uMech.sync<LMPHostType>();
if (mask & UCHEM_MASK) k_uChem.sync<LMPHostType>();
if (mask & UCG_MASK) k_uCG.sync<LMPHostType>();
if (mask & UCGNEW_MASK) k_uCGnew.sync<LMPHostType>();
if (mask & DUCHEM_MASK) k_duChem.sync<LMPHostType>();
if (mask & DVECTOR_MASK) k_dvector.sync<LMPHostType>();
}
}

View File

@ -21,10 +21,11 @@
#include "atom_masks.h"
#include "memory_kokkos.h"
#include "error.h"
#include "force.h"
using namespace LAMMPS_NS;
#define DELTA 10000
#define DELTA 16384
/* ---------------------------------------------------------------------- */
@ -1651,89 +1652,126 @@ bigint AtomVecFullKokkos::memory_usage()
void AtomVecFullKokkos::sync(ExecutionSpace space, unsigned int mask)
{
int nlocal = atom->nlocal;
int nall = atom->nlocal + atom->nghost;
// avoid unnecessary data transfer
auto k_x = Kokkos::subview(atomKK->k_x,std::make_pair(0,nall),Kokkos::ALL);
auto k_v = Kokkos::subview(atomKK->k_v,std::make_pair(0,nall),Kokkos::ALL);
auto k_f = Kokkos::subview(atomKK->k_f,std::make_pair(0,(!force || force->newton)?nall:nlocal),Kokkos::ALL);
auto k_tag = Kokkos::subview(atomKK->k_tag,std::make_pair(0,nall));
auto k_type = Kokkos::subview(atomKK->k_type,std::make_pair(0,nall));
auto k_mask = Kokkos::subview(atomKK->k_mask,std::make_pair(0,nall));
auto k_image = Kokkos::subview(atomKK->k_image,std::make_pair(0,nall));
auto k_q = Kokkos::subview(atomKK->k_q,std::make_pair(0,nall));
auto k_molecule = Kokkos::subview(atomKK->k_molecule,std::make_pair(0,nall));
auto k_nspecial = Kokkos::subview(atomKK->k_nspecial,std::make_pair(0,nall),Kokkos::ALL);
auto k_special = Kokkos::subview(atomKK->k_special,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_bond = Kokkos::subview(atomKK->k_num_bond,std::make_pair(0,nall));
auto k_bond_type = Kokkos::subview(atomKK->k_bond_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_bond_atom = Kokkos::subview(atomKK->k_bond_atom,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_angle = Kokkos::subview(atomKK->k_num_angle,std::make_pair(0,nall));
auto k_angle_type = Kokkos::subview(atomKK->k_angle_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_angle_atom1 = Kokkos::subview(atomKK->k_angle_atom1,std::make_pair(0,nall),Kokkos::ALL);
auto k_angle_atom2 = Kokkos::subview(atomKK->k_angle_atom2,std::make_pair(0,nall),Kokkos::ALL);
auto k_angle_atom3 = Kokkos::subview(atomKK->k_angle_atom3,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_dihedral = Kokkos::subview(atomKK->k_num_dihedral,std::make_pair(0,nall));
auto k_dihedral_type = Kokkos::subview(atomKK->k_dihedral_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_dihedral_atom1 = Kokkos::subview(atomKK->k_dihedral_atom1,std::make_pair(0,nall),Kokkos::ALL);
auto k_dihedral_atom2 = Kokkos::subview(atomKK->k_dihedral_atom2,std::make_pair(0,nall),Kokkos::ALL);
auto k_dihedral_atom3 = Kokkos::subview(atomKK->k_dihedral_atom3,std::make_pair(0,nall),Kokkos::ALL);
auto k_dihedral_atom4 = Kokkos::subview(atomKK->k_dihedral_atom4,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_improper = Kokkos::subview(atomKK->k_num_improper,std::make_pair(0,nall));
auto k_improper_type = Kokkos::subview(atomKK->k_improper_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_improper_atom1 = Kokkos::subview(atomKK->k_improper_atom1,std::make_pair(0,nall),Kokkos::ALL);
auto k_improper_atom2 = Kokkos::subview(atomKK->k_improper_atom2,std::make_pair(0,nall),Kokkos::ALL);
auto k_improper_atom3 = Kokkos::subview(atomKK->k_improper_atom3,std::make_pair(0,nall),Kokkos::ALL);
auto k_improper_atom4 = Kokkos::subview(atomKK->k_improper_atom4,std::make_pair(0,nall),Kokkos::ALL);
if (space == Device) {
if (mask & X_MASK) atomKK->k_x.sync<LMPDeviceType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPDeviceType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPDeviceType>();
if (mask & Q_MASK) atomKK->k_q.sync<LMPDeviceType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.sync<LMPDeviceType>();
if (mask & X_MASK) k_x.sync<LMPDeviceType>();
if (mask & V_MASK) k_v.sync<LMPDeviceType>();
if (mask & F_MASK) k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) k_image.sync<LMPDeviceType>();
if (mask & Q_MASK) k_q.sync<LMPDeviceType>();
if (mask & MOLECULE_MASK) k_molecule.sync<LMPDeviceType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.sync<LMPDeviceType>();
atomKK->k_special.sync<LMPDeviceType>();
k_nspecial.sync<LMPDeviceType>();
k_special.sync<LMPDeviceType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.sync<LMPDeviceType>();
atomKK->k_bond_type.sync<LMPDeviceType>();
atomKK->k_bond_atom.sync<LMPDeviceType>();
k_num_bond.sync<LMPDeviceType>();
k_bond_type.sync<LMPDeviceType>();
k_bond_atom.sync<LMPDeviceType>();
}
if (mask & ANGLE_MASK) {
atomKK->k_num_angle.sync<LMPDeviceType>();
atomKK->k_angle_type.sync<LMPDeviceType>();
atomKK->k_angle_atom1.sync<LMPDeviceType>();
atomKK->k_angle_atom2.sync<LMPDeviceType>();
atomKK->k_angle_atom3.sync<LMPDeviceType>();
k_num_angle.sync<LMPDeviceType>();
k_angle_type.sync<LMPDeviceType>();
k_angle_atom1.sync<LMPDeviceType>();
k_angle_atom2.sync<LMPDeviceType>();
k_angle_atom3.sync<LMPDeviceType>();
}
if (mask & DIHEDRAL_MASK) {
atomKK->k_num_dihedral.sync<LMPDeviceType>();
atomKK->k_dihedral_type.sync<LMPDeviceType>();
atomKK->k_dihedral_atom1.sync<LMPDeviceType>();
atomKK->k_dihedral_atom2.sync<LMPDeviceType>();
atomKK->k_dihedral_atom3.sync<LMPDeviceType>();
atomKK->k_dihedral_atom4.sync<LMPDeviceType>();
k_num_dihedral.sync<LMPDeviceType>();
k_dihedral_type.sync<LMPDeviceType>();
k_dihedral_atom1.sync<LMPDeviceType>();
k_dihedral_atom2.sync<LMPDeviceType>();
k_dihedral_atom3.sync<LMPDeviceType>();
k_dihedral_atom4.sync<LMPDeviceType>();
}
if (mask & IMPROPER_MASK) {
atomKK->k_num_improper.sync<LMPDeviceType>();
atomKK->k_improper_type.sync<LMPDeviceType>();
atomKK->k_improper_atom1.sync<LMPDeviceType>();
atomKK->k_improper_atom2.sync<LMPDeviceType>();
atomKK->k_improper_atom3.sync<LMPDeviceType>();
atomKK->k_improper_atom4.sync<LMPDeviceType>();
k_num_improper.sync<LMPDeviceType>();
k_improper_type.sync<LMPDeviceType>();
k_improper_atom1.sync<LMPDeviceType>();
k_improper_atom2.sync<LMPDeviceType>();
k_improper_atom3.sync<LMPDeviceType>();
k_improper_atom4.sync<LMPDeviceType>();
}
} else {
if (mask & X_MASK) atomKK->k_x.sync<LMPHostType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPHostType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPHostType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPHostType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPHostType>();
if (mask & Q_MASK) atomKK->k_q.sync<LMPHostType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.sync<LMPHostType>();
if (mask & X_MASK) k_x.sync<LMPHostType>();
if (mask & V_MASK) k_v.sync<LMPHostType>();
if (mask & F_MASK) k_f.sync<LMPHostType>();
if (mask & TAG_MASK) k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) k_type.sync<LMPHostType>();
if (mask & MASK_MASK) k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) k_image.sync<LMPHostType>();
if (mask & Q_MASK) k_q.sync<LMPHostType>();
if (mask & MOLECULE_MASK) k_molecule.sync<LMPHostType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.sync<LMPHostType>();
atomKK->k_special.sync<LMPHostType>();
k_nspecial.sync<LMPHostType>();
k_special.sync<LMPHostType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.sync<LMPHostType>();
atomKK->k_bond_type.sync<LMPHostType>();
atomKK->k_bond_atom.sync<LMPHostType>();
k_num_bond.sync<LMPHostType>();
k_bond_type.sync<LMPHostType>();
k_bond_atom.sync<LMPHostType>();
}
if (mask & ANGLE_MASK) {
atomKK->k_num_angle.sync<LMPHostType>();
atomKK->k_angle_type.sync<LMPHostType>();
atomKK->k_angle_atom1.sync<LMPHostType>();
atomKK->k_angle_atom2.sync<LMPHostType>();
atomKK->k_angle_atom3.sync<LMPHostType>();
k_num_angle.sync<LMPHostType>();
k_angle_type.sync<LMPHostType>();
k_angle_atom1.sync<LMPHostType>();
k_angle_atom2.sync<LMPHostType>();
k_angle_atom3.sync<LMPHostType>();
}
if (mask & DIHEDRAL_MASK) {
atomKK->k_num_dihedral.sync<LMPHostType>();
atomKK->k_dihedral_type.sync<LMPHostType>();
atomKK->k_dihedral_atom1.sync<LMPHostType>();
atomKK->k_dihedral_atom2.sync<LMPHostType>();
atomKK->k_dihedral_atom3.sync<LMPHostType>();
atomKK->k_dihedral_atom4.sync<LMPHostType>();
k_num_dihedral.sync<LMPHostType>();
k_dihedral_type.sync<LMPHostType>();
k_dihedral_atom1.sync<LMPHostType>();
k_dihedral_atom2.sync<LMPHostType>();
k_dihedral_atom3.sync<LMPHostType>();
k_dihedral_atom4.sync<LMPHostType>();
}
if (mask & IMPROPER_MASK) {
atomKK->k_num_improper.sync<LMPHostType>();
atomKK->k_improper_type.sync<LMPHostType>();
atomKK->k_improper_atom1.sync<LMPHostType>();
atomKK->k_improper_atom2.sync<LMPHostType>();
atomKK->k_improper_atom3.sync<LMPHostType>();
atomKK->k_improper_atom4.sync<LMPHostType>();
k_num_improper.sync<LMPHostType>();
k_improper_type.sync<LMPHostType>();
k_improper_atom1.sync<LMPHostType>();
k_improper_atom2.sync<LMPHostType>();
k_improper_atom3.sync<LMPHostType>();
k_improper_atom4.sync<LMPHostType>();
}
}
}

View File

@ -21,10 +21,11 @@
#include "atom_masks.h"
#include "memory_kokkos.h"
#include "error.h"
#include "force.h"
using namespace LAMMPS_NS;
#define DELTA 10000
#define DELTA 16384
/* ---------------------------------------------------------------------- */
@ -2049,87 +2050,123 @@ bigint AtomVecMolecularKokkos::memory_usage()
void AtomVecMolecularKokkos::sync(ExecutionSpace space, unsigned int mask)
{
int nlocal = atom->nlocal;
int nall = atom->nlocal + atom->nghost;
// avoid unnecessary data transfer
auto k_x = Kokkos::subview(atomKK->k_x,std::make_pair(0,nall),Kokkos::ALL);
auto k_v = Kokkos::subview(atomKK->k_v,std::make_pair(0,nall),Kokkos::ALL);
auto k_f = Kokkos::subview(atomKK->k_f,std::make_pair(0,(!force || force->newton)?nall:nlocal),Kokkos::ALL);
auto k_tag = Kokkos::subview(atomKK->k_tag,std::make_pair(0,nall));
auto k_type = Kokkos::subview(atomKK->k_type,std::make_pair(0,nall));
auto k_mask = Kokkos::subview(atomKK->k_mask,std::make_pair(0,nall));
auto k_image = Kokkos::subview(atomKK->k_image,std::make_pair(0,nall));
auto k_molecule = Kokkos::subview(atomKK->k_molecule,std::make_pair(0,nall));
auto k_nspecial = Kokkos::subview(atomKK->k_nspecial,std::make_pair(0,nall),Kokkos::ALL);
auto k_special = Kokkos::subview(atomKK->k_special,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_bond = Kokkos::subview(atomKK->k_num_bond,std::make_pair(0,nall));
auto k_bond_type = Kokkos::subview(atomKK->k_bond_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_bond_atom = Kokkos::subview(atomKK->k_bond_atom,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_angle = Kokkos::subview(atomKK->k_num_angle,std::make_pair(0,nall));
auto k_angle_type = Kokkos::subview(atomKK->k_angle_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_angle_atom1 = Kokkos::subview(atomKK->k_angle_atom1,std::make_pair(0,nall),Kokkos::ALL);
auto k_angle_atom2 = Kokkos::subview(atomKK->k_angle_atom2,std::make_pair(0,nall),Kokkos::ALL);
auto k_angle_atom3 = Kokkos::subview(atomKK->k_angle_atom3,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_dihedral = Kokkos::subview(atomKK->k_num_dihedral,std::make_pair(0,nall));
auto k_dihedral_type = Kokkos::subview(atomKK->k_dihedral_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_dihedral_atom1 = Kokkos::subview(atomKK->k_dihedral_atom1,std::make_pair(0,nall),Kokkos::ALL);
auto k_dihedral_atom2 = Kokkos::subview(atomKK->k_dihedral_atom2,std::make_pair(0,nall),Kokkos::ALL);
auto k_dihedral_atom3 = Kokkos::subview(atomKK->k_dihedral_atom3,std::make_pair(0,nall),Kokkos::ALL);
auto k_dihedral_atom4 = Kokkos::subview(atomKK->k_dihedral_atom4,std::make_pair(0,nall),Kokkos::ALL);
auto k_num_improper = Kokkos::subview(atomKK->k_num_improper,std::make_pair(0,nall));
auto k_improper_type = Kokkos::subview(atomKK->k_improper_type,std::make_pair(0,nall),Kokkos::ALL);
auto k_improper_atom1 = Kokkos::subview(atomKK->k_improper_atom1,std::make_pair(0,nall),Kokkos::ALL);
auto k_improper_atom2 = Kokkos::subview(atomKK->k_improper_atom2,std::make_pair(0,nall),Kokkos::ALL);
auto k_improper_atom3 = Kokkos::subview(atomKK->k_improper_atom3,std::make_pair(0,nall),Kokkos::ALL);
auto k_improper_atom4 = Kokkos::subview(atomKK->k_improper_atom4,std::make_pair(0,nall),Kokkos::ALL);
if (space == Device) {
if (mask & X_MASK) atomKK->k_x.sync<LMPDeviceType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPDeviceType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPDeviceType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.sync<LMPDeviceType>();
if (mask & X_MASK) k_x.sync<LMPDeviceType>();
if (mask & V_MASK) k_v.sync<LMPDeviceType>();
if (mask & F_MASK) k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) k_image.sync<LMPDeviceType>();
if (mask & MOLECULE_MASK) k_molecule.sync<LMPDeviceType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.sync<LMPDeviceType>();
atomKK->k_special.sync<LMPDeviceType>();
k_nspecial.sync<LMPDeviceType>();
k_special.sync<LMPDeviceType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.sync<LMPDeviceType>();
atomKK->k_bond_type.sync<LMPDeviceType>();
atomKK->k_bond_atom.sync<LMPDeviceType>();
k_num_bond.sync<LMPDeviceType>();
k_bond_type.sync<LMPDeviceType>();
k_bond_atom.sync<LMPDeviceType>();
}
if (mask & ANGLE_MASK) {
atomKK->k_num_angle.sync<LMPDeviceType>();
atomKK->k_angle_type.sync<LMPDeviceType>();
atomKK->k_angle_atom1.sync<LMPDeviceType>();
atomKK->k_angle_atom2.sync<LMPDeviceType>();
atomKK->k_angle_atom3.sync<LMPDeviceType>();
k_num_angle.sync<LMPDeviceType>();
k_angle_type.sync<LMPDeviceType>();
k_angle_atom1.sync<LMPDeviceType>();
k_angle_atom2.sync<LMPDeviceType>();
k_angle_atom3.sync<LMPDeviceType>();
}
if (mask & DIHEDRAL_MASK) {
atomKK->k_num_dihedral.sync<LMPDeviceType>();
atomKK->k_dihedral_type.sync<LMPDeviceType>();
atomKK->k_dihedral_atom1.sync<LMPDeviceType>();
atomKK->k_dihedral_atom2.sync<LMPDeviceType>();
atomKK->k_dihedral_atom3.sync<LMPDeviceType>();
atomKK->k_dihedral_atom4.sync<LMPDeviceType>();
k_num_dihedral.sync<LMPDeviceType>();
k_dihedral_type.sync<LMPDeviceType>();
k_dihedral_atom1.sync<LMPDeviceType>();
k_dihedral_atom2.sync<LMPDeviceType>();
k_dihedral_atom3.sync<LMPDeviceType>();
k_dihedral_atom4.sync<LMPDeviceType>();
}
if (mask & IMPROPER_MASK) {
atomKK->k_num_improper.sync<LMPDeviceType>();
atomKK->k_improper_type.sync<LMPDeviceType>();
atomKK->k_improper_atom1.sync<LMPDeviceType>();
atomKK->k_improper_atom2.sync<LMPDeviceType>();
atomKK->k_improper_atom3.sync<LMPDeviceType>();
atomKK->k_improper_atom4.sync<LMPDeviceType>();
k_num_improper.sync<LMPDeviceType>();
k_improper_type.sync<LMPDeviceType>();
k_improper_atom1.sync<LMPDeviceType>();
k_improper_atom2.sync<LMPDeviceType>();
k_improper_atom3.sync<LMPDeviceType>();
k_improper_atom4.sync<LMPDeviceType>();
}
} else {
if (mask & X_MASK) atomKK->k_x.sync<LMPHostType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPHostType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPHostType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPHostType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPHostType>();
if (mask & MOLECULE_MASK) atomKK->k_molecule.sync<LMPHostType>();
if (mask & X_MASK) k_x.sync<LMPHostType>();
if (mask & V_MASK) k_v.sync<LMPHostType>();
if (mask & F_MASK) k_f.sync<LMPHostType>();
if (mask & TAG_MASK) k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) k_type.sync<LMPHostType>();
if (mask & MASK_MASK) k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) k_image.sync<LMPHostType>();
if (mask & MOLECULE_MASK) k_molecule.sync<LMPHostType>();
if (mask & SPECIAL_MASK) {
atomKK->k_nspecial.sync<LMPHostType>();
atomKK->k_special.sync<LMPHostType>();
k_nspecial.sync<LMPHostType>();
k_special.sync<LMPHostType>();
}
if (mask & BOND_MASK) {
atomKK->k_num_bond.sync<LMPHostType>();
atomKK->k_bond_type.sync<LMPHostType>();
atomKK->k_bond_atom.sync<LMPHostType>();
k_num_bond.sync<LMPHostType>();
k_bond_type.sync<LMPHostType>();
k_bond_atom.sync<LMPHostType>();
}
if (mask & ANGLE_MASK) {
atomKK->k_num_angle.sync<LMPHostType>();
atomKK->k_angle_type.sync<LMPHostType>();
atomKK->k_angle_atom1.sync<LMPHostType>();
atomKK->k_angle_atom2.sync<LMPHostType>();
atomKK->k_angle_atom3.sync<LMPHostType>();
k_num_angle.sync<LMPHostType>();
k_angle_type.sync<LMPHostType>();
k_angle_atom1.sync<LMPHostType>();
k_angle_atom2.sync<LMPHostType>();
k_angle_atom3.sync<LMPHostType>();
}
if (mask & DIHEDRAL_MASK) {
atomKK->k_num_dihedral.sync<LMPHostType>();
atomKK->k_dihedral_type.sync<LMPHostType>();
atomKK->k_dihedral_atom1.sync<LMPHostType>();
atomKK->k_dihedral_atom2.sync<LMPHostType>();
atomKK->k_dihedral_atom3.sync<LMPHostType>();
atomKK->k_dihedral_atom4.sync<LMPHostType>();
k_num_dihedral.sync<LMPHostType>();
k_dihedral_type.sync<LMPHostType>();
k_dihedral_atom1.sync<LMPHostType>();
k_dihedral_atom2.sync<LMPHostType>();
k_dihedral_atom3.sync<LMPHostType>();
k_dihedral_atom4.sync<LMPHostType>();
}
if (mask & IMPROPER_MASK) {
atomKK->k_num_improper.sync<LMPHostType>();
atomKK->k_improper_type.sync<LMPHostType>();
atomKK->k_improper_atom1.sync<LMPHostType>();
atomKK->k_improper_atom2.sync<LMPHostType>();
atomKK->k_improper_atom3.sync<LMPHostType>();
atomKK->k_improper_atom4.sync<LMPHostType>();
k_num_improper.sync<LMPHostType>();
k_improper_type.sync<LMPHostType>();
k_improper_atom1.sync<LMPHostType>();
k_improper_atom2.sync<LMPHostType>();
k_improper_atom3.sync<LMPHostType>();
k_improper_atom4.sync<LMPHostType>();
}
}
}

View File

@ -27,10 +27,11 @@
#include "memory.h"
#include "error.h"
#include "memory_kokkos.h"
#include "force.h"
using namespace LAMMPS_NS;
#define DELTA 10000
#define DELTA 16384
static const double MY_PI = 3.14159265358979323846; // pi
@ -2791,30 +2792,47 @@ bigint AtomVecSphereKokkos::memory_usage()
void AtomVecSphereKokkos::sync(ExecutionSpace space, unsigned int mask)
{
int nlocal = atom->nlocal;
int nall = atom->nlocal + atom->nghost;
// avoid unnecessary data transfer
auto k_x = Kokkos::subview(atomKK->k_x,std::make_pair(0,nall),Kokkos::ALL);
auto k_v = Kokkos::subview(atomKK->k_v,std::make_pair(0,nall),Kokkos::ALL);
auto k_f = Kokkos::subview(atomKK->k_f,std::make_pair(0,(!force || force->newton)?nall:nlocal),Kokkos::ALL);
auto k_tag = Kokkos::subview(atomKK->k_tag,std::make_pair(0,nall));
auto k_type = Kokkos::subview(atomKK->k_type,std::make_pair(0,nall));
auto k_mask = Kokkos::subview(atomKK->k_mask,std::make_pair(0,nall));
auto k_image = Kokkos::subview(atomKK->k_image,std::make_pair(0,nall));
auto k_radius = Kokkos::subview(atomKK->k_radius,std::make_pair(0,nall));
auto k_rmass = Kokkos::subview(atomKK->k_rmass,std::make_pair(0,nall));
auto k_omega = Kokkos::subview(atomKK->k_omega,std::make_pair(0,nall),Kokkos::ALL);
auto k_torque = Kokkos::subview(atomKK->k_torque,std::make_pair(0,nall),Kokkos::ALL);
if (space == Device) {
if (mask & X_MASK) atomKK->k_x.sync<LMPDeviceType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPDeviceType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPDeviceType>();
if (mask & RADIUS_MASK) atomKK->k_radius.sync<LMPDeviceType>();
if (mask & RMASS_MASK) atomKK->k_rmass.sync<LMPDeviceType>();
if (mask & OMEGA_MASK) atomKK->k_omega.sync<LMPDeviceType>();
if (mask & TORQUE_MASK) atomKK->k_torque.sync<LMPDeviceType>();
if (mask & X_MASK) k_x.sync<LMPDeviceType>();
if (mask & V_MASK) k_v.sync<LMPDeviceType>();
if (mask & F_MASK) k_f.sync<LMPDeviceType>();
if (mask & TAG_MASK) k_tag.sync<LMPDeviceType>();
if (mask & TYPE_MASK) k_type.sync<LMPDeviceType>();
if (mask & MASK_MASK) k_mask.sync<LMPDeviceType>();
if (mask & IMAGE_MASK) k_image.sync<LMPDeviceType>();
if (mask & RADIUS_MASK) k_radius.sync<LMPDeviceType>();
if (mask & RMASS_MASK) k_rmass.sync<LMPDeviceType>();
if (mask & OMEGA_MASK) k_omega.sync<LMPDeviceType>();
if (mask & TORQUE_MASK) k_torque.sync<LMPDeviceType>();
} else {
if (mask & X_MASK) atomKK->k_x.sync<LMPHostType>();
if (mask & V_MASK) atomKK->k_v.sync<LMPHostType>();
if (mask & F_MASK) atomKK->k_f.sync<LMPHostType>();
if (mask & TAG_MASK) atomKK->k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) atomKK->k_type.sync<LMPHostType>();
if (mask & MASK_MASK) atomKK->k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) atomKK->k_image.sync<LMPHostType>();
if (mask & RADIUS_MASK) atomKK->k_radius.sync<LMPHostType>();
if (mask & RMASS_MASK) atomKK->k_rmass.sync<LMPHostType>();
if (mask & OMEGA_MASK) atomKK->k_omega.sync<LMPHostType>();
if (mask & TORQUE_MASK) atomKK->k_torque.sync<LMPHostType>();
if (mask & X_MASK) k_x.sync<LMPHostType>();
if (mask & V_MASK) k_v.sync<LMPHostType>();
if (mask & F_MASK) k_f.sync<LMPHostType>();
if (mask & TAG_MASK) k_tag.sync<LMPHostType>();
if (mask & TYPE_MASK) k_type.sync<LMPHostType>();
if (mask & MASK_MASK) k_mask.sync<LMPHostType>();
if (mask & IMAGE_MASK) k_image.sync<LMPHostType>();
if (mask & RADIUS_MASK) k_radius.sync<LMPHostType>();
if (mask & RMASS_MASK) k_rmass.sync<LMPHostType>();
if (mask & OMEGA_MASK) k_omega.sync<LMPHostType>();
if (mask & TORQUE_MASK) k_torque.sync<LMPHostType>();
}
}