From a01bce46bb4b854fd17afbb2beb309750ddf864d Mon Sep 17 00:00:00 2001 From: Stan Moore Date: Tue, 9 Apr 2019 10:23:37 -0600 Subject: [PATCH] Reduce GPU/CPU data transfer --- src/KOKKOS/atom_vec_angle_kokkos.cpp | 99 +++++++++----- src/KOKKOS/atom_vec_atomic_kokkos.cpp | 60 ++++----- src/KOKKOS/atom_vec_bond_kokkos.cpp | 75 +++++++---- src/KOKKOS/atom_vec_charge_kokkos.cpp | 49 ++++--- src/KOKKOS/atom_vec_dpd_kokkos.cpp | 89 +++++++----- src/KOKKOS/atom_vec_full_kokkos.cpp | 164 ++++++++++++++--------- src/KOKKOS/atom_vec_molecular_kokkos.cpp | 159 +++++++++++++--------- src/KOKKOS/atom_vec_sphere_kokkos.cpp | 64 +++++---- 8 files changed, 467 insertions(+), 292 deletions(-) diff --git a/src/KOKKOS/atom_vec_angle_kokkos.cpp b/src/KOKKOS/atom_vec_angle_kokkos.cpp index 352fec57fb..06ef45272b 100644 --- a/src/KOKKOS/atom_vec_angle_kokkos.cpp +++ b/src/KOKKOS/atom_vec_angle_kokkos.cpp @@ -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(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & MOLECULE_MASK) atomKK->k_molecule.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & MOLECULE_MASK) k_molecule.sync(); if (mask & SPECIAL_MASK) { - atomKK->k_nspecial.sync(); - atomKK->k_special.sync(); + k_nspecial.sync(); + k_special.sync(); } if (mask & BOND_MASK) { - atomKK->k_num_bond.sync(); - atomKK->k_bond_type.sync(); - atomKK->k_bond_atom.sync(); + k_num_bond.sync(); + k_bond_type.sync(); + k_bond_atom.sync(); } if (mask & ANGLE_MASK) { - atomKK->k_num_angle.sync(); - atomKK->k_angle_type.sync(); - atomKK->k_angle_atom1.sync(); - atomKK->k_angle_atom2.sync(); - atomKK->k_angle_atom3.sync(); + k_num_angle.sync(); + k_angle_type.sync(); + k_angle_atom1.sync(); + k_angle_atom2.sync(); + k_angle_atom3.sync(); } } else { - if (mask & X_MASK) atomKK->k_x.sync(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & MOLECULE_MASK) atomKK->k_molecule.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & MOLECULE_MASK) k_molecule.sync(); if (mask & SPECIAL_MASK) { - atomKK->k_nspecial.sync(); - atomKK->k_special.sync(); + k_nspecial.sync(); + k_special.sync(); } if (mask & BOND_MASK) { - atomKK->k_num_bond.sync(); - atomKK->k_bond_type.sync(); - atomKK->k_bond_atom.sync(); + k_num_bond.sync(); + k_bond_type.sync(); + k_bond_atom.sync(); } if (mask & ANGLE_MASK) { - atomKK->k_num_angle.sync(); - atomKK->k_angle_type.sync(); - atomKK->k_angle_atom1.sync(); - atomKK->k_angle_atom2.sync(); - atomKK->k_angle_atom3.sync(); + k_num_angle.sync(); + k_angle_type.sync(); + k_angle_atom1.sync(); + k_angle_atom2.sync(); + k_angle_atom3.sync(); } } } diff --git a/src/KOKKOS/atom_vec_atomic_kokkos.cpp b/src/KOKKOS/atom_vec_atomic_kokkos.cpp index 80321fd2ea..ae357e6fe4 100644 --- a/src/KOKKOS/atom_vec_atomic_kokkos.cpp +++ b/src/KOKKOS/atom_vec_atomic_kokkos.cpp @@ -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(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) { - if (!force || force->newton) { - atomKK->k_f.sync(); - } else { - auto k_f_nlocal = Kokkos::subview(atomKK->k_f,std::make_pair(0,atom->nlocal),Kokkos::ALL); - k_f_nlocal.sync(); - } - } - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); } else { - if (mask & X_MASK) atomKK->k_x.sync(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) { - if (!force || force->newton) { - atomKK->k_f.sync(); - } else { - auto k_f_nlocal = Kokkos::subview(atomKK->k_f,std::make_pair(0,atom->nlocal),Kokkos::ALL); - k_f_nlocal.sync(); - } - } - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); } } diff --git a/src/KOKKOS/atom_vec_bond_kokkos.cpp b/src/KOKKOS/atom_vec_bond_kokkos.cpp index c884d23880..6acd536dd8 100644 --- a/src/KOKKOS/atom_vec_bond_kokkos.cpp +++ b/src/KOKKOS/atom_vec_bond_kokkos.cpp @@ -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(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & MOLECULE_MASK) atomKK->k_molecule.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & MOLECULE_MASK) k_molecule.sync(); if (mask & SPECIAL_MASK) { - atomKK->k_nspecial.sync(); - atomKK->k_special.sync(); + k_nspecial.sync(); + k_special.sync(); } if (mask & BOND_MASK) { - atomKK->k_num_bond.sync(); - atomKK->k_bond_type.sync(); - atomKK->k_bond_atom.sync(); + k_num_bond.sync(); + k_bond_type.sync(); + k_bond_atom.sync(); } } else { - if (mask & X_MASK) atomKK->k_x.sync(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & MOLECULE_MASK) atomKK->k_molecule.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & MOLECULE_MASK) k_molecule.sync(); if (mask & SPECIAL_MASK) { - atomKK->k_nspecial.sync(); - atomKK->k_special.sync(); + k_nspecial.sync(); + k_special.sync(); } if (mask & BOND_MASK) { - atomKK->k_num_bond.sync(); - atomKK->k_bond_type.sync(); - atomKK->k_bond_atom.sync(); + k_num_bond.sync(); + k_bond_type.sync(); + k_bond_atom.sync(); } } } diff --git a/src/KOKKOS/atom_vec_charge_kokkos.cpp b/src/KOKKOS/atom_vec_charge_kokkos.cpp index 11e46d1274..807f733745 100644 --- a/src/KOKKOS/atom_vec_charge_kokkos.cpp +++ b/src/KOKKOS/atom_vec_charge_kokkos.cpp @@ -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(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & Q_MASK) atomKK->k_q.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & Q_MASK) k_q.sync(); } else { - if (mask & X_MASK) atomKK->k_x.sync(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & Q_MASK) atomKK->k_q.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & Q_MASK) k_q.sync(); } } diff --git a/src/KOKKOS/atom_vec_dpd_kokkos.cpp b/src/KOKKOS/atom_vec_dpd_kokkos.cpp index 30db76e723..64105eaff5 100644 --- a/src/KOKKOS/atom_vec_dpd_kokkos.cpp +++ b/src/KOKKOS/atom_vec_dpd_kokkos.cpp @@ -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(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & DPDRHO_MASK) atomKK->k_rho.sync(); - if (mask & DPDTHETA_MASK) atomKK->k_dpdTheta.sync(); - if (mask & UCOND_MASK) atomKK->k_uCond.sync(); - if (mask & UMECH_MASK) atomKK->k_uMech.sync(); - if (mask & UCHEM_MASK) atomKK->k_uChem.sync(); - if (mask & UCG_MASK) atomKK->k_uCG.sync(); - if (mask & UCGNEW_MASK) atomKK->k_uCGnew.sync(); - if (mask & DUCHEM_MASK) atomKK->k_duChem.sync(); - if (mask & DVECTOR_MASK) atomKK->k_dvector.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & DPDRHO_MASK) k_rho.sync(); + if (mask & DPDTHETA_MASK) k_dpdTheta.sync(); + if (mask & UCOND_MASK) k_uCond.sync(); + if (mask & UMECH_MASK) k_uMech.sync(); + if (mask & UCHEM_MASK) k_uChem.sync(); + if (mask & UCG_MASK) k_uCG.sync(); + if (mask & UCGNEW_MASK) k_uCGnew.sync(); + if (mask & DUCHEM_MASK) k_duChem.sync(); + if (mask & DVECTOR_MASK) k_dvector.sync(); } else { - if (mask & X_MASK) atomKK->k_x.sync(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & DPDRHO_MASK) atomKK->k_rho.sync(); - if (mask & DPDTHETA_MASK) atomKK->k_dpdTheta.sync(); - if (mask & UCOND_MASK) atomKK->k_uCond.sync(); - if (mask & UMECH_MASK) atomKK->k_uMech.sync(); - if (mask & UCHEM_MASK) atomKK->k_uChem.sync(); - if (mask & UCG_MASK) atomKK->k_uCG.sync(); - if (mask & UCGNEW_MASK) atomKK->k_uCGnew.sync(); - if (mask & DUCHEM_MASK) atomKK->k_duChem.sync(); - if (mask & DVECTOR_MASK) atomKK->k_dvector.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & DPDRHO_MASK) k_rho.sync(); + if (mask & DPDTHETA_MASK) k_dpdTheta.sync(); + if (mask & UCOND_MASK) k_uCond.sync(); + if (mask & UMECH_MASK) k_uMech.sync(); + if (mask & UCHEM_MASK) k_uChem.sync(); + if (mask & UCG_MASK) k_uCG.sync(); + if (mask & UCGNEW_MASK) k_uCGnew.sync(); + if (mask & DUCHEM_MASK) k_duChem.sync(); + if (mask & DVECTOR_MASK) k_dvector.sync(); } } diff --git a/src/KOKKOS/atom_vec_full_kokkos.cpp b/src/KOKKOS/atom_vec_full_kokkos.cpp index a6ae1e0ccc..f02a92d2f3 100644 --- a/src/KOKKOS/atom_vec_full_kokkos.cpp +++ b/src/KOKKOS/atom_vec_full_kokkos.cpp @@ -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(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & Q_MASK) atomKK->k_q.sync(); - if (mask & MOLECULE_MASK) atomKK->k_molecule.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & Q_MASK) k_q.sync(); + if (mask & MOLECULE_MASK) k_molecule.sync(); if (mask & SPECIAL_MASK) { - atomKK->k_nspecial.sync(); - atomKK->k_special.sync(); + k_nspecial.sync(); + k_special.sync(); } if (mask & BOND_MASK) { - atomKK->k_num_bond.sync(); - atomKK->k_bond_type.sync(); - atomKK->k_bond_atom.sync(); + k_num_bond.sync(); + k_bond_type.sync(); + k_bond_atom.sync(); } if (mask & ANGLE_MASK) { - atomKK->k_num_angle.sync(); - atomKK->k_angle_type.sync(); - atomKK->k_angle_atom1.sync(); - atomKK->k_angle_atom2.sync(); - atomKK->k_angle_atom3.sync(); + k_num_angle.sync(); + k_angle_type.sync(); + k_angle_atom1.sync(); + k_angle_atom2.sync(); + k_angle_atom3.sync(); } if (mask & DIHEDRAL_MASK) { - atomKK->k_num_dihedral.sync(); - atomKK->k_dihedral_type.sync(); - atomKK->k_dihedral_atom1.sync(); - atomKK->k_dihedral_atom2.sync(); - atomKK->k_dihedral_atom3.sync(); - atomKK->k_dihedral_atom4.sync(); + k_num_dihedral.sync(); + k_dihedral_type.sync(); + k_dihedral_atom1.sync(); + k_dihedral_atom2.sync(); + k_dihedral_atom3.sync(); + k_dihedral_atom4.sync(); } if (mask & IMPROPER_MASK) { - atomKK->k_num_improper.sync(); - atomKK->k_improper_type.sync(); - atomKK->k_improper_atom1.sync(); - atomKK->k_improper_atom2.sync(); - atomKK->k_improper_atom3.sync(); - atomKK->k_improper_atom4.sync(); + k_num_improper.sync(); + k_improper_type.sync(); + k_improper_atom1.sync(); + k_improper_atom2.sync(); + k_improper_atom3.sync(); + k_improper_atom4.sync(); } } else { - if (mask & X_MASK) atomKK->k_x.sync(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & Q_MASK) atomKK->k_q.sync(); - if (mask & MOLECULE_MASK) atomKK->k_molecule.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & Q_MASK) k_q.sync(); + if (mask & MOLECULE_MASK) k_molecule.sync(); if (mask & SPECIAL_MASK) { - atomKK->k_nspecial.sync(); - atomKK->k_special.sync(); + k_nspecial.sync(); + k_special.sync(); } if (mask & BOND_MASK) { - atomKK->k_num_bond.sync(); - atomKK->k_bond_type.sync(); - atomKK->k_bond_atom.sync(); + k_num_bond.sync(); + k_bond_type.sync(); + k_bond_atom.sync(); } if (mask & ANGLE_MASK) { - atomKK->k_num_angle.sync(); - atomKK->k_angle_type.sync(); - atomKK->k_angle_atom1.sync(); - atomKK->k_angle_atom2.sync(); - atomKK->k_angle_atom3.sync(); + k_num_angle.sync(); + k_angle_type.sync(); + k_angle_atom1.sync(); + k_angle_atom2.sync(); + k_angle_atom3.sync(); } if (mask & DIHEDRAL_MASK) { - atomKK->k_num_dihedral.sync(); - atomKK->k_dihedral_type.sync(); - atomKK->k_dihedral_atom1.sync(); - atomKK->k_dihedral_atom2.sync(); - atomKK->k_dihedral_atom3.sync(); - atomKK->k_dihedral_atom4.sync(); + k_num_dihedral.sync(); + k_dihedral_type.sync(); + k_dihedral_atom1.sync(); + k_dihedral_atom2.sync(); + k_dihedral_atom3.sync(); + k_dihedral_atom4.sync(); } if (mask & IMPROPER_MASK) { - atomKK->k_num_improper.sync(); - atomKK->k_improper_type.sync(); - atomKK->k_improper_atom1.sync(); - atomKK->k_improper_atom2.sync(); - atomKK->k_improper_atom3.sync(); - atomKK->k_improper_atom4.sync(); + k_num_improper.sync(); + k_improper_type.sync(); + k_improper_atom1.sync(); + k_improper_atom2.sync(); + k_improper_atom3.sync(); + k_improper_atom4.sync(); } } } diff --git a/src/KOKKOS/atom_vec_molecular_kokkos.cpp b/src/KOKKOS/atom_vec_molecular_kokkos.cpp index 9537320976..25ef6f0c7e 100644 --- a/src/KOKKOS/atom_vec_molecular_kokkos.cpp +++ b/src/KOKKOS/atom_vec_molecular_kokkos.cpp @@ -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(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & MOLECULE_MASK) atomKK->k_molecule.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & MOLECULE_MASK) k_molecule.sync(); if (mask & SPECIAL_MASK) { - atomKK->k_nspecial.sync(); - atomKK->k_special.sync(); + k_nspecial.sync(); + k_special.sync(); } if (mask & BOND_MASK) { - atomKK->k_num_bond.sync(); - atomKK->k_bond_type.sync(); - atomKK->k_bond_atom.sync(); + k_num_bond.sync(); + k_bond_type.sync(); + k_bond_atom.sync(); } if (mask & ANGLE_MASK) { - atomKK->k_num_angle.sync(); - atomKK->k_angle_type.sync(); - atomKK->k_angle_atom1.sync(); - atomKK->k_angle_atom2.sync(); - atomKK->k_angle_atom3.sync(); + k_num_angle.sync(); + k_angle_type.sync(); + k_angle_atom1.sync(); + k_angle_atom2.sync(); + k_angle_atom3.sync(); } if (mask & DIHEDRAL_MASK) { - atomKK->k_num_dihedral.sync(); - atomKK->k_dihedral_type.sync(); - atomKK->k_dihedral_atom1.sync(); - atomKK->k_dihedral_atom2.sync(); - atomKK->k_dihedral_atom3.sync(); - atomKK->k_dihedral_atom4.sync(); + k_num_dihedral.sync(); + k_dihedral_type.sync(); + k_dihedral_atom1.sync(); + k_dihedral_atom2.sync(); + k_dihedral_atom3.sync(); + k_dihedral_atom4.sync(); } if (mask & IMPROPER_MASK) { - atomKK->k_num_improper.sync(); - atomKK->k_improper_type.sync(); - atomKK->k_improper_atom1.sync(); - atomKK->k_improper_atom2.sync(); - atomKK->k_improper_atom3.sync(); - atomKK->k_improper_atom4.sync(); + k_num_improper.sync(); + k_improper_type.sync(); + k_improper_atom1.sync(); + k_improper_atom2.sync(); + k_improper_atom3.sync(); + k_improper_atom4.sync(); } } else { - if (mask & X_MASK) atomKK->k_x.sync(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & MOLECULE_MASK) atomKK->k_molecule.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & MOLECULE_MASK) k_molecule.sync(); if (mask & SPECIAL_MASK) { - atomKK->k_nspecial.sync(); - atomKK->k_special.sync(); + k_nspecial.sync(); + k_special.sync(); } if (mask & BOND_MASK) { - atomKK->k_num_bond.sync(); - atomKK->k_bond_type.sync(); - atomKK->k_bond_atom.sync(); + k_num_bond.sync(); + k_bond_type.sync(); + k_bond_atom.sync(); } if (mask & ANGLE_MASK) { - atomKK->k_num_angle.sync(); - atomKK->k_angle_type.sync(); - atomKK->k_angle_atom1.sync(); - atomKK->k_angle_atom2.sync(); - atomKK->k_angle_atom3.sync(); + k_num_angle.sync(); + k_angle_type.sync(); + k_angle_atom1.sync(); + k_angle_atom2.sync(); + k_angle_atom3.sync(); } if (mask & DIHEDRAL_MASK) { - atomKK->k_num_dihedral.sync(); - atomKK->k_dihedral_type.sync(); - atomKK->k_dihedral_atom1.sync(); - atomKK->k_dihedral_atom2.sync(); - atomKK->k_dihedral_atom3.sync(); - atomKK->k_dihedral_atom4.sync(); + k_num_dihedral.sync(); + k_dihedral_type.sync(); + k_dihedral_atom1.sync(); + k_dihedral_atom2.sync(); + k_dihedral_atom3.sync(); + k_dihedral_atom4.sync(); } if (mask & IMPROPER_MASK) { - atomKK->k_num_improper.sync(); - atomKK->k_improper_type.sync(); - atomKK->k_improper_atom1.sync(); - atomKK->k_improper_atom2.sync(); - atomKK->k_improper_atom3.sync(); - atomKK->k_improper_atom4.sync(); + k_num_improper.sync(); + k_improper_type.sync(); + k_improper_atom1.sync(); + k_improper_atom2.sync(); + k_improper_atom3.sync(); + k_improper_atom4.sync(); } } } diff --git a/src/KOKKOS/atom_vec_sphere_kokkos.cpp b/src/KOKKOS/atom_vec_sphere_kokkos.cpp index f05e8d09df..df86cacccc 100644 --- a/src/KOKKOS/atom_vec_sphere_kokkos.cpp +++ b/src/KOKKOS/atom_vec_sphere_kokkos.cpp @@ -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(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & RADIUS_MASK) atomKK->k_radius.sync(); - if (mask & RMASS_MASK) atomKK->k_rmass.sync(); - if (mask & OMEGA_MASK) atomKK->k_omega.sync(); - if (mask & TORQUE_MASK) atomKK->k_torque.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & RADIUS_MASK) k_radius.sync(); + if (mask & RMASS_MASK) k_rmass.sync(); + if (mask & OMEGA_MASK) k_omega.sync(); + if (mask & TORQUE_MASK) k_torque.sync(); } else { - if (mask & X_MASK) atomKK->k_x.sync(); - if (mask & V_MASK) atomKK->k_v.sync(); - if (mask & F_MASK) atomKK->k_f.sync(); - if (mask & TAG_MASK) atomKK->k_tag.sync(); - if (mask & TYPE_MASK) atomKK->k_type.sync(); - if (mask & MASK_MASK) atomKK->k_mask.sync(); - if (mask & IMAGE_MASK) atomKK->k_image.sync(); - if (mask & RADIUS_MASK) atomKK->k_radius.sync(); - if (mask & RMASS_MASK) atomKK->k_rmass.sync(); - if (mask & OMEGA_MASK) atomKK->k_omega.sync(); - if (mask & TORQUE_MASK) atomKK->k_torque.sync(); + if (mask & X_MASK) k_x.sync(); + if (mask & V_MASK) k_v.sync(); + if (mask & F_MASK) k_f.sync(); + if (mask & TAG_MASK) k_tag.sync(); + if (mask & TYPE_MASK) k_type.sync(); + if (mask & MASK_MASK) k_mask.sync(); + if (mask & IMAGE_MASK) k_image.sync(); + if (mask & RADIUS_MASK) k_radius.sync(); + if (mask & RMASS_MASK) k_rmass.sync(); + if (mask & OMEGA_MASK) k_omega.sync(); + if (mask & TORQUE_MASK) k_torque.sync(); } }