More changes for Kokkos neighbor

This commit is contained in:
Stan Moore
2016-12-09 15:56:55 -07:00
parent 435421301b
commit 43c459ba56
7 changed files with 146 additions and 27 deletions

View File

@ -109,6 +109,8 @@ action neigh_list_kokkos.cpp
action neigh_list_kokkos.h action neigh_list_kokkos.h
action neighbor_kokkos.cpp action neighbor_kokkos.cpp
action neighbor_kokkos.h action neighbor_kokkos.h
action npair_copy_kokkos.cpp
action npair_copy_kokkos.h
action npair_kokkos.cpp action npair_kokkos.cpp
action npair_kokkos.h action npair_kokkos.h
action nbin_kokkos.cpp action nbin_kokkos.cpp

View File

@ -116,6 +116,7 @@ void NBinKokkos<DeviceType>::bin_atoms()
k_bins = DAT::tdual_int_2d("bins", mbins, atoms_per_bin); k_bins = DAT::tdual_int_2d("bins", mbins, atoms_per_bin);
bins = k_bins.view<DeviceType>(); bins = k_bins.view<DeviceType>();
c_bins = bins; c_bins = bins;
last_bin_memory = update->ntimestep;
} }
} }
} }

View File

@ -0,0 +1,62 @@
/* ----------------------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#include "npair_copy_kokkos.h"
#include "neighbor.h"
#include "neigh_list_kokkos.h"
#include "atom.h"
#include "atom_vec.h"
#include "molecule.h"
#include "domain.h"
#include "my_page.h"
#include "error.h"
using namespace LAMMPS_NS;
/* ---------------------------------------------------------------------- */
template<class DeviceType>
NPairCopyKokkos<DeviceType>::NPairCopyKokkos(LAMMPS *lmp) : NPair(lmp) {}
/* ----------------------------------------------------------------------
create list which is simply a copy of parent list
------------------------------------------------------------------------- */
template<class DeviceType>
void NPairCopyKokkos<DeviceType>::build(NeighList *list)
{
NeighList *listcopy = list->listcopy;
list->inum = listcopy->inum;
list->gnum = listcopy->gnum;
list->ilist = listcopy->ilist;
list->numneigh = listcopy->numneigh;
list->firstneigh = listcopy->firstneigh;
list->firstdouble = listcopy->firstdouble;
list->ipage = listcopy->ipage;
list->dpage = listcopy->dpage;
NeighListKokkos<DeviceType>* list_kk = (NeighListKokkos<DeviceType>*) list;
NeighListKokkos<DeviceType>* listcopy_kk = (NeighListKokkos<DeviceType>*) list->listcopy;
list_kk->d_ilist = listcopy_kk->d_ilist;
list_kk->d_numneigh = listcopy_kk->d_numneigh;
list_kk->d_neighbors = listcopy_kk->d_neighbors;
}
namespace LAMMPS_NS {
template class NPairCopyKokkos<LMPDeviceType>;
#ifdef KOKKOS_HAVE_CUDA
template class NPairCopyKokkos<LMPHostType>;
#endif
}

View File

@ -0,0 +1,48 @@
/* -*- c++ -*- ----------------------------------------------------------
LAMMPS - Large-scale Atomic/Molecular Massively Parallel Simulator
http://lammps.sandia.gov, Sandia National Laboratories
Steve Plimpton, sjplimp@sandia.gov
Copyright (2003) Sandia Corporation. Under the terms of Contract
DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains
certain rights in this software. This software is distributed under
the GNU General Public License.
See the README file in the top-level LAMMPS directory.
------------------------------------------------------------------------- */
#ifdef NPAIR_CLASS
NPairStyle(copy/kk/device,
NPairCopyKokkos<LMPDeviceType>,
NP_COPY | NP_KOKKOS_DEVICE)
NPairStyle(copy/kk/host,
NPairCopyKokkos<LMPHostType>,
NP_COPY | NP_KOKKOS_HOST)
#else
#ifndef LMP_NPAIR_COPY_KOKKOS_H
#define LMP_NPAIR_COPY_KOKKOS_H
#include "npair.h"
namespace LAMMPS_NS {
template<class DeviceType>
class NPairCopyKokkos : public NPair {
public:
NPairCopyKokkos(class LAMMPS *);
~NPairCopyKokkos() {}
void build(class NeighList *);
};
}
#endif
#endif
/* ERROR/WARNING messages:
*/

View File

@ -51,9 +51,9 @@ void NPairKokkos<DeviceType,HALF_NEIGH,GHOST>::copy_neighbor_info()
k_ex2_type = neighborKK->k_ex2_type; k_ex2_type = neighborKK->k_ex2_type;
k_ex_type = neighborKK->k_ex_type; k_ex_type = neighborKK->k_ex_type;
k_ex1_group = neighborKK->k_ex1_group; k_ex1_group = neighborKK->k_ex1_group;
k_ex2_group = neighborKK->k_ex1_group; k_ex2_group = neighborKK->k_ex2_group;
k_ex1_bit = neighborKK->k_ex1_group; k_ex1_bit = neighborKK->k_ex1_bit;
k_ex2_bit = neighborKK->k_ex1_group; k_ex2_bit = neighborKK->k_ex2_bit;
k_ex_mol_group = neighborKK->k_ex_mol_group; k_ex_mol_group = neighborKK->k_ex_mol_group;
k_ex_mol_bit = neighborKK->k_ex_mol_bit; k_ex_mol_bit = neighborKK->k_ex_mol_bit;
} }
@ -135,16 +135,16 @@ void NPairKokkos<DeviceType,HALF_NEIGH,GHOST>::build(NeighList *list_)
atomKK->molecular, atomKK->molecular,
nbinx,nbiny,nbinz,mbinx,mbiny,mbinz,mbinxlo,mbinylo,mbinzlo, nbinx,nbiny,nbinz,mbinx,mbiny,mbinz,mbinxlo,mbinylo,mbinzlo,
bininvx,bininvy,bininvz, bininvx,bininvy,bininvz,
exclude, nex_type,maxex_type, exclude, nex_type,
k_ex1_type.view<DeviceType>(), k_ex1_type.view<DeviceType>(),
k_ex2_type.view<DeviceType>(), k_ex2_type.view<DeviceType>(),
k_ex_type.view<DeviceType>(), k_ex_type.view<DeviceType>(),
nex_group,maxex_group, nex_group,
k_ex1_group.view<DeviceType>(), k_ex1_group.view<DeviceType>(),
k_ex2_group.view<DeviceType>(), k_ex2_group.view<DeviceType>(),
k_ex1_bit.view<DeviceType>(), k_ex1_bit.view<DeviceType>(),
k_ex2_bit.view<DeviceType>(), k_ex2_bit.view<DeviceType>(),
nex_mol, maxex_mol, nex_mol,
k_ex_mol_group.view<DeviceType>(), k_ex_mol_group.view<DeviceType>(),
k_ex_mol_bit.view<DeviceType>(), k_ex_mol_bit.view<DeviceType>(),
bboxhi,bboxlo, bboxhi,bboxlo,
@ -161,6 +161,8 @@ void NPairKokkos<DeviceType,HALF_NEIGH,GHOST>::build(NeighList *list_)
k_ex2_bit.sync<DeviceType>(); k_ex2_bit.sync<DeviceType>();
k_ex_mol_group.sync<DeviceType>(); k_ex_mol_group.sync<DeviceType>();
k_ex_mol_bit.sync<DeviceType>(); k_ex_mol_bit.sync<DeviceType>();
k_bincount.sync<DeviceType>(),
k_bins.sync<DeviceType>(),
atomKK->sync(Device,X_MASK|TYPE_MASK|MASK_MASK|MOLECULE_MASK|TAG_MASK|SPECIAL_MASK); atomKK->sync(Device,X_MASK|TYPE_MASK|MASK_MASK|MOLECULE_MASK|TAG_MASK|SPECIAL_MASK);
data.special_flag[0] = special_flag[0]; data.special_flag[0] = special_flag[0];
@ -415,6 +417,7 @@ void NeighborKokkosExecute<DeviceType>::
if(n >= new_maxneighs()) new_maxneighs() = n; if(n >= new_maxneighs()) new_maxneighs() = n;
} }
neigh_list.d_ilist(i) = i; neigh_list.d_ilist(i) = i;
} }

View File

@ -75,14 +75,6 @@ class NPairKokkos : public NPair {
private: private:
int newton_pair; int newton_pair;
int nex_type;
int maxex_type;
int nex_group;
int maxex_group;
int nex_mol;
int maxex_mol;
// data from Neighbor class // data from Neighbor class
@ -127,17 +119,14 @@ class NeighborKokkosExecute
const int exclude; const int exclude;
const int nex_type; const int nex_type;
const int maxex_type;
const typename AT::t_int_1d_const ex1_type,ex2_type; const typename AT::t_int_1d_const ex1_type,ex2_type;
const typename AT::t_int_2d_const ex_type; const typename AT::t_int_2d_const ex_type;
const int nex_group; const int nex_group;
const int maxex_group;
const typename AT::t_int_1d_const ex1_group,ex2_group; const typename AT::t_int_1d_const ex1_group,ex2_group;
const typename AT::t_int_1d_const ex1_bit,ex2_bit; const typename AT::t_int_1d_const ex1_bit,ex2_bit;
const int nex_mol; const int nex_mol;
const int maxex_mol;
const typename AT::t_int_1d_const ex_mol_group; const typename AT::t_int_1d_const ex_mol_group;
const typename AT::t_int_1d_const ex_mol_bit; const typename AT::t_int_1d_const ex_mol_bit;
@ -204,16 +193,16 @@ class NeighborKokkosExecute
const int & _mbinx,const int & _mbiny,const int & _mbinz, const int & _mbinx,const int & _mbiny,const int & _mbinz,
const int & _mbinxlo,const int & _mbinylo,const int & _mbinzlo, const int & _mbinxlo,const int & _mbinylo,const int & _mbinzlo,
const X_FLOAT &_bininvx,const X_FLOAT &_bininvy,const X_FLOAT &_bininvz, const X_FLOAT &_bininvx,const X_FLOAT &_bininvy,const X_FLOAT &_bininvz,
const int & _exclude,const int & _nex_type,const int & _maxex_type, const int & _exclude,const int & _nex_type,
const typename AT::t_int_1d_const & _ex1_type, const typename AT::t_int_1d_const & _ex1_type,
const typename AT::t_int_1d_const & _ex2_type, const typename AT::t_int_1d_const & _ex2_type,
const typename AT::t_int_2d_const & _ex_type, const typename AT::t_int_2d_const & _ex_type,
const int & _nex_group,const int & _maxex_group, const int & _nex_group,
const typename AT::t_int_1d_const & _ex1_group, const typename AT::t_int_1d_const & _ex1_group,
const typename AT::t_int_1d_const & _ex2_group, const typename AT::t_int_1d_const & _ex2_group,
const typename AT::t_int_1d_const & _ex1_bit, const typename AT::t_int_1d_const & _ex1_bit,
const typename AT::t_int_1d_const & _ex2_bit, const typename AT::t_int_1d_const & _ex2_bit,
const int & _nex_mol,const int & _maxex_mol, const int & _nex_mol,
const typename AT::t_int_1d_const & _ex_mol_group, const typename AT::t_int_1d_const & _ex_mol_group,
const typename AT::t_int_1d_const & _ex_mol_bit, const typename AT::t_int_1d_const & _ex_mol_bit,
const X_FLOAT *_bboxhi, const X_FLOAT* _bboxlo, const X_FLOAT *_bboxhi, const X_FLOAT* _bboxlo,
@ -229,11 +218,11 @@ class NeighborKokkosExecute
mbinx(_mbinx),mbiny(_mbiny),mbinz(_mbinz), mbinx(_mbinx),mbiny(_mbiny),mbinz(_mbinz),
mbinxlo(_mbinxlo),mbinylo(_mbinylo),mbinzlo(_mbinzlo), mbinxlo(_mbinxlo),mbinylo(_mbinylo),mbinzlo(_mbinzlo),
bininvx(_bininvx),bininvy(_bininvy),bininvz(_bininvz), bininvx(_bininvx),bininvy(_bininvy),bininvz(_bininvz),
exclude(_exclude),nex_type(_nex_type),maxex_type(_maxex_type), exclude(_exclude),nex_type(_nex_type),
ex1_type(_ex1_type),ex2_type(_ex2_type),ex_type(_ex_type), ex1_type(_ex1_type),ex2_type(_ex2_type),ex_type(_ex_type),
nex_group(_nex_group),maxex_group(_maxex_group), nex_group(_nex_group),
ex1_group(_ex1_group),ex2_group(_ex2_group), ex1_group(_ex1_group),ex2_group(_ex2_group),
ex1_bit(_ex1_bit),ex2_bit(_ex2_bit),nex_mol(_nex_mol),maxex_mol(_maxex_mol), ex1_bit(_ex1_bit),ex2_bit(_ex2_bit),nex_mol(_nex_mol),
ex_mol_group(_ex_mol_group),ex_mol_bit(_ex_mol_bit), ex_mol_group(_ex_mol_group),ex_mol_bit(_ex_mol_bit),
xperiodic(_xperiodic),yperiodic(_yperiodic),zperiodic(_zperiodic), xperiodic(_xperiodic),yperiodic(_yperiodic),zperiodic(_zperiodic),
xprd_half(_xprd_half),yprd_half(_yprd_half),zprd_half(_zprd_half) { xprd_half(_xprd_half),yprd_half(_yprd_half),zprd_half(_zprd_half) {

View File

@ -660,10 +660,8 @@ void Neighbor::init_pair()
// processes copy,skip,half_from_full,granhistory,respaouter lists // processes copy,skip,half_from_full,granhistory,respaouter lists
// error checks and resets internal ptrs to other lists that now exist // error checks and resets internal ptrs to other lists that now exist
for (i = 0; i < nrequest; i++) { for (i = 0; i < nrequest; i++)
if (!lists[i]) continue;
lists[i]->post_constructor(requests[i]); lists[i]->post_constructor(requests[i]);
}
// (B) rule: // (B) rule:
// if request = pair, half, newton != 2 // if request = pair, half, newton != 2
@ -680,6 +678,10 @@ void Neighbor::init_pair()
for (i = 0; i < nrequest; i++) { for (i = 0; i < nrequest; i++) {
if (requests[i]->pair && requests[i]->half && requests[i]->newton != 2) { if (requests[i]->pair && requests[i]->half && requests[i]->newton != 2) {
for (j = 0; j < nrequest; j++) { for (j = 0; j < nrequest; j++) {
// Kokkos doesn't yet support half from full
if (requests[i]->kokkos_device || requests[j]->kokkos_device) continue;
if (requests[i]->kokkos_host || requests[j]->kokkos_host) continue;
if (requests[j]->full && requests[j]->occasional == 0 && if (requests[j]->full && requests[j]->occasional == 0 &&
!requests[j]->skip && !requests[j]->copy) break; !requests[j]->skip && !requests[j]->copy) break;
} }
@ -706,6 +708,10 @@ void Neighbor::init_pair()
for (i = 0; i < nrequest; i++) { for (i = 0; i < nrequest; i++) {
if (!requests[i]->fix && !requests[i]->compute) continue; if (!requests[i]->fix && !requests[i]->compute) continue;
for (j = 0; j < nrequest; j++) { for (j = 0; j < nrequest; j++) {
// Kokkos flags must match
if (requests[i]->kokkos_device != requests[j]->kokkos_device) continue;
if (requests[i]->kokkos_host != requests[j]->kokkos_host) continue;
if (requests[i]->half && requests[j]->pair && if (requests[i]->half && requests[j]->pair &&
!requests[j]->skip && requests[j]->half && !requests[j]->copy) !requests[j]->skip && requests[j]->half && !requests[j]->copy)
break; break;
@ -727,6 +733,10 @@ void Neighbor::init_pair()
continue; continue;
} }
for (j = 0; j < nrequest; j++) { for (j = 0; j < nrequest; j++) {
// Kokkos doesn't yet support half from full
if (requests[i]->kokkos_device || requests[j]->kokkos_device) continue;
if (requests[i]->kokkos_host || requests[j]->kokkos_host) continue;
if (requests[i]->half && requests[j]->pair && if (requests[i]->half && requests[j]->pair &&
!requests[j]->skip && requests[j]->full && !requests[j]->copy) !requests[j]->skip && requests[j]->full && !requests[j]->copy)
break; break;
@ -1434,7 +1444,11 @@ int Neighbor::choose_pair(NeighRequest *rq)
for (int i = 0; i < npclass; i++) { for (int i = 0; i < npclass; i++) {
mask = pairmasks[i]; mask = pairmasks[i];
if (copyflag && (mask & NP_COPY)) return i+1; if (copyflag && (mask & NP_COPY)) {
if (kokkos_device_flag != (mask & NP_KOKKOS_DEVICE)) continue;
if (kokkos_host_flag != (mask & NP_KOKKOS_HOST)) continue;
return i+1;
}
if (skipflag != (mask & NP_SKIP)) continue; if (skipflag != (mask & NP_SKIP)) continue;
if (halfflag) { if (halfflag) {