Files
lammps/kokkos.patch
2025-06-27 14:51:39 -04:00

191 lines
8.8 KiB
Diff

diff --git a/src/KOKKOS/atom_vec_kokkos.cpp b/src/KOKKOS/atom_vec_kokkos.cpp
index d54cc2c3af..f81add90f1 100644
--- a/src/KOKKOS/atom_vec_kokkos.cpp
+++ b/src/KOKKOS/atom_vec_kokkos.cpp
@@ -824,10 +824,12 @@ void AtomVecKokkos::unpack_reverse_kokkos(const int &n,
// Choose correct reverse UnPackReverse kernel
if (lmp->kokkos->reverse_comm_on_host) {
+ atomKK->sync(Host,F_MASK);
struct AtomVecKokkos_UnPackReverse<LMPHostType> f(atomKK->k_f,buf,list);
Kokkos::parallel_for(n,f);
atomKK->modified(Host,F_MASK);
} else {
+ atomKK->sync(Device,F_MASK);
struct AtomVecKokkos_UnPackReverse<LMPDeviceType> f(atomKK->k_f,buf,list);
Kokkos::parallel_for(n,f);
atomKK->modified(Device,F_MASK);
diff --git a/src/KOKKOS/fix_property_atom_kokkos.cpp b/src/KOKKOS/fix_property_atom_kokkos.cpp
index 10cea48e90..a38af04f07 100644
--- a/src/KOKKOS/fix_property_atom_kokkos.cpp
+++ b/src/KOKKOS/fix_property_atom_kokkos.cpp
@@ -83,16 +83,19 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax)
for (int nv = 0; nv < nvalue; nv++) {
if (styles[nv] == MOLECULE) {
atomKK->sync(Device,MOLECULE_MASK);
- memoryKK->grow_kokkos(atomKK->k_molecule,atom->molecule,nmax,"atom:molecule");
atomKK->modified(Device,MOLECULE_MASK);
+ memoryKK->grow_kokkos(atomKK->k_molecule,atom->molecule,nmax,"atom:molecule");
+ atomKK->sync(Host,MOLECULE_MASK);
} else if (styles[nv] == CHARGE) {
atomKK->sync(Device,Q_MASK);
- memoryKK->grow_kokkos(atomKK->k_q,atom->q,nmax,"atom:q");
atomKK->modified(Device,Q_MASK);
+ memoryKK->grow_kokkos(atomKK->k_q,atom->q,nmax,"atom:q");
+ atomKK->sync(Host,Q_MASK);
} else if (styles[nv] == RMASS) {
atomKK->sync(Device,RMASS_MASK);
- memoryKK->grow_kokkos(atomKK->k_rmass,atom->rmass,nmax,"atom:rmass");
atomKK->modified(Device,RMASS_MASK);
+ memoryKK->grow_kokkos(atomKK->k_rmass,atom->rmass,nmax,"atom:rmass");
+ atomKK->sync(Host,RMASS_MASK);
} else if (styles[nv] == TEMPERATURE) {
memory->grow(atom->temperature, nmax, "atom:temperature");
size_t nbytes = (nmax - nmax_old) * sizeof(double);
@@ -107,9 +110,10 @@ void FixPropertyAtomKokkos::grow_arrays(int nmax)
memset(&atom->ivector[index[nv]][nmax_old],0,nbytes);
} else if (styles[nv] == DVEC) {
atomKK->sync(Device,DVECTOR_MASK);
+ atomKK->modified(Device,DVECTOR_MASK);
memoryKK->grow_kokkos(atomKK->k_dvector,atom->dvector,atomKK->k_dvector.extent(0),nmax,
"atom:dvector");
- atomKK->modified(Device,DVECTOR_MASK);
+ atomKK->sync(Host,DVECTOR_MASK);
} else if (styles[nv] == IARRAY) {
memory->grow(atom->iarray[index[nv]], nmax, cols[nv], "atom:iarray");
size_t nbytes = (size_t) (nmax - nmax_old) * cols[nv] * sizeof(int);
diff --git a/src/KOKKOS/fix_reaxff_species_kokkos.cpp b/src/KOKKOS/fix_reaxff_species_kokkos.cpp
index 757ba42c52..773c836243 100644
--- a/src/KOKKOS/fix_reaxff_species_kokkos.cpp
+++ b/src/KOKKOS/fix_reaxff_species_kokkos.cpp
@@ -38,13 +38,17 @@ using namespace FixConst;
FixReaxFFSpeciesKokkos::FixReaxFFSpeciesKokkos(LAMMPS *lmp, int narg, char **arg) :
FixReaxFFSpecies(lmp, narg, arg)
{
- kokkosable = 1;
+ // not all functions in FixReaxFFSpecies are ported to KOKKOS
+ // so set kokkosable flag to zero
+
+ kokkosable = 0;
+
atomKK = (AtomKokkos *) atom;
// NOTE: Could improve performance if a Kokkos version of ComputeSpecAtom is added
- datamask_read = X_MASK | V_MASK | Q_MASK | MASK_MASK;
- datamask_modify = EMPTY_MASK;
+ datamask_read = X_MASK | V_MASK | Q_MASK | MASK_MASK | DVECTOR_MASK | TYPE_MASK | RMASS_MASK | TAG_MASK;
+ datamask_modify = DVECTOR_MASK;
}
/* ---------------------------------------------------------------------- */
diff --git a/src/KOKKOS/fix_shake_kokkos.cpp b/src/KOKKOS/fix_shake_kokkos.cpp
index 05873120d7..505ab6b25b 100644
--- a/src/KOKKOS/fix_shake_kokkos.cpp
+++ b/src/KOKKOS/fix_shake_kokkos.cpp
@@ -1437,6 +1437,10 @@ void FixShakeKokkos<DeviceType>::stats()
template<class DeviceType>
void FixShakeKokkos<DeviceType>::grow_arrays(int nmax)
{
+ k_shake_flag.sync_device();
+ k_shake_atom.sync_device();
+ k_shake_type.sync_device();
+
memoryKK->grow_kokkos(k_shake_flag,shake_flag,nmax,"shake:shake_flag");
memoryKK->grow_kokkos(k_shake_atom,shake_atom,nmax,4,"shake:shake_atom");
memoryKK->grow_kokkos(k_shake_type,shake_type,nmax,3,"shake:shake_type");
diff --git a/src/KOKKOS/mliap_descriptor_so3_kokkos.cpp b/src/KOKKOS/mliap_descriptor_so3_kokkos.cpp
index 815d2696a9..55537f456b 100644
--- a/src/KOKKOS/mliap_descriptor_so3_kokkos.cpp
+++ b/src/KOKKOS/mliap_descriptor_so3_kokkos.cpp
@@ -24,6 +24,7 @@
#include "mliap_data_kokkos.h"
#include "mliap_so3_kokkos.h"
#include "pair_mliap.h"
+#include "atom_masks.h"
using namespace LAMMPS_NS;
@@ -70,7 +71,9 @@ void MLIAPDescriptorSO3Kokkos<DeviceType>::compute_forces(class MLIAPData *data_
so3ptr_kokkos->spectrum_dxdr(data->nlistatoms, data->k_numneighs, data->k_jelems, this->k_wjelem, data->k_rij, data->k_ij,
nmax, lmax, rcutfac, alpha, npairs, data->ndescriptors);
+ atomKK->sync(ExecutionSpaceFromDevice<DeviceType>::space,F_MASK);
auto d_f = atomKK->k_f.view<DeviceType>();
+
auto d_iatoms = data->k_iatoms.template view<DeviceType>();
auto d_jatoms = data->k_jatoms.template view<DeviceType>();
auto d_betas = data->k_betas.template view<DeviceType>();
@@ -78,8 +81,10 @@ void MLIAPDescriptorSO3Kokkos<DeviceType>::compute_forces(class MLIAPData *data_
auto d_ij = data->k_ij.template view<DeviceType>();
auto ndescriptors = data->ndescriptors;
auto d_dplist_r = so3ptr_kokkos->k_dplist_r;
- auto vflag=data->vflag;
- int vflag_either=data->k_pairmliap->vflag_either, vflag_global=data->pairmliap->vflag_global, vflag_atom=data->pairmliap->vflag_atom;
+ auto vflag = data->vflag;
+ int vflag_either = data->pairmliap->vflag_either;
+ int vflag_global = data->pairmliap->vflag_global;
+ int vflag_atom = data->pairmliap->vflag_atom;
auto d_vatom = data->k_pairmliap->k_vatom.template view<DeviceType>();
Kokkos::View<double[6], DeviceType> virial("virial");
data->k_pairmliap->k_vatom.template modify<LMPHostType>();
diff --git a/src/KOKKOS/mliap_unified_kokkos.cpp b/src/KOKKOS/mliap_unified_kokkos.cpp
index bf7d6b46d5..98da39c59d 100644
--- a/src/KOKKOS/mliap_unified_kokkos.cpp
+++ b/src/KOKKOS/mliap_unified_kokkos.cpp
@@ -296,7 +296,8 @@ void LAMMPS_NS::update_pair_forces(MLIAPDataKokkosDevice *data, double *fij)
auto j_atoms = data->jatoms;
auto vflag = data->vflag;
auto rij = data->rij;
- int vflag_global=data->pairmliap->vflag_global, vflag_atom=data->pairmliap->vflag_atom;
+ int vflag_global = data->pairmliap->vflag_global;
+ int vflag_atom = data->pairmliap->vflag_atom;
if (vflag_atom) {
data->pairmliap->k_vatom.template modify<LMPHostType>();
data->pairmliap->k_vatom.template sync<LMPDeviceType>();
@@ -355,8 +356,8 @@ void LAMMPS_NS::update_pair_forces(MLIAPDataKokkosDevice *data, double *fij)
if (vflag_global) {
Kokkos::View<double[6], LMPHostType> h_virial("h_virial");
Kokkos::deep_copy(h_virial,virial);
- for (int i=0;i<6;++i)
- data->pairmliap->virial[i]+=h_virial[i];
+ for (int i = 0; i < 6; ++i)
+ data->pairmliap->virial[i] += h_virial[i];
}
if (vflag_atom) {
data->pairmliap->k_vatom.template modify<LMPDeviceType>();
diff --git a/src/KOKKOS/pair_mliap_kokkos.cpp b/src/KOKKOS/pair_mliap_kokkos.cpp
index cbdf98ddaa..9a722bedbe 100644
--- a/src/KOKKOS/pair_mliap_kokkos.cpp
+++ b/src/KOKKOS/pair_mliap_kokkos.cpp
@@ -90,8 +90,9 @@ void PairMLIAPKokkos<DeviceType>::compute(int eflag, int vflag)
memoryKK->destroy_kokkos(k_eatom,eatom);
memoryKK->create_kokkos(k_eatom,eatom,maxeatom,"pair:eatom");
} else {
- Kokkos::deep_copy(k_eatom.d_view,0);
+ Kokkos::deep_copy(k_eatom.template view<DeviceType>(),0);
k_eatom.modify<DeviceType>();
+ k_eatom.sync_host();
}
}
@@ -100,8 +101,9 @@ void PairMLIAPKokkos<DeviceType>::compute(int eflag, int vflag)
memoryKK->destroy_kokkos(k_vatom,vatom);
memoryKK->create_kokkos(k_vatom,vatom,maxeatom,6,"pair:eatom");
} else {
- Kokkos::deep_copy(k_vatom.d_view,0);
+ Kokkos::deep_copy(k_vatom.template view<DeviceType>(),0);
k_vatom.modify<DeviceType>();
+ k_vatom.sync_host();
}
}
@@ -312,6 +314,7 @@ void PairMLIAPKokkos<DeviceType>::e_tally(MLIAPData* data)
auto d_iatoms = k_data->k_iatoms.template view<DeviceType>();
auto d_eatoms = k_data->k_eatoms.template view<DeviceType>();
auto d_eatom = k_eatom.template view<DeviceType>();
+ k_eatom.sync<DeviceType>();
Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType>(0,data->nlistatoms), KOKKOS_LAMBDA (int ii) {
d_eatom(d_iatoms(ii)) = d_eatoms(ii);
});