From b8897765572e454ace662b80e1e87d115a244579 Mon Sep 17 00:00:00 2001 From: Stan Moore <stamoor@sandia.gov> Date: Mon, 26 Jun 2017 10:51:26 -0600 Subject: [PATCH] Fixing memory leak in Kokkos neighborlist --- src/KOKKOS/fix_qeq_reax_kokkos.cpp | 2 -- src/KOKKOS/neigh_list_kokkos.cpp | 19 ++++++------------- src/KOKKOS/neigh_list_kokkos.h | 7 +------ src/KOKKOS/npair_kokkos.h | 2 +- src/KOKKOS/pair_coul_dsf_kokkos.cpp | 3 --- src/KOKKOS/pair_coul_wolf_kokkos.cpp | 3 --- src/KOKKOS/pair_eam_alloy_kokkos.cpp | 3 --- src/KOKKOS/pair_eam_fs_kokkos.cpp | 3 --- src/KOKKOS/pair_eam_kokkos.cpp | 5 +---- src/KOKKOS/pair_kokkos.h | 4 ++-- src/KOKKOS/pair_reaxc_kokkos.cpp | 3 --- src/KOKKOS/pair_sw_kokkos.cpp | 1 - src/KOKKOS/pair_tersoff_kokkos.cpp | 1 - src/KOKKOS/pair_tersoff_mod_kokkos.cpp | 1 - src/KOKKOS/pair_tersoff_zbl_kokkos.cpp | 1 - src/neigh_list.cpp | 2 ++ src/neigh_list.h | 3 ++- 17 files changed, 15 insertions(+), 48 deletions(-) diff --git a/src/KOKKOS/fix_qeq_reax_kokkos.cpp b/src/KOKKOS/fix_qeq_reax_kokkos.cpp index 5cafbd2ef3..cef003222a 100644 --- a/src/KOKKOS/fix_qeq_reax_kokkos.cpp +++ b/src/KOKKOS/fix_qeq_reax_kokkos.cpp @@ -218,8 +218,6 @@ void FixQEqReaxKokkos<DeviceType>::pre_force(int vflag) d_ilist = k_list->d_ilist; inum = list->inum; - k_list->clean_copy(); - //cleanup_copy(); copymode = 1; int teamsize = TEAMSIZE; diff --git a/src/KOKKOS/neigh_list_kokkos.cpp b/src/KOKKOS/neigh_list_kokkos.cpp index b1b4e4467a..caf2dfee56 100644 --- a/src/KOKKOS/neigh_list_kokkos.cpp +++ b/src/KOKKOS/neigh_list_kokkos.cpp @@ -22,21 +22,14 @@ enum{NSQ,BIN,MULTI}; /* ---------------------------------------------------------------------- */ template<class Device> -void NeighListKokkos<Device>::clean_copy() +NeighListKokkos<Device>::NeighListKokkos(class LAMMPS *lmp):NeighList(lmp) { - ilist = NULL; - numneigh = NULL; - firstneigh = NULL; - firstdouble = NULL; - dnum = 0; - iskip = NULL; - ijskip = NULL; - - ipage = NULL; - dpage = NULL; - + _stride = 1; + maxneighs = 16; + kokkos = 1; maxatoms = 0; -} + execution_space = ExecutionSpaceFromDevice<Device>::space; +}; /* ---------------------------------------------------------------------- */ diff --git a/src/KOKKOS/neigh_list_kokkos.h b/src/KOKKOS/neigh_list_kokkos.h index 45e768927c..c887bd13b7 100644 --- a/src/KOKKOS/neigh_list_kokkos.h +++ b/src/KOKKOS/neigh_list_kokkos.h @@ -68,18 +68,13 @@ class NeighListKokkos: public NeighList { public: int maxneighs; - void clean_copy(); void grow(int nmax); typename ArrayTypes<Device>::t_neighbors_2d d_neighbors; typename DAT::tdual_int_1d k_ilist; // local indices of I atoms typename ArrayTypes<Device>::t_int_1d d_ilist; typename ArrayTypes<Device>::t_int_1d d_numneigh; // # of J neighs for each I - NeighListKokkos(class LAMMPS *lmp): - NeighList(lmp) {_stride = 1; maxneighs = 16; kokkos = 1; maxatoms = 0; - execution_space = ExecutionSpaceFromDevice<Device>::space; - }; - ~NeighListKokkos() {numneigh = NULL; ilist = NULL;}; + NeighListKokkos(class LAMMPS *lmp); KOKKOS_INLINE_FUNCTION AtomNeighbors get_neighbors(const int &i) const { diff --git a/src/KOKKOS/npair_kokkos.h b/src/KOKKOS/npair_kokkos.h index 8e81c57618..53183114d3 100644 --- a/src/KOKKOS/npair_kokkos.h +++ b/src/KOKKOS/npair_kokkos.h @@ -265,7 +265,7 @@ class NeighborKokkosExecute h_new_maxneighs() = neigh_list.maxneighs; }; - ~NeighborKokkosExecute() {neigh_list.clean_copy();}; + ~NeighborKokkosExecute() {neigh_list.copymode = 1;}; template<int HalfNeigh, int Newton, int Tri> KOKKOS_FUNCTION diff --git a/src/KOKKOS/pair_coul_dsf_kokkos.cpp b/src/KOKKOS/pair_coul_dsf_kokkos.cpp index f2063bdc08..e6f5407f2d 100644 --- a/src/KOKKOS/pair_coul_dsf_kokkos.cpp +++ b/src/KOKKOS/pair_coul_dsf_kokkos.cpp @@ -120,9 +120,6 @@ void PairCoulDSFKokkos<DeviceType>::compute(int eflag_in, int vflag_in) int inum = list->inum; - // Call cleanup_copy which sets allocations NULL which are destructed by the PairStyle - - k_list->clean_copy(); copymode = 1; // loop over neighbors of my atoms diff --git a/src/KOKKOS/pair_coul_wolf_kokkos.cpp b/src/KOKKOS/pair_coul_wolf_kokkos.cpp index 8049ba0031..75177e2d81 100644 --- a/src/KOKKOS/pair_coul_wolf_kokkos.cpp +++ b/src/KOKKOS/pair_coul_wolf_kokkos.cpp @@ -121,9 +121,6 @@ void PairCoulWolfKokkos<DeviceType>::compute(int eflag_in, int vflag_in) int inum = list->inum; - // Call cleanup_copy which sets allocations NULL which are destructed by the PairStyle - - k_list->clean_copy(); copymode = 1; // loop over neighbors of my atoms diff --git a/src/KOKKOS/pair_eam_alloy_kokkos.cpp b/src/KOKKOS/pair_eam_alloy_kokkos.cpp index 76c701213d..f8b7a69d60 100644 --- a/src/KOKKOS/pair_eam_alloy_kokkos.cpp +++ b/src/KOKKOS/pair_eam_alloy_kokkos.cpp @@ -122,9 +122,6 @@ void PairEAMAlloyKokkos<DeviceType>::compute(int eflag_in, int vflag_in) d_ilist = k_list->d_ilist; int inum = list->inum; - // Call cleanup_copy which sets allocations NULL which are destructed by the PairStyle - - k_list->clean_copy(); copymode = 1; // zero out density diff --git a/src/KOKKOS/pair_eam_fs_kokkos.cpp b/src/KOKKOS/pair_eam_fs_kokkos.cpp index 9b565f8ede..57820afb26 100644 --- a/src/KOKKOS/pair_eam_fs_kokkos.cpp +++ b/src/KOKKOS/pair_eam_fs_kokkos.cpp @@ -122,9 +122,6 @@ void PairEAMFSKokkos<DeviceType>::compute(int eflag_in, int vflag_in) d_ilist = k_list->d_ilist; int inum = list->inum; - // Call cleanup_copy which sets allocations NULL which are destructed by the PairStyle - - k_list->clean_copy(); copymode = 1; // zero out density diff --git a/src/KOKKOS/pair_eam_kokkos.cpp b/src/KOKKOS/pair_eam_kokkos.cpp index 7be8e54605..e848669947 100644 --- a/src/KOKKOS/pair_eam_kokkos.cpp +++ b/src/KOKKOS/pair_eam_kokkos.cpp @@ -117,9 +117,6 @@ void PairEAMKokkos<DeviceType>::compute(int eflag_in, int vflag_in) d_ilist = k_list->d_ilist; int inum = list->inum; - // Call cleanup_copy which sets allocations NULL which are destructed by the PairStyle - - k_list->clean_copy(); copymode = 1; // zero out density @@ -868,4 +865,4 @@ template class PairEAMKokkos<LMPDeviceType>; #ifdef KOKKOS_HAVE_CUDA template class PairEAMKokkos<LMPHostType>; #endif -} \ No newline at end of file +} diff --git a/src/KOKKOS/pair_kokkos.h b/src/KOKKOS/pair_kokkos.h index 1e01b3df15..b0614a934b 100644 --- a/src/KOKKOS/pair_kokkos.h +++ b/src/KOKKOS/pair_kokkos.h @@ -87,7 +87,7 @@ struct PairComputeFunctor { vatom(c.d_vatom),list(*list_ptr) {}; // Call cleanup_copy which sets allocations NULL which are destructed by the PairStyle - ~PairComputeFunctor() {c.cleanup_copy();list.clean_copy();}; + ~PairComputeFunctor() {c.cleanup_copy();list.copymode = 1;}; KOKKOS_INLINE_FUNCTION int sbmask(const int& j) const { return j >> SBBITS & 3; @@ -344,7 +344,7 @@ struct PairComputeFunctor<PairStyle,N2,STACKPARAMS,Specialisation> { PairComputeFunctor(PairStyle* c_ptr, NeighListKokkos<device_type>* list_ptr): c(*c_ptr),list(*list_ptr) {}; - ~PairComputeFunctor() {c.cleanup_copy();list.clean_copy();}; + ~PairComputeFunctor() {c.cleanup_copy();list.copymode = 1;}; KOKKOS_INLINE_FUNCTION int sbmask(const int& j) const { return j >> SBBITS & 3; diff --git a/src/KOKKOS/pair_reaxc_kokkos.cpp b/src/KOKKOS/pair_reaxc_kokkos.cpp index 6082c93287..6be09548da 100644 --- a/src/KOKKOS/pair_reaxc_kokkos.cpp +++ b/src/KOKKOS/pair_reaxc_kokkos.cpp @@ -709,8 +709,6 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in) d_neighbors = k_list->d_neighbors; d_ilist = k_list->d_ilist; - k_list->clean_copy(); - if (eflag_global) { for (int i = 0; i < 14; i++) pvector[i] = 0.0; @@ -3985,7 +3983,6 @@ void PairReaxCKokkos<DeviceType>::FindBond(int &numbonds) const int inum = list->inum; NeighListKokkos<DeviceType>* k_list = static_cast<NeighListKokkos<DeviceType>*>(list); d_ilist = k_list->d_ilist; - k_list->clean_copy(); numbonds = 0; PairReaxCKokkosFindBondFunctor<DeviceType> find_bond_functor(this); diff --git a/src/KOKKOS/pair_sw_kokkos.cpp b/src/KOKKOS/pair_sw_kokkos.cpp index a8950a0c79..e5c947cc8e 100644 --- a/src/KOKKOS/pair_sw_kokkos.cpp +++ b/src/KOKKOS/pair_sw_kokkos.cpp @@ -115,7 +115,6 @@ void PairSWKokkos<DeviceType>::compute(int eflag_in, int vflag_in) d_numneigh = k_list->d_numneigh; d_neighbors = k_list->d_neighbors; - k_list->clean_copy(); copymode = 1; EV_FLOAT ev; diff --git a/src/KOKKOS/pair_tersoff_kokkos.cpp b/src/KOKKOS/pair_tersoff_kokkos.cpp index 75280c8f7c..833c815ad9 100644 --- a/src/KOKKOS/pair_tersoff_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_kokkos.cpp @@ -200,7 +200,6 @@ void PairTersoffKokkos<DeviceType>::compute(int eflag_in, int vflag_in) d_neighbors = k_list->d_neighbors; d_ilist = k_list->d_ilist; - k_list->clean_copy(); copymode = 1; EV_FLOAT ev; diff --git a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp index d16a7fc4d7..d77ba2f141 100644 --- a/src/KOKKOS/pair_tersoff_mod_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_mod_kokkos.cpp @@ -200,7 +200,6 @@ void PairTersoffMODKokkos<DeviceType>::compute(int eflag_in, int vflag_in) d_neighbors = k_list->d_neighbors; d_ilist = k_list->d_ilist; - k_list->clean_copy(); copymode = 1; EV_FLOAT ev; diff --git a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp index e9bae49fb7..040d8c5230 100644 --- a/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp +++ b/src/KOKKOS/pair_tersoff_zbl_kokkos.cpp @@ -214,7 +214,6 @@ void PairTersoffZBLKokkos<DeviceType>::compute(int eflag_in, int vflag_in) d_neighbors = k_list->d_neighbors; d_ilist = k_list->d_ilist; - k_list->clean_copy(); copymode = 1; EV_FLOAT ev; diff --git a/src/neigh_list.cpp b/src/neigh_list.cpp index edc8634373..a5ca7a5366 100644 --- a/src/neigh_list.cpp +++ b/src/neigh_list.cpp @@ -48,6 +48,7 @@ NeighList::NeighList(LAMMPS *lmp) : Pointers(lmp) ghost = 0; ssa = 0; copy = 0; + copymode = 0; dnum = 0; // ptrs @@ -85,6 +86,7 @@ NeighList::NeighList(LAMMPS *lmp) : Pointers(lmp) NeighList::~NeighList() { + if (copymode) return; if (!copy) { memory->destroy(ilist); memory->destroy(numneigh); diff --git a/src/neigh_list.h b/src/neigh_list.h index 9a77a0311d..3fb3868114 100644 --- a/src/neigh_list.h +++ b/src/neigh_list.h @@ -34,7 +34,8 @@ class NeighList : protected Pointers { int occasional; // 0 if build every reneighbor, 1 if not int ghost; // 1 if list stores neighbors of ghosts int ssa; // 1 if list stores Shardlow data - int copy; // 1 if this list copied from another list + int copy; // 1 if this list is (host) copied from another list + int copymode; // 1 if this is a Kokkos on-device copy int dnum; // # of doubles per neighbor, 0 if none // data structs to store neighbor pairs I,J and associated values -- GitLab