WIP
This commit is contained in:
@ -250,7 +250,7 @@ void FixQEqReaxKokkos<DeviceType>::pre_force(int vflag)
|
||||
k_t.template sync<DeviceType>();
|
||||
|
||||
if (neighflag != FULL)
|
||||
red_o = Kokkos::Experimental::create_scatter_view<> (d_o); // allocate duplicated memory
|
||||
red_o = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value> (d_o); // allocate duplicated memory
|
||||
|
||||
// 1st cg solve over b_s, s
|
||||
cg_solve1();
|
||||
|
||||
@ -22,7 +22,6 @@ FixStyle(qeq/reax/kk/host,FixQEqReaxKokkos<LMPHostType>)
|
||||
#ifndef LMP_FIX_QEQ_REAX_KOKKOS_H
|
||||
#define LMP_FIX_QEQ_REAX_KOKKOS_H
|
||||
|
||||
#include <Kokkos_ScatterView.hpp>
|
||||
#include "fix_qeq_reax.h"
|
||||
#include "kokkos_type.h"
|
||||
#include "neigh_list.h"
|
||||
@ -193,7 +192,7 @@ class FixQEqReaxKokkos : public FixQEqReax {
|
||||
HAT::t_ffloat_2d h_s_hist, h_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, DeviceType> red_o;
|
||||
Kokkos::Experimental::ScatterView<F_FLOAT*, typename AT::t_ffloat_1d::array_layout,DeviceType,Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value> red_o;
|
||||
|
||||
void init_shielding_k();
|
||||
void init_hist();
|
||||
|
||||
@ -20,6 +20,9 @@
|
||||
#include <Kokkos_DualView.hpp>
|
||||
#include <impl/Kokkos_Timer.hpp>
|
||||
#include <Kokkos_Vectorization.hpp>
|
||||
#include <Kokkos_ScatterView.hpp>
|
||||
|
||||
enum{FULL=1u,HALFTHREAD=2u,HALF=4u,N2=8u}; // same as in neigh_list_kokkos.h
|
||||
|
||||
#if defined(KOKKOS_HAVE_CXX11)
|
||||
#undef ISFINITE
|
||||
@ -205,6 +208,77 @@ struct ExecutionSpaceFromDevice<Kokkos::Cuda> {
|
||||
};
|
||||
#endif
|
||||
|
||||
|
||||
// Determine memory traits for force array
|
||||
// Do atomic trait when running HALFTHREAD neighbor list style
|
||||
template<int NEIGHFLAG>
|
||||
struct AtomicF {
|
||||
enum {value = Kokkos::Unmanaged};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct AtomicF<HALFTHREAD> {
|
||||
enum {value = Kokkos::Atomic|Kokkos::Unmanaged};
|
||||
};
|
||||
|
||||
// Determine memory traits for force array
|
||||
// Do atomic trait when running HALFTHREAD neighbor list style with CUDA
|
||||
template<int NEIGHFLAG, class DeviceType>
|
||||
struct AtomicDup {
|
||||
enum {value = Kokkos::Experimental::ScatterNonAtomic};
|
||||
};
|
||||
|
||||
#ifdef KOKKOS_ENABLE_CUDA
|
||||
template<>
|
||||
struct AtomicDup<HALFTHREAD,Kokkos::Cuda> {
|
||||
enum {value = Kokkos::Experimental::ScatterAtomic};
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef LMP_KOKKOS_USE_ATOMICS
|
||||
|
||||
#ifdef KOKKOS_ENABLE_OPENMP
|
||||
template<>
|
||||
struct AtomicDup<HALFTHREAD,Kokkos::OpenMP> {
|
||||
enum {value = Kokkos::Experimental::ScatterAtomic};
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef KOKKOS_ENABLE_THREADS
|
||||
template<>
|
||||
struct AtomicDup<HALFTHREAD,Kokkos::Threads> {
|
||||
enum {value = Kokkos::Experimental::ScatterAtomic};
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
// Determine duplication traits for force array
|
||||
// Use duplication when running threaded and not using atomics
|
||||
template<class DeviceType>
|
||||
struct DupF {
|
||||
enum {value = Kokkos::Experimental::ScatterNonDuplicated};
|
||||
};
|
||||
|
||||
#ifndef LMP_KOKKOS_USE_ATOMICS
|
||||
|
||||
#ifdef KOKKOS_ENABLE_OPENMP
|
||||
template<>
|
||||
struct DupF<Kokkos::OpenMP> {
|
||||
enum {value = Kokkos::Experimental::ScatterDuplicated};
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef KOKKOS_ENABLE_THREADS
|
||||
template<>
|
||||
struct DupF<Kokkos::Threads> {
|
||||
enum {value = Kokkos::Experimental::ScatterDuplicated};
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
// define precision
|
||||
// handle global precision, force, energy, positions, kspace separately
|
||||
|
||||
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
namespace LAMMPS_NS {
|
||||
|
||||
enum{FULL=1u,HALFTHREAD=2u,HALF=4u,N2=8u};
|
||||
enum{FULL=1u,HALFTHREAD=2u,HALF=4u,N2=8u}; // same as in kokkos_type.h
|
||||
|
||||
class AtomNeighbors
|
||||
{
|
||||
|
||||
@ -48,76 +48,6 @@ struct DoCoul<1> {
|
||||
typedef CoulTag type;
|
||||
};
|
||||
|
||||
// Determine memory traits for force array
|
||||
// Do atomic trait when running HALFTHREAD neighbor list style
|
||||
template<int NEIGHFLAG>
|
||||
struct AtomicF {
|
||||
enum {value = Kokkos::Unmanaged};
|
||||
};
|
||||
|
||||
template<>
|
||||
struct AtomicF<HALFTHREAD> {
|
||||
enum {value = Kokkos::Atomic|Kokkos::Unmanaged};
|
||||
};
|
||||
|
||||
// Determine memory traits for force array
|
||||
// Do atomic trait when running HALFTHREAD neighbor list style with CUDA
|
||||
template<int NEIGHFLAG, class DeviceType>
|
||||
struct AtomicDup {
|
||||
enum {value = Kokkos::Experimental::ScatterNonAtomic};
|
||||
};
|
||||
|
||||
#ifdef KOKKOS_ENABLE_CUDA
|
||||
template<>
|
||||
struct AtomicDup<HALFTHREAD,Kokkos::Cuda> {
|
||||
enum {value = Kokkos::Experimental::ScatterAtomic};
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef LMP_KOKKOS_USE_ATOMICS
|
||||
|
||||
#ifdef KOKKOS_ENABLE_OPENMP
|
||||
template<>
|
||||
struct AtomicDup<HALFTHREAD,Kokkos::OpenMP> {
|
||||
enum {value = Kokkos::Experimental::ScatterAtomic};
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef KOKKOS_ENABLE_THREADS
|
||||
template<>
|
||||
struct AtomicDup<HALFTHREAD,Kokkos::Threads> {
|
||||
enum {value = Kokkos::Experimental::ScatterAtomic};
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
// Determine duplication traits for force array
|
||||
// Use duplication when running threaded and not using atomics
|
||||
template<class DeviceType>
|
||||
struct DupF {
|
||||
enum {value = Kokkos::Experimental::ScatterNonDuplicated};
|
||||
};
|
||||
|
||||
#ifndef LMP_KOKKOS_USE_ATOMICS
|
||||
|
||||
#ifdef KOKKOS_ENABLE_OPENMP
|
||||
template<>
|
||||
struct DupF<Kokkos::OpenMP> {
|
||||
enum {value = Kokkos::Experimental::ScatterDuplicated};
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef KOKKOS_ENABLE_THREADS
|
||||
template<>
|
||||
struct DupF<Kokkos::Threads> {
|
||||
enum {value = Kokkos::Experimental::ScatterDuplicated};
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
//Specialisation for Neighborlist types Half, HalfThread, Full
|
||||
template <class PairStyle, int NEIGHFLAG, bool STACKPARAMS, class Specialisation = void>
|
||||
|
||||
@ -723,9 +723,9 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
|
||||
d_ilist = k_list->d_ilist;
|
||||
|
||||
// allocate duplicated memory
|
||||
dup_f = Kokkos::Experimental::create_scatter_view<>(f);
|
||||
dup_eatom = Kokkos::Experimental::create_scatter_view<>(v_eatom);
|
||||
dup_vatom = Kokkos::Experimental::create_scatter_view<>(v_vatom);
|
||||
dup_f = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(f);
|
||||
dup_eatom = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(v_eatom);
|
||||
dup_vatom = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(v_vatom);
|
||||
|
||||
if (eflag_global) {
|
||||
for (int i = 0; i < 14; i++)
|
||||
@ -797,8 +797,8 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
|
||||
}
|
||||
|
||||
// allocate duplicated memory
|
||||
dup_dDeltap_self = Kokkos::Experimental::create_scatter_view<>(d_dDeltap_self);
|
||||
dup_total_bo = Kokkos::Experimental::create_scatter_view<>(d_total_bo);
|
||||
dup_dDeltap_self = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(d_dDeltap_self);
|
||||
dup_total_bo = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(d_total_bo);
|
||||
|
||||
// Neighbor lists for bond and hbond
|
||||
|
||||
@ -840,16 +840,16 @@ void PairReaxCKokkos<DeviceType>::compute(int eflag_in, int vflag_in)
|
||||
resize = resize_bo || resize_hb;
|
||||
if (resize) {
|
||||
allocate_array();
|
||||
dup_dDeltap_self = Kokkos::Experimental::create_scatter_view<>(d_dDeltap_self);
|
||||
dup_total_bo = Kokkos::Experimental::create_scatter_view<>(d_total_bo);
|
||||
dup_dDeltap_self = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(d_dDeltap_self);
|
||||
dup_total_bo = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(d_total_bo);
|
||||
}
|
||||
}
|
||||
|
||||
// allocate duplicated memory
|
||||
dup_CdDelta = Kokkos::Experimental::create_scatter_view<>(d_CdDelta);
|
||||
//dup_Cdbo = Kokkos::Experimental::create_scatter_view<>(d_Cdbo);
|
||||
//dup_Cdbopi = Kokkos::Experimental::create_scatter_view<>(d_Cdbopi);
|
||||
//dup_Cdbopi2 = Kokkos::Experimental::create_scatter_view<>(d_Cdbopi2);
|
||||
dup_CdDelta = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(d_CdDelta);
|
||||
//dup_Cdbo = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(d_Cdbo);
|
||||
//dup_Cdbopi = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(d_Cdbopi);
|
||||
//dup_Cdbopi2 = Kokkos::Experimental::create_scatter_view<Kokkos::Experimental::ScatterSum,DupF<DeviceType>::value>(d_Cdbopi2);
|
||||
|
||||
// reduction over duplicated memory
|
||||
Kokkos::Experimental::contribute(d_total_bo, dup_total_bo); // needed in BondOrder1
|
||||
|
||||
@ -24,7 +24,6 @@ PairStyle(reax/c/kk/host,PairReaxCKokkos<LMPHostType>)
|
||||
#define LMP_PAIR_REAXC_KOKKOS_H
|
||||
|
||||
#include <stdio.h>
|
||||
#include <Kokkos_ScatterView.hpp>
|
||||
#include "pair_kokkos.h"
|
||||
#include "pair_reaxc.h"
|
||||
#include "neigh_list_kokkos.h"
|
||||
|
||||
Reference in New Issue
Block a user