Merge pull request #3100 from rbberger/kokkos_cleanup
Refactor some declarations in KOKKOS package
This commit is contained in:
@ -65,14 +65,14 @@ class AngleCharmmKokkos : public AngleCharmm {
|
|||||||
typedef ArrayTypes<DeviceType> AT;
|
typedef ArrayTypes<DeviceType> AT;
|
||||||
typename AT::t_x_array_randomread x;
|
typename AT::t_x_array_randomread x;
|
||||||
|
|
||||||
typedef typename KKDevice<DeviceType>::value KKDeviceType;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
typename Kokkos::View<double*[3],typename AT::t_f_array::array_layout,KKDeviceType,Kokkos::MemoryTraits<Kokkos::Atomic> > f;
|
typename Kokkos::View<double*[3],typename AT::t_f_array::array_layout,KKDeviceType,Kokkos::MemoryTraits<Kokkos::Atomic> > f;
|
||||||
typename AT::t_int_2d anglelist;
|
typename AT::t_int_2d anglelist;
|
||||||
|
|
||||||
Kokkos::DualView<E_FLOAT*,Kokkos::LayoutRight,KKDeviceType> k_eatom;
|
Kokkos::DualView<E_FLOAT*,Kokkos::LayoutRight,KKDeviceType> k_eatom;
|
||||||
Kokkos::DualView<F_FLOAT*[6],Kokkos::LayoutRight,KKDeviceType> k_vatom;
|
Kokkos::DualView<F_FLOAT*[6],Kokkos::LayoutRight,KKDeviceType> k_vatom;
|
||||||
Kokkos::View<E_FLOAT*,Kokkos::LayoutRight,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<Kokkos::Atomic> > d_eatom;
|
Kokkos::View<E_FLOAT*,Kokkos::LayoutRight,KKDeviceType,Kokkos::MemoryTraits<Kokkos::Atomic>> d_eatom;
|
||||||
Kokkos::View<F_FLOAT*[6],Kokkos::LayoutRight,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<Kokkos::Atomic> > d_vatom;
|
Kokkos::View<F_FLOAT*[6],Kokkos::LayoutRight,KKDeviceType,Kokkos::MemoryTraits<Kokkos::Atomic>> d_vatom;
|
||||||
|
|
||||||
int nlocal,newton_bond;
|
int nlocal,newton_bond;
|
||||||
int eflag,vflag;
|
int eflag,vflag;
|
||||||
|
|||||||
@ -864,8 +864,8 @@ KOKKOS_INLINE_FUNCTION
|
|||||||
void FixACKS2ReaxFFKokkos<DeviceType>::compute_x_item(int ii, int &m_fill, const bool &final) const
|
void FixACKS2ReaxFFKokkos<DeviceType>::compute_x_item(int ii, int &m_fill, const bool &final) const
|
||||||
{
|
{
|
||||||
// The X_diag array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The X_diag array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
auto v_X_diag = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_X_diag),decltype(ndup_X_diag)>::get(dup_X_diag,ndup_X_diag);
|
auto v_X_diag = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_X_diag),decltype(ndup_X_diag)>::get(dup_X_diag,ndup_X_diag);
|
||||||
auto a_X_diag = v_X_diag.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_X_diag = v_X_diag.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
int j,jj,jtype;
|
int j,jj,jtype;
|
||||||
@ -942,8 +942,8 @@ void FixACKS2ReaxFFKokkos<DeviceType>::compute_x_team(
|
|||||||
int atoms_per_team, int vector_length) const {
|
int atoms_per_team, int vector_length) const {
|
||||||
|
|
||||||
// The X_diag array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The X_diag array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
auto v_X_diag = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_X_diag),decltype(ndup_X_diag)>::get(dup_X_diag,ndup_X_diag);
|
auto v_X_diag = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_X_diag),decltype(ndup_X_diag)>::get(dup_X_diag,ndup_X_diag);
|
||||||
auto a_X_diag = v_X_diag.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_X_diag = v_X_diag.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
// scratch space setup
|
// scratch space setup
|
||||||
Kokkos::View<int *, Kokkos::ScratchMemorySpace<DeviceType>,
|
Kokkos::View<int *, Kokkos::ScratchMemorySpace<DeviceType>,
|
||||||
@ -1460,8 +1460,8 @@ KOKKOS_INLINE_FUNCTION
|
|||||||
void FixACKS2ReaxFFKokkos<DeviceType>::operator() (TagACKS2SparseMatvec3_Half<NEIGHFLAG>, const int &ii) const
|
void FixACKS2ReaxFFKokkos<DeviceType>::operator() (TagACKS2SparseMatvec3_Half<NEIGHFLAG>, const int &ii) const
|
||||||
{
|
{
|
||||||
// The bb array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The bb array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
auto v_bb = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_bb),decltype(ndup_bb)>::get(dup_bb,ndup_bb);
|
auto v_bb = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_bb),decltype(ndup_bb)>::get(dup_bb,ndup_bb);
|
||||||
auto a_bb = v_bb.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_bb = v_bb.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
|
|||||||
@ -183,16 +183,16 @@ class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF {
|
|||||||
Kokkos::DualView<params_acks2*,Kokkos::LayoutRight,DeviceType> k_params;
|
Kokkos::DualView<params_acks2*,Kokkos::LayoutRight,DeviceType> k_params;
|
||||||
typename Kokkos::DualView<params_acks2*, Kokkos::LayoutRight,DeviceType>::t_dev_const params;
|
typename Kokkos::DualView<params_acks2*, Kokkos::LayoutRight,DeviceType>::t_dev_const params;
|
||||||
|
|
||||||
typename ArrayTypes<DeviceType>::t_x_array x;
|
typename AT::t_x_array x;
|
||||||
typename ArrayTypes<DeviceType>::t_v_array v;
|
typename AT::t_v_array v;
|
||||||
typename ArrayTypes<DeviceType>::t_f_array_const f;
|
typename AT::t_f_array_const f;
|
||||||
typename ArrayTypes<DeviceType>::t_ffloat_1d_randomread mass;
|
typename AT::t_ffloat_1d_randomread mass;
|
||||||
typename ArrayTypes<DeviceType>::t_ffloat_1d q;
|
typename AT::t_ffloat_1d q;
|
||||||
typename ArrayTypes<DeviceType>::t_int_1d type, mask;
|
typename AT::t_int_1d type, mask;
|
||||||
typename ArrayTypes<DeviceType>::t_tagint_1d tag;
|
typename AT::t_tagint_1d tag;
|
||||||
|
|
||||||
typename ArrayTypes<DeviceType>::t_neighbors_2d d_neighbors;
|
typename AT::t_neighbors_2d d_neighbors;
|
||||||
typename ArrayTypes<DeviceType>::t_int_1d_randomread d_ilist, d_numneigh;
|
typename AT::t_int_1d_randomread d_ilist, d_numneigh;
|
||||||
|
|
||||||
DAT::tdual_ffloat_1d k_tap;
|
DAT::tdual_ffloat_1d k_tap;
|
||||||
typename AT::t_ffloat_1d d_tap;
|
typename AT::t_ffloat_1d d_tap;
|
||||||
@ -222,11 +222,19 @@ class FixACKS2ReaxFFKokkos : public FixACKS2ReaxFF {
|
|||||||
typename AT::t_ffloat_2d d_shield, d_s_hist, d_s_hist_X, d_s_hist_last;
|
typename AT::t_ffloat_2d d_shield, d_s_hist, d_s_hist_X, d_s_hist_last;
|
||||||
typename AT::t_ffloat_2d_randomread r_s_hist, r_s_hist_X, r_s_hist_last;
|
typename AT::t_ffloat_2d_randomread r_s_hist, r_s_hist_X, r_s_hist_last;
|
||||||
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout, typename KKDevice<DeviceType>::value, Kokkos::Experimental::ScatterSum, Kokkos::Experimental::ScatterDuplicated> dup_X_diag;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout, typename KKDevice<DeviceType>::value, Kokkos::Experimental::ScatterSum, Kokkos::Experimental::ScatterNonDuplicated> ndup_X_diag;
|
|
||||||
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout, typename KKDevice<DeviceType>::value, Kokkos::Experimental::ScatterSum, Kokkos::Experimental::ScatterDuplicated> dup_bb;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout, typename KKDevice<DeviceType>::value, Kokkos::Experimental::ScatterSum, Kokkos::Experimental::ScatterNonDuplicated> ndup_bb;
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
|
|
||||||
|
template<typename DataType, typename Layout>
|
||||||
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout> dup_X_diag;
|
||||||
|
NonDupScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout> ndup_X_diag;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout> dup_bb;
|
||||||
|
NonDupScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout> ndup_bb;
|
||||||
|
|
||||||
void init_shielding_k();
|
void init_shielding_k();
|
||||||
void init_hist();
|
void init_hist();
|
||||||
|
|||||||
@ -45,11 +45,10 @@ namespace LAMMPS_NS {
|
|||||||
}
|
}
|
||||||
|
|
||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
volatile s_FSUM& operator+=(const volatile s_FSUM &rhs) volatile {
|
void operator+=(const volatile s_FSUM &rhs) volatile {
|
||||||
fx += rhs.fx;
|
fx += rhs.fx;
|
||||||
fy += rhs.fy;
|
fy += rhs.fy;
|
||||||
fz += rhs.fz;
|
fz += rhs.fz;
|
||||||
return *this;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
typedef s_FSUM FSUM;
|
typedef s_FSUM FSUM;
|
||||||
|
|||||||
@ -1041,8 +1041,8 @@ KOKKOS_INLINE_FUNCTION
|
|||||||
void FixQEqReaxFFKokkos<DeviceType>::sparse13_item(int ii) const
|
void FixQEqReaxFFKokkos<DeviceType>::sparse13_item(int ii) const
|
||||||
{
|
{
|
||||||
// The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
auto v_o = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_o),decltype(ndup_o)>::get(dup_o,ndup_o);
|
auto v_o = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_o),decltype(ndup_o)>::get(dup_o,ndup_o);
|
||||||
auto a_o = v_o.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_o = v_o.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
@ -1094,8 +1094,8 @@ KOKKOS_INLINE_FUNCTION
|
|||||||
void FixQEqReaxFFKokkos<DeviceType>::sparse23_item(int ii) const
|
void FixQEqReaxFFKokkos<DeviceType>::sparse23_item(int ii) const
|
||||||
{
|
{
|
||||||
// The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
auto v_o = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_o),decltype(ndup_o)>::get(dup_o,ndup_o);
|
auto v_o = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_o),decltype(ndup_o)>::get(dup_o,ndup_o);
|
||||||
auto a_o = v_o.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_o = v_o.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
@ -1154,8 +1154,8 @@ KOKKOS_INLINE_FUNCTION
|
|||||||
void FixQEqReaxFFKokkos<DeviceType>::sparse33_item(int ii) const
|
void FixQEqReaxFFKokkos<DeviceType>::sparse33_item(int ii) const
|
||||||
{
|
{
|
||||||
// The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The q array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
auto v_o = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_o),decltype(ndup_o)>::get(dup_o,ndup_o);
|
auto v_o = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_o),decltype(ndup_o)>::get(dup_o,ndup_o);
|
||||||
auto a_o = v_o.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_o = v_o.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
if (mask[i] & groupbit) {
|
if (mask[i] & groupbit) {
|
||||||
|
|||||||
@ -177,21 +177,21 @@ class FixQEqReaxFFKokkos : public FixQEqReaxFF, public KokkosBase {
|
|||||||
Kokkos::DualView<params_qeq*,Kokkos::LayoutRight,DeviceType> k_params;
|
Kokkos::DualView<params_qeq*,Kokkos::LayoutRight,DeviceType> k_params;
|
||||||
typename Kokkos::DualView<params_qeq*, Kokkos::LayoutRight,DeviceType>::t_dev_const params;
|
typename Kokkos::DualView<params_qeq*, Kokkos::LayoutRight,DeviceType>::t_dev_const params;
|
||||||
|
|
||||||
typename ArrayTypes<DeviceType>::t_x_array x;
|
typename AT::t_x_array x;
|
||||||
typename ArrayTypes<DeviceType>::t_v_array v;
|
typename AT::t_v_array v;
|
||||||
typename ArrayTypes<DeviceType>::t_f_array_const f;
|
typename AT::t_f_array_const f;
|
||||||
//typename ArrayTypes<DeviceType>::t_float_1d_randomread mass, q;
|
//typename AT::t_float_1d_randomread mass, q;
|
||||||
typename ArrayTypes<DeviceType>::t_float_1d_randomread mass;
|
typename AT::t_float_1d_randomread mass;
|
||||||
typename ArrayTypes<DeviceType>::t_float_1d q;
|
typename AT::t_float_1d q;
|
||||||
typename ArrayTypes<DeviceType>::t_int_1d type, mask;
|
typename AT::t_int_1d type, mask;
|
||||||
typename ArrayTypes<DeviceType>::t_tagint_1d tag;
|
typename AT::t_tagint_1d tag;
|
||||||
|
|
||||||
DAT::tdual_float_1d k_q;
|
DAT::tdual_float_1d k_q;
|
||||||
typename AT::t_float_1d d_q;
|
typename AT::t_float_1d d_q;
|
||||||
HAT::t_float_1d h_q;
|
HAT::t_float_1d h_q;
|
||||||
|
|
||||||
typename ArrayTypes<DeviceType>::t_neighbors_2d d_neighbors;
|
typename AT::t_neighbors_2d d_neighbors;
|
||||||
typename ArrayTypes<DeviceType>::t_int_1d_randomread d_ilist, d_numneigh;
|
typename AT::t_int_1d_randomread d_ilist, d_numneigh;
|
||||||
|
|
||||||
DAT::tdual_ffloat_1d k_tap;
|
DAT::tdual_ffloat_1d k_tap;
|
||||||
typename AT::t_ffloat_1d d_tap;
|
typename AT::t_ffloat_1d d_tap;
|
||||||
@ -216,8 +216,16 @@ class FixQEqReaxFFKokkos : public FixQEqReaxFF, public KokkosBase {
|
|||||||
HAT::t_ffloat_2d h_s_hist, h_t_hist;
|
HAT::t_ffloat_2d h_s_hist, h_t_hist;
|
||||||
typename AT::t_ffloat_2d_randomread r_s_hist, r_t_hist;
|
typename AT::t_ffloat_2d_randomread r_s_hist, r_t_hist;
|
||||||
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout, typename KKDevice<DeviceType>::value, Kokkos::Experimental::ScatterSum, Kokkos::Experimental::ScatterDuplicated> dup_o;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout, typename KKDevice<DeviceType>::value, Kokkos::Experimental::ScatterSum, Kokkos::Experimental::ScatterNonDuplicated> ndup_o;
|
|
||||||
|
template<typename DataType, typename Layout>
|
||||||
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
|
|
||||||
|
template<typename DataType, typename Layout>
|
||||||
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout> dup_o;
|
||||||
|
NonDupScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout> ndup_o;
|
||||||
|
|
||||||
int iswap;
|
int iswap;
|
||||||
int first;
|
int first;
|
||||||
|
|||||||
@ -61,13 +61,12 @@ struct s_CounterType
|
|||||||
}
|
}
|
||||||
|
|
||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
volatile s_CounterType& operator+=(const volatile s_CounterType &rhs) volatile
|
void operator+=(const volatile s_CounterType &rhs) volatile
|
||||||
{
|
{
|
||||||
nSteps += rhs.nSteps;
|
nSteps += rhs.nSteps;
|
||||||
nIters += rhs.nIters;
|
nIters += rhs.nIters;
|
||||||
nFuncs += rhs.nFuncs;
|
nFuncs += rhs.nFuncs;
|
||||||
nFails += rhs.nFails;
|
nFails += rhs.nFails;
|
||||||
return *this;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
typedef struct s_CounterType CounterType;
|
typedef struct s_CounterType CounterType;
|
||||||
@ -239,22 +238,22 @@ class FixRxKokkos : public FixRX {
|
|||||||
typename AT::t_efloat_1d d_dpdThetaLocal, d_sumWeights;
|
typename AT::t_efloat_1d d_dpdThetaLocal, d_sumWeights;
|
||||||
HAT::t_efloat_1d h_dpdThetaLocal, h_sumWeights;
|
HAT::t_efloat_1d h_dpdThetaLocal, h_sumWeights;
|
||||||
|
|
||||||
typename ArrayTypes<DeviceType>::t_x_array_randomread d_x ;
|
typename AT::t_x_array_randomread d_x;
|
||||||
typename ArrayTypes<DeviceType>::t_int_1d_randomread d_type ;
|
typename AT::t_int_1d_randomread d_type;
|
||||||
typename ArrayTypes<DeviceType>::t_efloat_1d d_dpdTheta;
|
typename AT::t_efloat_1d d_dpdTheta;
|
||||||
|
|
||||||
typename ArrayTypes<DeviceType>::tdual_ffloat_2d k_cutsq;
|
typename AT::tdual_ffloat_2d k_cutsq;
|
||||||
typename ArrayTypes<DeviceType>::t_ffloat_2d d_cutsq;
|
typename AT::t_ffloat_2d d_cutsq;
|
||||||
//double **h_cutsq;
|
//double **h_cutsq;
|
||||||
|
|
||||||
typename ArrayTypes<DeviceType>::t_neighbors_2d d_neighbors;
|
typename AT::t_neighbors_2d d_neighbors;
|
||||||
typename ArrayTypes<DeviceType>::t_int_1d d_ilist ;
|
typename AT::t_int_1d d_ilist;
|
||||||
typename ArrayTypes<DeviceType>::t_int_1d d_numneigh ;
|
typename AT::t_int_1d d_numneigh;
|
||||||
|
|
||||||
typename ArrayTypes<DeviceType>::t_float_2d d_dvector;
|
typename AT::t_float_2d d_dvector;
|
||||||
typename ArrayTypes<DeviceType>::t_int_1d d_mask ;
|
typename AT::t_int_1d d_mask;
|
||||||
|
|
||||||
typename ArrayTypes<DeviceType>::t_double_1d d_scratchSpace;
|
typename AT::t_double_1d d_scratchSpace;
|
||||||
size_t scratchSpaceSize;
|
size_t scratchSpaceSize;
|
||||||
|
|
||||||
// Error flag for any failures.
|
// Error flag for any failures.
|
||||||
|
|||||||
@ -590,8 +590,8 @@ void FixShakeKokkos<DeviceType>::shake(int m, EV_FLOAT& ev) const
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
int nlist,list[2];
|
int nlist,list[2];
|
||||||
double v[6];
|
double v[6];
|
||||||
@ -701,8 +701,8 @@ void FixShakeKokkos<DeviceType>::shake3(int m, EV_FLOAT& ev) const
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
int nlist,list[3];
|
int nlist,list[3];
|
||||||
double v[6];
|
double v[6];
|
||||||
@ -884,8 +884,8 @@ void FixShakeKokkos<DeviceType>::shake4(int m, EV_FLOAT& ev) const
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
int nlist,list[4];
|
int nlist,list[4];
|
||||||
double v[6];
|
double v[6];
|
||||||
@ -1146,8 +1146,8 @@ void FixShakeKokkos<DeviceType>::shake3angle(int m, EV_FLOAT& ev) const
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
int nlist,list[3];
|
int nlist,list[3];
|
||||||
double v[6];
|
double v[6];
|
||||||
@ -1744,8 +1744,8 @@ void FixShakeKokkos<DeviceType>::v_tally(EV_FLOAT &ev, int n, int *list, double
|
|||||||
if (vflag_atom) {
|
if (vflag_atom) {
|
||||||
double fraction = 1.0/total;
|
double fraction = 1.0/total;
|
||||||
for (int i = 0; i < n; i++) {
|
for (int i = 0; i < n; i++) {
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
m = list[i];
|
m = list[i];
|
||||||
a_vatom(m,0) += fraction*v[0];
|
a_vatom(m,0) += fraction*v[0];
|
||||||
a_vatom(m,1) += fraction*v[1];
|
a_vatom(m,1) += fraction*v[1];
|
||||||
|
|||||||
@ -151,14 +151,21 @@ class FixShakeKokkos : public FixShake, public KokkosBase {
|
|||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void shake3angle(int, EV_FLOAT&) const;
|
void shake3angle(int, EV_FLOAT&) const;
|
||||||
|
|
||||||
typedef typename KKDevice<DeviceType>::value KKDeviceType;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_eatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_vatom;
|
|
||||||
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_f;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_eatom;
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_vatom;
|
|
||||||
|
template<typename DataType, typename Layout>
|
||||||
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> dup_f;
|
||||||
|
DupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> dup_eatom;
|
||||||
|
DupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> dup_vatom;
|
||||||
|
|
||||||
|
NonDupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> ndup_f;
|
||||||
|
NonDupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> ndup_eatom;
|
||||||
|
NonDupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> ndup_vatom;
|
||||||
|
|
||||||
int neighflag,need_dup;
|
int neighflag,need_dup;
|
||||||
|
|
||||||
|
|||||||
@ -197,6 +197,15 @@ public:
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Helpers for readability
|
||||||
|
|
||||||
|
using KKScatterSum = Kokkos::Experimental::ScatterSum;
|
||||||
|
using KKScatterDuplicated = Kokkos::Experimental::ScatterDuplicated;
|
||||||
|
using KKScatterNonDuplicated = Kokkos::Experimental::ScatterNonDuplicated;
|
||||||
|
|
||||||
|
template<typename DataType, typename Layout, typename Device, typename... Args>
|
||||||
|
using KKScatterView = Kokkos::Experimental::ScatterView<DataType, Layout, Device, Args...>;
|
||||||
|
|
||||||
|
|
||||||
// set ExecutionSpace stuct with variable "space"
|
// set ExecutionSpace stuct with variable "space"
|
||||||
|
|
||||||
@ -274,6 +283,9 @@ struct AtomicDup {
|
|||||||
using value = Kokkos::Experimental::ScatterNonAtomic;
|
using value = Kokkos::Experimental::ScatterNonAtomic;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<int NEIGHFLAG, class DeviceType>
|
||||||
|
using AtomicDup_v = typename AtomicDup<NEIGHFLAG, DeviceType>::value;
|
||||||
|
|
||||||
#ifdef KOKKOS_ENABLE_CUDA
|
#ifdef KOKKOS_ENABLE_CUDA
|
||||||
template<>
|
template<>
|
||||||
struct AtomicDup<HALFTHREAD,Kokkos::Cuda> {
|
struct AtomicDup<HALFTHREAD,Kokkos::Cuda> {
|
||||||
@ -322,6 +334,9 @@ struct NeedDup {
|
|||||||
using value = Kokkos::Experimental::ScatterNonDuplicated;
|
using value = Kokkos::Experimental::ScatterNonDuplicated;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
template<int NEIGHFLAG, class DeviceType>
|
||||||
|
using NeedDup_v = typename NeedDup<NEIGHFLAG,DeviceType>::value;
|
||||||
|
|
||||||
#ifndef LMP_KOKKOS_USE_ATOMICS
|
#ifndef LMP_KOKKOS_USE_ATOMICS
|
||||||
|
|
||||||
#ifdef KOKKOS_ENABLE_OPENMP
|
#ifdef KOKKOS_ENABLE_OPENMP
|
||||||
|
|||||||
@ -172,13 +172,11 @@ TYPE create_kokkos(TYPE &data, typename TYPE::value_type **&array,
|
|||||||
bigint nbytes = ((bigint) sizeof(typename TYPE::value_type *)) * n1;
|
bigint nbytes = ((bigint) sizeof(typename TYPE::value_type *)) * n1;
|
||||||
array = (typename TYPE::value_type **) smalloc(nbytes,name);
|
array = (typename TYPE::value_type **) smalloc(nbytes,name);
|
||||||
|
|
||||||
bigint n = 0;
|
|
||||||
for (int i = 0; i < n1; i++) {
|
for (int i = 0; i < n1; i++) {
|
||||||
if (n2==0)
|
if (n2==0)
|
||||||
array[i] = nullptr;
|
array[i] = nullptr;
|
||||||
else
|
else
|
||||||
array[i] = &data.h_view(i,0);
|
array[i] = &data.h_view(i,0);
|
||||||
n += n2;
|
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@ -193,13 +191,11 @@ template <typename TYPE, typename HTYPE>
|
|||||||
bigint nbytes = ((bigint) sizeof(typename TYPE::value_type *)) * n1;
|
bigint nbytes = ((bigint) sizeof(typename TYPE::value_type *)) * n1;
|
||||||
array = (typename TYPE::value_type **) smalloc(nbytes,name);
|
array = (typename TYPE::value_type **) smalloc(nbytes,name);
|
||||||
|
|
||||||
bigint n = 0;
|
|
||||||
for (int i = 0; i < n1; i++) {
|
for (int i = 0; i < n1; i++) {
|
||||||
if (n2==0)
|
if (n2==0)
|
||||||
array[i] = nullptr;
|
array[i] = nullptr;
|
||||||
else
|
else
|
||||||
array[i] = &h_data(i,0);
|
array[i] = &h_data(i,0);
|
||||||
n += n2;
|
|
||||||
}
|
}
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -553,8 +553,8 @@ void PairEAMAlloyKokkos<DeviceType>::operator()(TagPairEAMAlloyKernelA<NEIGHFLAG
|
|||||||
|
|
||||||
// The rho array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The rho array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_rho = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_rho),decltype(ndup_rho)>::get(dup_rho,ndup_rho);
|
auto v_rho = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_rho),decltype(ndup_rho)>::get(dup_rho,ndup_rho);
|
||||||
auto a_rho = v_rho.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_rho = v_rho.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const X_FLOAT xtmp = x(i,0);
|
const X_FLOAT xtmp = x(i,0);
|
||||||
@ -718,8 +718,8 @@ void PairEAMAlloyKokkos<DeviceType>::operator()(TagPairEAMAlloyKernelC<NEIGHFLAG
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const X_FLOAT xtmp = x(i,0);
|
const X_FLOAT xtmp = x(i,0);
|
||||||
@ -832,11 +832,11 @@ void PairEAMAlloyKokkos<DeviceType>::ev_tally(EV_FLOAT &ev, const int &i, const
|
|||||||
|
|
||||||
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
if (EFLAG) {
|
if (EFLAG) {
|
||||||
if (eflag_atom) {
|
if (eflag_atom) {
|
||||||
|
|||||||
@ -123,18 +123,28 @@ class PairEAMAlloyKokkos : public PairEAM, public KokkosBase {
|
|||||||
|
|
||||||
DAT::tdual_efloat_1d k_eatom;
|
DAT::tdual_efloat_1d k_eatom;
|
||||||
DAT::tdual_virial_array k_vatom;
|
DAT::tdual_virial_array k_vatom;
|
||||||
typename ArrayTypes<DeviceType>::t_efloat_1d d_eatom;
|
typename AT::t_efloat_1d d_eatom;
|
||||||
typename ArrayTypes<DeviceType>::t_virial_array d_vatom;
|
typename AT::t_virial_array d_vatom;
|
||||||
|
|
||||||
int need_dup;
|
int need_dup;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_rho;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_f;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_eatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_vatom;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_rho;
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_eatom;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_vatom;
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout> dup_rho;
|
||||||
|
DupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> dup_f;
|
||||||
|
DupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> dup_eatom;
|
||||||
|
DupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> dup_vatom;
|
||||||
|
|
||||||
|
NonDupScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout> ndup_rho;
|
||||||
|
NonDupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> ndup_f;
|
||||||
|
NonDupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> ndup_eatom;
|
||||||
|
NonDupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> ndup_vatom;
|
||||||
|
|
||||||
DAT::tdual_ffloat_1d k_rho;
|
DAT::tdual_ffloat_1d k_rho;
|
||||||
DAT::tdual_ffloat_1d k_fp;
|
DAT::tdual_ffloat_1d k_fp;
|
||||||
|
|||||||
@ -553,8 +553,8 @@ void PairEAMFSKokkos<DeviceType>::operator()(TagPairEAMFSKernelA<NEIGHFLAG,NEWTO
|
|||||||
|
|
||||||
// The rho array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The rho array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_rho = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_rho),decltype(ndup_rho)>::get(dup_rho,ndup_rho);
|
auto v_rho = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_rho),decltype(ndup_rho)>::get(dup_rho,ndup_rho);
|
||||||
auto a_rho = v_rho.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_rho = v_rho.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const X_FLOAT xtmp = x(i,0);
|
const X_FLOAT xtmp = x(i,0);
|
||||||
@ -719,8 +719,8 @@ void PairEAMFSKokkos<DeviceType>::operator()(TagPairEAMFSKernelC<NEIGHFLAG,NEWTO
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const X_FLOAT xtmp = x(i,0);
|
const X_FLOAT xtmp = x(i,0);
|
||||||
@ -833,11 +833,11 @@ void PairEAMFSKokkos<DeviceType>::ev_tally(EV_FLOAT &ev, const int &i, const int
|
|||||||
|
|
||||||
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
if (EFLAG) {
|
if (EFLAG) {
|
||||||
if (eflag_atom) {
|
if (eflag_atom) {
|
||||||
|
|||||||
@ -123,18 +123,28 @@ class PairEAMFSKokkos : public PairEAM, public KokkosBase {
|
|||||||
|
|
||||||
DAT::tdual_efloat_1d k_eatom;
|
DAT::tdual_efloat_1d k_eatom;
|
||||||
DAT::tdual_virial_array k_vatom;
|
DAT::tdual_virial_array k_vatom;
|
||||||
typename ArrayTypes<DeviceType>::t_efloat_1d d_eatom;
|
typename AT::t_efloat_1d d_eatom;
|
||||||
typename ArrayTypes<DeviceType>::t_virial_array d_vatom;
|
typename AT::t_virial_array d_vatom;
|
||||||
|
|
||||||
int need_dup;
|
int need_dup;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_rho;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_f;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_eatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_vatom;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_rho;
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_eatom;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_vatom;
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout> dup_rho;
|
||||||
|
DupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> dup_f;
|
||||||
|
DupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> dup_eatom;
|
||||||
|
DupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> dup_vatom;
|
||||||
|
|
||||||
|
NonDupScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout> ndup_rho;
|
||||||
|
NonDupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> ndup_f;
|
||||||
|
NonDupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> ndup_eatom;
|
||||||
|
NonDupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> ndup_vatom;
|
||||||
|
|
||||||
DAT::tdual_ffloat_1d k_rho;
|
DAT::tdual_ffloat_1d k_rho;
|
||||||
DAT::tdual_ffloat_1d k_fp;
|
DAT::tdual_ffloat_1d k_fp;
|
||||||
|
|||||||
@ -548,8 +548,8 @@ void PairEAMKokkos<DeviceType>::operator()(TagPairEAMKernelA<NEIGHFLAG,NEWTON_PA
|
|||||||
|
|
||||||
// The rho array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The rho array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_rho = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_rho),decltype(ndup_rho)>::get(dup_rho,ndup_rho);
|
auto v_rho = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_rho),decltype(ndup_rho)>::get(dup_rho,ndup_rho);
|
||||||
auto a_rho = v_rho.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_rho = v_rho.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const X_FLOAT xtmp = x(i,0);
|
const X_FLOAT xtmp = x(i,0);
|
||||||
@ -713,8 +713,8 @@ void PairEAMKokkos<DeviceType>::operator()(TagPairEAMKernelC<NEIGHFLAG,NEWTON_PA
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const X_FLOAT xtmp = x(i,0);
|
const X_FLOAT xtmp = x(i,0);
|
||||||
@ -827,11 +827,11 @@ void PairEAMKokkos<DeviceType>::ev_tally(EV_FLOAT &ev, const int &i, const int &
|
|||||||
|
|
||||||
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
if (EFLAG) {
|
if (EFLAG) {
|
||||||
if (eflag_atom) {
|
if (eflag_atom) {
|
||||||
|
|||||||
@ -120,18 +120,27 @@ class PairEAMKokkos : public PairEAM, public KokkosBase {
|
|||||||
|
|
||||||
DAT::tdual_efloat_1d k_eatom;
|
DAT::tdual_efloat_1d k_eatom;
|
||||||
DAT::tdual_virial_array k_vatom;
|
DAT::tdual_virial_array k_vatom;
|
||||||
typename ArrayTypes<DeviceType>::t_efloat_1d d_eatom;
|
typename AT::t_efloat_1d d_eatom;
|
||||||
typename ArrayTypes<DeviceType>::t_virial_array d_vatom;
|
typename AT::t_virial_array d_vatom;
|
||||||
|
|
||||||
int need_dup;
|
int need_dup;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_rho;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_f;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_eatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_vatom;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_rho;
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_eatom;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_vatom;
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout> dup_rho;
|
||||||
|
DupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> dup_f;
|
||||||
|
DupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> dup_eatom;
|
||||||
|
DupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> dup_vatom;
|
||||||
|
NonDupScatterView<F_FLOAT*, typename DAT::t_ffloat_1d::array_layout> ndup_rho;
|
||||||
|
NonDupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> ndup_f;
|
||||||
|
NonDupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> ndup_eatom;
|
||||||
|
NonDupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> ndup_vatom;
|
||||||
|
|
||||||
DAT::tdual_ffloat_1d k_rho;
|
DAT::tdual_ffloat_1d k_rho;
|
||||||
DAT::tdual_ffloat_1d k_fp;
|
DAT::tdual_ffloat_1d k_fp;
|
||||||
|
|||||||
@ -65,19 +65,22 @@ struct PairComputeFunctor {
|
|||||||
typename AT::t_efloat_1d d_eatom;
|
typename AT::t_efloat_1d d_eatom;
|
||||||
typename AT::t_virial_array d_vatom;
|
typename AT::t_virial_array d_vatom;
|
||||||
|
|
||||||
|
using KKDeviceType = typename KKDevice<device_type>::value;
|
||||||
|
using DUP = typename NeedDup<NEIGHFLAG,device_type>::value;
|
||||||
|
|
||||||
// The force array is atomic for Half/Thread neighbor style
|
// The force array is atomic for Half/Thread neighbor style
|
||||||
//Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,
|
//Kokkos::View<F_FLOAT*[3], typename DAT::t_f_array::array_layout,
|
||||||
// typename KKDevice<device_type>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > f;
|
// typename KKDevice<device_type>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > f;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<device_type>::value,typename Kokkos::Experimental::ScatterSum,typename NeedDup<NEIGHFLAG,device_type>::value > dup_f;
|
KKScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,KKDeviceType,KKScatterSum,DUP> dup_f;
|
||||||
|
|
||||||
// The eatom and vatom arrays are atomic for Half/Thread neighbor style
|
// The eatom and vatom arrays are atomic for Half/Thread neighbor style
|
||||||
//Kokkos::View<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,
|
//Kokkos::View<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,
|
||||||
// typename KKDevice<device_type>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > eatom;
|
// typename KKDevice<device_type>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > eatom;
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<device_type>::value,typename Kokkos::Experimental::ScatterSum,typename NeedDup<NEIGHFLAG,device_type>::value > dup_eatom;
|
KKScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,KKDeviceType,KKScatterSum,DUP> dup_eatom;
|
||||||
|
|
||||||
//Kokkos::View<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,
|
//Kokkos::View<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,
|
||||||
// typename KKDevice<device_type>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > vatom;
|
// typename KKDevice<device_type>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > vatom;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<device_type>::value,typename Kokkos::Experimental::ScatterSum,typename NeedDup<NEIGHFLAG,device_type>::value > dup_vatom;
|
KKScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,KKDeviceType,KKScatterSum,DUP> dup_vatom;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -90,9 +93,9 @@ struct PairComputeFunctor {
|
|||||||
f = c.f;
|
f = c.f;
|
||||||
d_eatom = c.d_eatom;
|
d_eatom = c.d_eatom;
|
||||||
d_vatom = c.d_vatom;
|
d_vatom = c.d_vatom;
|
||||||
dup_f = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum, typename NeedDup<NEIGHFLAG,device_type>::value >(c.f);
|
dup_f = Kokkos::Experimental::create_scatter_view<KKScatterSum, DUP>(c.f);
|
||||||
dup_eatom = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum, typename NeedDup<NEIGHFLAG,device_type>::value >(c.d_eatom);
|
dup_eatom = Kokkos::Experimental::create_scatter_view<KKScatterSum, DUP>(c.d_eatom);
|
||||||
dup_vatom = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum, typename NeedDup<NEIGHFLAG,device_type>::value >(c.d_vatom);
|
dup_vatom = Kokkos::Experimental::create_scatter_view<KKScatterSum, DUP>(c.d_vatom);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Set copymode = 1 so parent allocations aren't destructed by copies of the style
|
// Set copymode = 1 so parent allocations aren't destructed by copies of the style
|
||||||
|
|||||||
@ -1122,8 +1122,8 @@ void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeLJCoulomb<NEIGHFL
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
F_FLOAT powr_vdw, powgi_vdw, fn13, dfn13, exp1, exp2, etmp;
|
F_FLOAT powr_vdw, powgi_vdw, fn13, dfn13, exp1, exp2, etmp;
|
||||||
F_FLOAT evdwl, fvdwl;
|
F_FLOAT evdwl, fvdwl;
|
||||||
@ -1313,8 +1313,8 @@ void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeTabulatedLJCoulom
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const X_FLOAT xtmp = x(i,0);
|
const X_FLOAT xtmp = x(i,0);
|
||||||
@ -1711,11 +1711,11 @@ template<int NEIGHFLAG>
|
|||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxBuildListsHalf<NEIGHFLAG>, const int &ii) const {
|
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxBuildListsHalf<NEIGHFLAG>, const int &ii) const {
|
||||||
|
|
||||||
auto v_dDeltap_self = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_dDeltap_self),decltype(ndup_dDeltap_self)>::get(dup_dDeltap_self,ndup_dDeltap_self);
|
auto v_dDeltap_self = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_dDeltap_self),decltype(ndup_dDeltap_self)>::get(dup_dDeltap_self,ndup_dDeltap_self);
|
||||||
auto a_dDeltap_self = v_dDeltap_self.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_dDeltap_self = v_dDeltap_self.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_total_bo = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_total_bo),decltype(ndup_total_bo)>::get(dup_total_bo,ndup_total_bo);
|
auto v_total_bo = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_total_bo),decltype(ndup_total_bo)>::get(dup_total_bo,ndup_total_bo);
|
||||||
auto a_total_bo = v_total_bo.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_total_bo = v_total_bo.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const X_FLOAT xtmp = x(i,0);
|
const X_FLOAT xtmp = x(i,0);
|
||||||
@ -2135,8 +2135,8 @@ template<int NEIGHFLAG, int EVFLAG>
|
|||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeMulti2<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeMulti2<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
||||||
|
|
||||||
auto v_CdDelta = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta);
|
auto v_CdDelta = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta);
|
||||||
auto a_CdDelta = v_CdDelta.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_CdDelta = v_CdDelta.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const int itype = type(i);
|
const int itype = type(i);
|
||||||
@ -2287,12 +2287,12 @@ template<int NEIGHFLAG, int EVFLAG>
|
|||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeAngular<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeAngular<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbo = d_Cdbo;
|
Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbo = d_Cdbo;
|
||||||
|
|
||||||
auto v_CdDelta = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta);
|
auto v_CdDelta = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta);
|
||||||
auto a_CdDelta = v_CdDelta.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_CdDelta = v_CdDelta.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const int itype = type(i);
|
const int itype = type(i);
|
||||||
@ -2599,13 +2599,13 @@ template<int NEIGHFLAG, int EVFLAG>
|
|||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeTorsion<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeTorsion<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_CdDelta = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta);
|
auto v_CdDelta = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta);
|
||||||
auto a_CdDelta = v_CdDelta.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_CdDelta = v_CdDelta.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbo = d_Cdbo;
|
Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbo = d_Cdbo;
|
||||||
//auto a_Cdbo = dup_Cdbo.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
//auto a_Cdbo = dup_Cdbo.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
// in reaxff_torsion_angles: j = i, k = j, i = k;
|
// in reaxff_torsion_angles: j = i, k = j, i = k;
|
||||||
|
|
||||||
@ -2974,8 +2974,8 @@ template<int NEIGHFLAG, int EVFLAG>
|
|||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeHydrogen<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeHydrogen<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
int hblist[MAX_BONDS];
|
int hblist[MAX_BONDS];
|
||||||
F_FLOAT theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2;
|
F_FLOAT theta, cos_theta, sin_xhz4, cos_xhz1, sin_theta2;
|
||||||
@ -3124,9 +3124,9 @@ void PairReaxFFKokkos<DeviceType>::operator()(PairReaxUpdateBond<NEIGHFLAG>, con
|
|||||||
Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbo = d_Cdbo;
|
Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbo = d_Cdbo;
|
||||||
Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbopi = d_Cdbopi;
|
Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbopi = d_Cdbopi;
|
||||||
Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbopi2 = d_Cdbopi2;
|
Kokkos::View<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,Kokkos::MemoryTraits<AtomicF<NEIGHFLAG>::value> > a_Cdbopi2 = d_Cdbopi2;
|
||||||
//auto a_Cdbo = dup_Cdbo.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
//auto a_Cdbo = dup_Cdbo.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
//auto a_Cdbopi = dup_Cdbopi.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
//auto a_Cdbopi = dup_Cdbopi.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
//auto a_Cdbopi2 = dup_Cdbopi2.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
//auto a_Cdbopi2 = dup_Cdbopi2.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
const tagint itag = tag(i);
|
const tagint itag = tag(i);
|
||||||
@ -3173,10 +3173,10 @@ template<int NEIGHFLAG, int EVFLAG>
|
|||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeBond1<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeBond1<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
|
|
||||||
auto v_CdDelta = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta);
|
auto v_CdDelta = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_CdDelta),decltype(ndup_CdDelta)>::get(dup_CdDelta,ndup_CdDelta);
|
||||||
auto a_CdDelta = v_CdDelta.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_CdDelta = v_CdDelta.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
F_FLOAT p_be1, p_be2, De_s, De_p, De_pp, pow_BOs_be2, exp_be12, CEbo, ebond;
|
F_FLOAT p_be1, p_be2, De_s, De_p, De_pp, pow_BOs_be2, exp_be12, CEbo, ebond;
|
||||||
|
|
||||||
@ -3291,8 +3291,8 @@ template<int NEIGHFLAG, int EVFLAG>
|
|||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeBond2<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
void PairReaxFFKokkos<DeviceType>::operator()(PairReaxFFComputeBond2<NEIGHFLAG,EVFLAG>, const int &ii, EV_FLOAT_REAX& ev) const {
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
F_FLOAT delij[3], delik[3], deljk[3], tmpvec[3];
|
F_FLOAT delij[3], delik[3], deljk[3], tmpvec[3];
|
||||||
F_FLOAT dBOp_i[3], dBOp_k[3], dln_BOp_pi[3], dln_BOp_pi2[3];
|
F_FLOAT dBOp_i[3], dBOp_k[3], dln_BOp_pi[3], dln_BOp_pi2[3];
|
||||||
@ -3498,11 +3498,11 @@ void PairReaxFFKokkos<DeviceType>::ev_tally(EV_FLOAT_REAX &ev, const int &i, con
|
|||||||
|
|
||||||
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
if (eflag_atom) {
|
if (eflag_atom) {
|
||||||
const E_FLOAT epairhalf = 0.5 * epair;
|
const E_FLOAT epairhalf = 0.5 * epair;
|
||||||
@ -3557,8 +3557,8 @@ void PairReaxFFKokkos<DeviceType>::e_tally(EV_FLOAT_REAX & /*ev*/, const int &i,
|
|||||||
|
|
||||||
|
|
||||||
if (eflag_atom) {
|
if (eflag_atom) {
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const E_FLOAT epairhalf = 0.5 * epair;
|
const E_FLOAT epairhalf = 0.5 * epair;
|
||||||
a_eatom[i] += epairhalf;
|
a_eatom[i] += epairhalf;
|
||||||
@ -3575,8 +3575,8 @@ void PairReaxFFKokkos<DeviceType>::e_tally_single(EV_FLOAT_REAX & /*ev*/, const
|
|||||||
const F_FLOAT &epair) const
|
const F_FLOAT &epair) const
|
||||||
{
|
{
|
||||||
// The eatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
a_eatom[i] += epair;
|
a_eatom[i] += epair;
|
||||||
}
|
}
|
||||||
@ -3609,8 +3609,8 @@ void PairReaxFFKokkos<DeviceType>::v_tally(EV_FLOAT_REAX &ev, const int &i,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (vflag_atom) {
|
if (vflag_atom) {
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
a_vatom(i,0) += v[0]; a_vatom(i,1) += v[1]; a_vatom(i,2) += v[2];
|
a_vatom(i,0) += v[0]; a_vatom(i,1) += v[1]; a_vatom(i,2) += v[2];
|
||||||
a_vatom(i,3) += v[3]; a_vatom(i,4) += v[4]; a_vatom(i,5) += v[5];
|
a_vatom(i,3) += v[3]; a_vatom(i,4) += v[4]; a_vatom(i,5) += v[5];
|
||||||
@ -3627,8 +3627,8 @@ void PairReaxFFKokkos<DeviceType>::v_tally3(EV_FLOAT_REAX &ev, const int &i, con
|
|||||||
{
|
{
|
||||||
|
|
||||||
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
F_FLOAT v[6];
|
F_FLOAT v[6];
|
||||||
|
|
||||||
@ -3689,8 +3689,8 @@ void PairReaxFFKokkos<DeviceType>::v_tally4(EV_FLOAT_REAX &ev, const int &i, con
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (vflag_atom) {
|
if (vflag_atom) {
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
a_vatom(i,0) += 0.25 * v[0]; a_vatom(i,1) += 0.25 * v[1]; a_vatom(i,2) += 0.25 * v[2];
|
a_vatom(i,0) += 0.25 * v[0]; a_vatom(i,1) += 0.25 * v[1]; a_vatom(i,2) += 0.25 * v[2];
|
||||||
a_vatom(i,3) += 0.25 * v[3]; a_vatom(i,4) += 0.25 * v[4]; a_vatom(i,5) += 0.25 * v[5];
|
a_vatom(i,3) += 0.25 * v[3]; a_vatom(i,4) += 0.25 * v[4]; a_vatom(i,5) += 0.25 * v[5];
|
||||||
|
|||||||
@ -387,25 +387,33 @@ class PairReaxFFKokkos : public PairReaxFF {
|
|||||||
typename AT::t_ffloat_2d_dl d_C1dbopi2, d_C2dbopi2, d_C3dbopi2, d_C4dbopi2;
|
typename AT::t_ffloat_2d_dl d_C1dbopi2, d_C2dbopi2, d_C3dbopi2, d_C4dbopi2;
|
||||||
typename AT::t_ffloat_2d_dl d_Cdbo, d_Cdbopi, d_Cdbopi2, d_dDeltap_self;
|
typename AT::t_ffloat_2d_dl d_Cdbo, d_Cdbopi, d_Cdbopi2, d_dDeltap_self;
|
||||||
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename DAT::t_float_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_total_bo;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename DAT::t_float_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_CdDelta;
|
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_eatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_vatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_dDeltap_self;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_Cdbo;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_Cdbopi;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_Cdbopi2;
|
|
||||||
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename DAT::t_float_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_total_bo;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename DAT::t_float_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_CdDelta;
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_eatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_f;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_vatom;
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_dDeltap_self;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_Cdbo;
|
DupScatterView<F_FLOAT*, typename DAT::t_float_1d::array_layout> dup_total_bo;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_Cdbopi;
|
DupScatterView<F_FLOAT*, typename DAT::t_float_1d::array_layout> dup_CdDelta;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_Cdbopi2;
|
DupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> dup_eatom;
|
||||||
|
DupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> dup_f;
|
||||||
|
DupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> dup_vatom;
|
||||||
|
DupScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout> dup_dDeltap_self;
|
||||||
|
DupScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout> dup_Cdbo;
|
||||||
|
DupScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout> dup_Cdbopi;
|
||||||
|
DupScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout> dup_Cdbopi2;
|
||||||
|
|
||||||
|
NonDupScatterView<F_FLOAT*, typename DAT::t_float_1d::array_layout> ndup_total_bo;
|
||||||
|
NonDupScatterView<F_FLOAT*, typename DAT::t_float_1d::array_layout> ndup_CdDelta;
|
||||||
|
NonDupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> ndup_eatom;
|
||||||
|
NonDupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> ndup_f;
|
||||||
|
NonDupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> ndup_vatom;
|
||||||
|
NonDupScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout> ndup_dDeltap_self;
|
||||||
|
NonDupScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout> ndup_Cdbo;
|
||||||
|
NonDupScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout> ndup_Cdbopi;
|
||||||
|
NonDupScatterView<F_FLOAT**, typename DAT::t_ffloat_2d_dl::array_layout> ndup_Cdbopi2;
|
||||||
|
|
||||||
int need_dup;
|
int need_dup;
|
||||||
|
|
||||||
|
|||||||
@ -297,10 +297,20 @@ inline double dist2(double* x,double* y);
|
|||||||
typename AT::t_int_1d_randomread type;
|
typename AT::t_int_1d_randomread type;
|
||||||
|
|
||||||
int need_dup;
|
int need_dup;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_vatom;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_vatom;
|
template<typename DataType, typename Layout>
|
||||||
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
|
|
||||||
|
template<typename DataType, typename Layout>
|
||||||
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> dup_f;
|
||||||
|
DupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> dup_vatom;
|
||||||
|
|
||||||
|
NonDupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> ndup_f;
|
||||||
|
NonDupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> ndup_vatom;
|
||||||
|
|
||||||
friend void pair_virial_fdotr_compute<PairSNAPKokkos>(PairSNAPKokkos*);
|
friend void pair_virial_fdotr_compute<PairSNAPKokkos>(PairSNAPKokkos*);
|
||||||
|
|
||||||
|
|||||||
@ -1257,8 +1257,8 @@ KOKKOS_INLINE_FUNCTION
|
|||||||
void PairSNAPKokkos<DeviceType, real_type, vector_length>::operator() (TagPairSNAPComputeForce<NEIGHFLAG,EVFLAG>, const int& ii, EV_FLOAT& ev) const {
|
void PairSNAPKokkos<DeviceType, real_type, vector_length>::operator() (TagPairSNAPComputeForce<NEIGHFLAG,EVFLAG>, const int& ii, EV_FLOAT& ev) const {
|
||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii + chunk_offset];
|
const int i = d_ilist[ii + chunk_offset];
|
||||||
|
|
||||||
@ -1358,8 +1358,8 @@ void PairSNAPKokkos<DeviceType, real_type, vector_length>::v_tally_xyz(EV_FLOAT
|
|||||||
{
|
{
|
||||||
// The vatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The vatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const E_FLOAT v0 = delx*fx;
|
const E_FLOAT v0 = delx*fx;
|
||||||
const E_FLOAT v1 = dely*fy;
|
const E_FLOAT v1 = dely*fy;
|
||||||
|
|||||||
@ -246,8 +246,8 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeHalf<NEIGHFLAG,EVFLAG>
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
F_FLOAT delr1[3],delr2[3],fj[3],fk[3];
|
F_FLOAT delr1[3],delr2[3],fj[3],fk[3];
|
||||||
F_FLOAT evdwl = 0.0;
|
F_FLOAT evdwl = 0.0;
|
||||||
@ -339,7 +339,7 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeHalf<NEIGHFLAG,EVFLAG>
|
|||||||
|
|
||||||
if (rsq2 >= d_params[ikparam].cutsq) continue;
|
if (rsq2 >= d_params[ikparam].cutsq) continue;
|
||||||
|
|
||||||
threebody(d_params[ijparam],d_params[ikparam],d_params[ijkparam],
|
threebody_kk(d_params[ijparam],d_params[ikparam],d_params[ijkparam],
|
||||||
rsq1,rsq2,delr1,delr2,fj,fk,eflag,evdwl);
|
rsq1,rsq2,delr1,delr2,fj,fk,eflag,evdwl);
|
||||||
|
|
||||||
fxtmpi -= fj[0] + fk[0];
|
fxtmpi -= fj[0] + fk[0];
|
||||||
@ -457,7 +457,7 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeFullA<NEIGHFLAG,EVFLAG
|
|||||||
|
|
||||||
if (rsq2 >= d_params[ikparam].cutsq) continue;
|
if (rsq2 >= d_params[ikparam].cutsq) continue;
|
||||||
|
|
||||||
threebody(d_params[ijparam],d_params[ikparam],d_params[ijkparam],
|
threebody_kk(d_params[ijparam],d_params[ikparam],d_params[ijkparam],
|
||||||
rsq1,rsq2,delr1,delr2,fj,fk,eflag,evdwl);
|
rsq1,rsq2,delr1,delr2,fj,fk,eflag,evdwl);
|
||||||
|
|
||||||
fxtmpi -= fj[0] + fk[0];
|
fxtmpi -= fj[0] + fk[0];
|
||||||
@ -542,7 +542,7 @@ void PairSWKokkos<DeviceType>::operator()(TagPairSWComputeFullB<NEIGHFLAG,EVFLAG
|
|||||||
if (rsq2 >= d_params[jkparam].cutsq) continue;
|
if (rsq2 >= d_params[jkparam].cutsq) continue;
|
||||||
|
|
||||||
if (vflag_atom)
|
if (vflag_atom)
|
||||||
threebody(d_params[jiparam],d_params[jkparam],d_params[jikparam],
|
threebody_kk(d_params[jiparam],d_params[jkparam],d_params[jikparam],
|
||||||
rsq1,rsq2,delr1,delr2,fj,fk,eflag,evdwl);
|
rsq1,rsq2,delr1,delr2,fj,fk,eflag,evdwl);
|
||||||
else
|
else
|
||||||
threebodyj(d_params[jiparam],d_params[jkparam],d_params[jikparam],
|
threebodyj(d_params[jiparam],d_params[jkparam],d_params[jikparam],
|
||||||
@ -686,7 +686,7 @@ void PairSWKokkos<DeviceType>::twobody(const Param& param, const F_FLOAT& rsq, F
|
|||||||
|
|
||||||
template<class DeviceType>
|
template<class DeviceType>
|
||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void PairSWKokkos<DeviceType>::threebody(const Param& paramij, const Param& paramik, const Param& paramijk,
|
void PairSWKokkos<DeviceType>::threebody_kk(const Param& paramij, const Param& paramik, const Param& paramijk,
|
||||||
const F_FLOAT& rsq1, const F_FLOAT& rsq2,
|
const F_FLOAT& rsq1, const F_FLOAT& rsq2,
|
||||||
F_FLOAT *delr1, F_FLOAT *delr2,
|
F_FLOAT *delr1, F_FLOAT *delr2,
|
||||||
F_FLOAT *fj, F_FLOAT *fk, const int& eflag, F_FLOAT& eng) const
|
F_FLOAT *fj, F_FLOAT *fk, const int& eflag, F_FLOAT& eng) const
|
||||||
@ -800,11 +800,11 @@ void PairSWKokkos<DeviceType>::ev_tally(EV_FLOAT &ev, const int &i, const int &j
|
|||||||
|
|
||||||
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
if (eflag_atom) {
|
if (eflag_atom) {
|
||||||
const E_FLOAT epairhalf = 0.5 * epair;
|
const E_FLOAT epairhalf = 0.5 * epair;
|
||||||
@ -878,11 +878,11 @@ void PairSWKokkos<DeviceType>::ev_tally3(EV_FLOAT &ev, const int &i, const int &
|
|||||||
|
|
||||||
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
if (eflag_atom) {
|
if (eflag_atom) {
|
||||||
epairthird = THIRD * (evdwl + ecoul);
|
epairthird = THIRD * (evdwl + ecoul);
|
||||||
|
|||||||
@ -118,8 +118,8 @@ class PairSWKokkos : public PairSW {
|
|||||||
void twobody(const Param&, const F_FLOAT&, F_FLOAT&, const int&, F_FLOAT&) const;
|
void twobody(const Param&, const F_FLOAT&, F_FLOAT&, const int&, F_FLOAT&) const;
|
||||||
|
|
||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void threebody(const Param&, const Param&, const Param&, const F_FLOAT&, const F_FLOAT&, F_FLOAT *, F_FLOAT *,
|
void threebody_kk(const Param&, const Param&, const Param&, const F_FLOAT&, const F_FLOAT&, F_FLOAT *, F_FLOAT *,
|
||||||
F_FLOAT *, F_FLOAT *, const int&, F_FLOAT&) const;
|
F_FLOAT *, F_FLOAT *, const int&, F_FLOAT&) const;
|
||||||
|
|
||||||
KOKKOS_INLINE_FUNCTION
|
KOKKOS_INLINE_FUNCTION
|
||||||
void threebodyj(const Param&, const Param&, const Param&, const F_FLOAT&, const F_FLOAT&, F_FLOAT *, F_FLOAT *,
|
void threebodyj(const Param&, const Param&, const Param&, const F_FLOAT&, const F_FLOAT&, F_FLOAT *, F_FLOAT *,
|
||||||
@ -136,12 +136,22 @@ class PairSWKokkos : public PairSW {
|
|||||||
typename AT::t_virial_array d_vatom;
|
typename AT::t_virial_array d_vatom;
|
||||||
|
|
||||||
int need_dup;
|
int need_dup;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_eatom;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_vatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_f;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_eatom;
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_vatom;
|
|
||||||
|
template<typename DataType, typename Layout>
|
||||||
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> dup_f;
|
||||||
|
DupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> dup_eatom;
|
||||||
|
DupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> dup_vatom;
|
||||||
|
|
||||||
|
NonDupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> ndup_f;
|
||||||
|
NonDupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> ndup_eatom;
|
||||||
|
NonDupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> ndup_vatom;
|
||||||
|
|
||||||
typename AT::t_int_1d_randomread d_type2frho;
|
typename AT::t_int_1d_randomread d_type2frho;
|
||||||
typename AT::t_int_2d_randomread d_type2rhor;
|
typename AT::t_int_2d_randomread d_type2rhor;
|
||||||
|
|||||||
@ -328,8 +328,8 @@ void PairTersoffKokkos<DeviceType>::operator()(TagPairTersoffComputeHalf<NEIGHFL
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
if (i >= nlocal) return;
|
if (i >= nlocal) return;
|
||||||
@ -1143,11 +1143,11 @@ void PairTersoffKokkos<DeviceType>::ev_tally(EV_FLOAT &ev, const int &i, const i
|
|||||||
|
|
||||||
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
if (eflag_atom) {
|
if (eflag_atom) {
|
||||||
const E_FLOAT epairhalf = 0.5 * epair;
|
const E_FLOAT epairhalf = 0.5 * epair;
|
||||||
@ -1211,8 +1211,8 @@ void PairTersoffKokkos<DeviceType>::v_tally3(EV_FLOAT &ev, const int &i, const i
|
|||||||
{
|
{
|
||||||
// The vatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The vatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
F_FLOAT v[6];
|
F_FLOAT v[6];
|
||||||
|
|
||||||
|
|||||||
@ -196,16 +196,26 @@ class PairTersoffKokkos : public PairTersoff {
|
|||||||
|
|
||||||
DAT::tdual_efloat_1d k_eatom;
|
DAT::tdual_efloat_1d k_eatom;
|
||||||
DAT::tdual_virial_array k_vatom;
|
DAT::tdual_virial_array k_vatom;
|
||||||
typename ArrayTypes<DeviceType>::t_efloat_1d d_eatom;
|
typename AT::t_efloat_1d d_eatom;
|
||||||
typename ArrayTypes<DeviceType>::t_virial_array d_vatom;
|
typename AT::t_virial_array d_vatom;
|
||||||
|
|
||||||
int need_dup;
|
int need_dup;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_eatom;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_vatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_f;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_eatom;
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_vatom;
|
|
||||||
|
template<typename DataType, typename Layout>
|
||||||
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> dup_f;
|
||||||
|
DupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> dup_eatom;
|
||||||
|
DupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> dup_vatom;
|
||||||
|
|
||||||
|
NonDupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> ndup_f;
|
||||||
|
NonDupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> ndup_eatom;
|
||||||
|
NonDupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> ndup_vatom;
|
||||||
|
|
||||||
typedef Kokkos::DualView<F_FLOAT**[7],Kokkos::LayoutRight,DeviceType> tdual_ffloat_2d_n7;
|
typedef Kokkos::DualView<F_FLOAT**[7],Kokkos::LayoutRight,DeviceType> tdual_ffloat_2d_n7;
|
||||||
typedef typename tdual_ffloat_2d_n7::t_dev_const_randomread t_ffloat_2d_n7_randomread;
|
typedef typename tdual_ffloat_2d_n7::t_dev_const_randomread t_ffloat_2d_n7_randomread;
|
||||||
|
|||||||
@ -328,8 +328,8 @@ void PairTersoffMODKokkos<DeviceType>::operator()(TagPairTersoffMODComputeHalf<N
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
if (i >= nlocal) return;
|
if (i >= nlocal) return;
|
||||||
@ -1146,11 +1146,11 @@ void PairTersoffMODKokkos<DeviceType>::ev_tally(EV_FLOAT &ev, const int &i, cons
|
|||||||
|
|
||||||
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
if (eflag_atom) {
|
if (eflag_atom) {
|
||||||
const E_FLOAT epairhalf = 0.5 * epair;
|
const E_FLOAT epairhalf = 0.5 * epair;
|
||||||
@ -1214,8 +1214,8 @@ void PairTersoffMODKokkos<DeviceType>::v_tally3(EV_FLOAT &ev, const int &i, cons
|
|||||||
{
|
{
|
||||||
// The vatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The vatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
F_FLOAT v[6];
|
F_FLOAT v[6];
|
||||||
|
|
||||||
|
|||||||
@ -181,6 +181,8 @@ class PairTersoffMODKokkos : public PairTersoffMOD {
|
|||||||
void setup_params() override;
|
void setup_params() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
|
|
||||||
typedef Kokkos::DualView<int***,DeviceType> tdual_int_3d;
|
typedef Kokkos::DualView<int***,DeviceType> tdual_int_3d;
|
||||||
Kokkos::DualView<params_ters***,Kokkos::LayoutRight,DeviceType> k_params;
|
Kokkos::DualView<params_ters***,Kokkos::LayoutRight,DeviceType> k_params;
|
||||||
typename Kokkos::DualView<params_ters***,
|
typename Kokkos::DualView<params_ters***,
|
||||||
@ -196,16 +198,24 @@ class PairTersoffMODKokkos : public PairTersoffMOD {
|
|||||||
|
|
||||||
DAT::tdual_efloat_1d k_eatom;
|
DAT::tdual_efloat_1d k_eatom;
|
||||||
DAT::tdual_virial_array k_vatom;
|
DAT::tdual_virial_array k_vatom;
|
||||||
typename ArrayTypes<DeviceType>::t_efloat_1d d_eatom;
|
typename AT::t_efloat_1d d_eatom;
|
||||||
typename ArrayTypes<DeviceType>::t_virial_array d_vatom;
|
typename AT::t_virial_array d_vatom;
|
||||||
|
|
||||||
int need_dup;
|
int need_dup;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_eatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_vatom;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_f;
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_eatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_vatom;
|
template<typename DataType, typename Layout>
|
||||||
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> dup_f;
|
||||||
|
DupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> dup_eatom;
|
||||||
|
DupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> dup_vatom;
|
||||||
|
NonDupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> ndup_f;
|
||||||
|
NonDupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> ndup_eatom;
|
||||||
|
NonDupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> ndup_vatom;
|
||||||
|
|
||||||
typedef Kokkos::DualView<F_FLOAT**[7],Kokkos::LayoutRight,DeviceType> tdual_ffloat_2d_n7;
|
typedef Kokkos::DualView<F_FLOAT**[7],Kokkos::LayoutRight,DeviceType> tdual_ffloat_2d_n7;
|
||||||
typedef typename tdual_ffloat_2d_n7::t_dev_const_randomread t_ffloat_2d_n7_randomread;
|
typedef typename tdual_ffloat_2d_n7::t_dev_const_randomread t_ffloat_2d_n7_randomread;
|
||||||
|
|||||||
@ -342,8 +342,8 @@ void PairTersoffZBLKokkos<DeviceType>::operator()(TagPairTersoffZBLComputeHalf<N
|
|||||||
|
|
||||||
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The f array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_f = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
auto v_f = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_f),decltype(ndup_f)>::get(dup_f,ndup_f);
|
||||||
auto a_f = v_f.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_f = v_f.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
const int i = d_ilist[ii];
|
const int i = d_ilist[ii];
|
||||||
if (i >= nlocal) return;
|
if (i >= nlocal) return;
|
||||||
@ -1240,11 +1240,11 @@ void PairTersoffZBLKokkos<DeviceType>::ev_tally(EV_FLOAT &ev, const int &i, cons
|
|||||||
|
|
||||||
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The eatom and vatom arrays are duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_eatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
auto v_eatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_eatom),decltype(ndup_eatom)>::get(dup_eatom,ndup_eatom);
|
||||||
auto a_eatom = v_eatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_eatom = v_eatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
if (eflag_atom) {
|
if (eflag_atom) {
|
||||||
const E_FLOAT epairhalf = 0.5 * epair;
|
const E_FLOAT epairhalf = 0.5 * epair;
|
||||||
@ -1308,8 +1308,8 @@ void PairTersoffZBLKokkos<DeviceType>::v_tally3(EV_FLOAT &ev, const int &i, cons
|
|||||||
{
|
{
|
||||||
// The vatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
// The vatom array is duplicated for OpenMP, atomic for CUDA, and neither for Serial
|
||||||
|
|
||||||
auto v_vatom = ScatterViewHelper<typename NeedDup<NEIGHFLAG,DeviceType>::value,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
auto v_vatom = ScatterViewHelper<NeedDup_v<NEIGHFLAG,DeviceType>,decltype(dup_vatom),decltype(ndup_vatom)>::get(dup_vatom,ndup_vatom);
|
||||||
auto a_vatom = v_vatom.template access<typename AtomicDup<NEIGHFLAG,DeviceType>::value>();
|
auto a_vatom = v_vatom.template access<AtomicDup_v<NEIGHFLAG,DeviceType>>();
|
||||||
|
|
||||||
F_FLOAT v[6];
|
F_FLOAT v[6];
|
||||||
|
|
||||||
|
|||||||
@ -201,24 +201,34 @@ class PairTersoffZBLKokkos : public PairTersoffZBL {
|
|||||||
|
|
||||||
DAT::tdual_efloat_1d k_eatom;
|
DAT::tdual_efloat_1d k_eatom;
|
||||||
DAT::tdual_virial_array k_vatom;
|
DAT::tdual_virial_array k_vatom;
|
||||||
typename ArrayTypes<DeviceType>::t_efloat_1d d_eatom;
|
typename AT::t_efloat_1d d_eatom;
|
||||||
typename ArrayTypes<DeviceType>::t_virial_array d_vatom;
|
typename AT::t_virial_array d_vatom;
|
||||||
|
|
||||||
int need_dup;
|
int need_dup;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_f;
|
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_eatom;
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterDuplicated> dup_vatom;
|
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_f;
|
template<typename DataType, typename Layout>
|
||||||
Kokkos::Experimental::ScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_eatom;
|
using DupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterDuplicated>;
|
||||||
Kokkos::Experimental::ScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout,typename KKDevice<DeviceType>::value,typename Kokkos::Experimental::ScatterSum,Kokkos::Experimental::ScatterNonDuplicated> ndup_vatom;
|
|
||||||
|
template<typename DataType, typename Layout>
|
||||||
|
using NonDupScatterView = KKScatterView<DataType, Layout, KKDeviceType, KKScatterSum, KKScatterNonDuplicated>;
|
||||||
|
|
||||||
|
DupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> dup_f;
|
||||||
|
DupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> dup_eatom;
|
||||||
|
DupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> dup_vatom;
|
||||||
|
|
||||||
|
NonDupScatterView<F_FLOAT*[3], typename DAT::t_f_array::array_layout> ndup_f;
|
||||||
|
NonDupScatterView<E_FLOAT*, typename DAT::t_efloat_1d::array_layout> ndup_eatom;
|
||||||
|
NonDupScatterView<F_FLOAT*[6], typename DAT::t_virial_array::array_layout> ndup_vatom;
|
||||||
|
|
||||||
typedef Kokkos::DualView<F_FLOAT**[7],Kokkos::LayoutRight,DeviceType> tdual_ffloat_2d_n7;
|
typedef Kokkos::DualView<F_FLOAT**[7],Kokkos::LayoutRight,DeviceType> tdual_ffloat_2d_n7;
|
||||||
typedef typename tdual_ffloat_2d_n7::t_dev_const_randomread t_ffloat_2d_n7_randomread;
|
typedef typename tdual_ffloat_2d_n7::t_dev_const_randomread t_ffloat_2d_n7_randomread;
|
||||||
typedef typename tdual_ffloat_2d_n7::t_host t_host_ffloat_2d_n7;
|
typedef typename tdual_ffloat_2d_n7::t_host t_host_ffloat_2d_n7;
|
||||||
|
|
||||||
typename ArrayTypes<DeviceType>::t_neighbors_2d d_neighbors;
|
typename AT::t_neighbors_2d d_neighbors;
|
||||||
typename ArrayTypes<DeviceType>::t_int_1d_randomread d_ilist;
|
typename AT::t_int_1d_randomread d_ilist;
|
||||||
typename ArrayTypes<DeviceType>::t_int_1d_randomread d_numneigh;
|
typename AT::t_int_1d_randomread d_numneigh;
|
||||||
//NeighListKokkos<DeviceType> k_list;
|
//NeighListKokkos<DeviceType> k_list;
|
||||||
|
|
||||||
int neighflag,newton_pair;
|
int neighflag,newton_pair;
|
||||||
|
|||||||
@ -69,9 +69,11 @@ public:
|
|||||||
using complex = SNAComplex<real_type>;
|
using complex = SNAComplex<real_type>;
|
||||||
static constexpr int vector_length = vector_length_;
|
static constexpr int vector_length = vector_length_;
|
||||||
|
|
||||||
|
using KKDeviceType = typename KKDevice<DeviceType>::value;
|
||||||
|
|
||||||
typedef Kokkos::View<int*, DeviceType> t_sna_1i;
|
typedef Kokkos::View<int*, DeviceType> t_sna_1i;
|
||||||
typedef Kokkos::View<real_type*, DeviceType> t_sna_1d;
|
typedef Kokkos::View<real_type*, DeviceType> t_sna_1d;
|
||||||
typedef Kokkos::View<real_type*, typename KKDevice<DeviceType>::value, Kokkos::MemoryTraits<Kokkos::Atomic> > t_sna_1d_atomic;
|
typedef Kokkos::View<real_type*, KKDeviceType, Kokkos::MemoryTraits<Kokkos::Atomic>> t_sna_1d_atomic;
|
||||||
typedef Kokkos::View<int**, DeviceType> t_sna_2i;
|
typedef Kokkos::View<int**, DeviceType> t_sna_2i;
|
||||||
typedef Kokkos::View<real_type**, DeviceType> t_sna_2d;
|
typedef Kokkos::View<real_type**, DeviceType> t_sna_2d;
|
||||||
typedef Kokkos::View<real_type**, Kokkos::LayoutLeft, DeviceType> t_sna_2d_ll;
|
typedef Kokkos::View<real_type**, Kokkos::LayoutLeft, DeviceType> t_sna_2d_ll;
|
||||||
@ -83,7 +85,7 @@ public:
|
|||||||
typedef Kokkos::View<real_type*****, DeviceType> t_sna_5d;
|
typedef Kokkos::View<real_type*****, DeviceType> t_sna_5d;
|
||||||
|
|
||||||
typedef Kokkos::View<complex*, DeviceType> t_sna_1c;
|
typedef Kokkos::View<complex*, DeviceType> t_sna_1c;
|
||||||
typedef Kokkos::View<complex*, typename KKDevice<DeviceType>::value, Kokkos::MemoryTraits<Kokkos::Atomic> > t_sna_1c_atomic;
|
typedef Kokkos::View<complex*, KKDeviceType, Kokkos::MemoryTraits<Kokkos::Atomic>> t_sna_1c_atomic;
|
||||||
typedef Kokkos::View<complex**, DeviceType> t_sna_2c;
|
typedef Kokkos::View<complex**, DeviceType> t_sna_2c;
|
||||||
typedef Kokkos::View<complex**, Kokkos::LayoutLeft, DeviceType> t_sna_2c_ll;
|
typedef Kokkos::View<complex**, Kokkos::LayoutLeft, DeviceType> t_sna_2c_ll;
|
||||||
typedef Kokkos::View<complex**, Kokkos::LayoutRight, DeviceType> t_sna_2c_lr;
|
typedef Kokkos::View<complex**, Kokkos::LayoutRight, DeviceType> t_sna_2c_lr;
|
||||||
|
|||||||
Reference in New Issue
Block a user