Fixing Kokkos execution space issue with regions

This commit is contained in:
Stan Moore
2017-07-25 13:37:01 -06:00
parent 633ca33f2f
commit 557e5b964a
8 changed files with 134 additions and 11 deletions

View File

@ -89,8 +89,10 @@ void FixSetForceKokkos<DeviceType>::post_force(int vflag)
if (iregion >= 0) {
region = domain->regions[iregion];
region->prematch();
d_match = DAT::t_int_1d("setforce:d_match",nlocal);
region->match_all_kokkos(groupbit,d_match);
DAT::tdual_int_1d k_match = DAT::tdual_int_1d("setforce:k_match",nlocal);
region->match_all_kokkos(groupbit,k_match);
k_match.template sync<DeviceType>();
d_match = k_match.template view<DeviceType>();
}
// reallocate sforce array if necessary

View File

@ -75,8 +75,8 @@ class FixSetForceKokkos : public FixSetForce {
private:
DAT::tdual_ffloat_2d k_sforce;
DAT::t_ffloat_2d_randomread d_sforce;
DAT::t_int_1d d_match;
typename AT::t_ffloat_2d_randomread d_sforce;
typename AT::t_int_1d d_match;
typename AT::t_x_array_randomread x;
typename AT::t_f_array f;

119
src/KOKKOS/out.txt Normal file
View File

@ -0,0 +1,119 @@
atom_vec_angle_kokkos.cpp: k_count.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: if (mask & X_MASK) atomKK->k_x.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: if (mask & V_MASK) atomKK->k_v.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: if (mask & F_MASK) atomKK->k_f.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: if (mask & TAG_MASK) atomKK->k_tag.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: if (mask & TYPE_MASK) atomKK->k_type.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: if (mask & MASK_MASK) atomKK->k_mask.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: if (mask & IMAGE_MASK) atomKK->k_image.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: if (mask & MOLECULE_MASK) atomKK->k_molecule.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: atomKK->k_nspecial.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: atomKK->k_special.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: atomKK->k_num_bond.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: atomKK->k_bond_type.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: atomKK->k_bond_atom.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: atomKK->k_num_angle.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: atomKK->k_angle_type.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: atomKK->k_angle_atom1.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: atomKK->k_angle_atom2.modify<LMPDeviceType>();
atom_vec_angle_kokkos.cpp: atomKK->k_angle_atom3.modify<LMPDeviceType>();
atom_vec_atomic_kokkos.cpp: k_count.modify<LMPDeviceType>();
atom_vec_atomic_kokkos.cpp: if (mask & X_MASK) atomKK->k_x.modify<LMPDeviceType>();
atom_vec_atomic_kokkos.cpp: if (mask & V_MASK) atomKK->k_v.modify<LMPDeviceType>();
atom_vec_atomic_kokkos.cpp: if (mask & F_MASK) atomKK->k_f.modify<LMPDeviceType>();
atom_vec_atomic_kokkos.cpp: if (mask & TAG_MASK) atomKK->k_tag.modify<LMPDeviceType>();
atom_vec_atomic_kokkos.cpp: if (mask & TYPE_MASK) atomKK->k_type.modify<LMPDeviceType>();
atom_vec_atomic_kokkos.cpp: if (mask & MASK_MASK) atomKK->k_mask.modify<LMPDeviceType>();
atom_vec_atomic_kokkos.cpp: if (mask & IMAGE_MASK) atomKK->k_image.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: k_count.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: if (mask & X_MASK) atomKK->k_x.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: if (mask & V_MASK) atomKK->k_v.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: if (mask & F_MASK) atomKK->k_f.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: if (mask & TAG_MASK) atomKK->k_tag.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: if (mask & TYPE_MASK) atomKK->k_type.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: if (mask & MASK_MASK) atomKK->k_mask.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: if (mask & IMAGE_MASK) atomKK->k_image.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: if (mask & MOLECULE_MASK) atomKK->k_molecule.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: atomKK->k_nspecial.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: atomKK->k_special.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: atomKK->k_num_bond.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: atomKK->k_bond_type.modify<LMPDeviceType>();
atom_vec_bond_kokkos.cpp: atomKK->k_bond_atom.modify<LMPDeviceType>();
atom_vec_charge_kokkos.cpp: k_count.modify<LMPDeviceType>();
atom_vec_charge_kokkos.cpp: if (mask & X_MASK) atomKK->k_x.modify<LMPDeviceType>();
atom_vec_charge_kokkos.cpp: if (mask & V_MASK) atomKK->k_v.modify<LMPDeviceType>();
atom_vec_charge_kokkos.cpp: if (mask & F_MASK) atomKK->k_f.modify<LMPDeviceType>();
atom_vec_charge_kokkos.cpp: if (mask & TAG_MASK) atomKK->k_tag.modify<LMPDeviceType>();
atom_vec_charge_kokkos.cpp: if (mask & TYPE_MASK) atomKK->k_type.modify<LMPDeviceType>();
atom_vec_charge_kokkos.cpp: if (mask & MASK_MASK) atomKK->k_mask.modify<LMPDeviceType>();
atom_vec_charge_kokkos.cpp: if (mask & IMAGE_MASK) atomKK->k_image.modify<LMPDeviceType>();
atom_vec_charge_kokkos.cpp: if (mask & Q_MASK) atomKK->k_q.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: k_count.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: if (mask & X_MASK) atomKK->k_x.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: if (mask & V_MASK) atomKK->k_v.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: if (mask & F_MASK) atomKK->k_f.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: if (mask & TAG_MASK) atomKK->k_tag.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: if (mask & TYPE_MASK) atomKK->k_type.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: if (mask & MASK_MASK) atomKK->k_mask.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: if (mask & IMAGE_MASK) atomKK->k_image.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: if (mask & Q_MASK) atomKK->k_q.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: if (mask & MOLECULE_MASK) atomKK->k_molecule.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_nspecial.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_special.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_num_bond.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_bond_type.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_bond_atom.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_num_angle.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_angle_type.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_angle_atom1.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_angle_atom2.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_angle_atom3.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_num_dihedral.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_dihedral_type.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_dihedral_atom1.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_dihedral_atom2.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_dihedral_atom3.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_dihedral_atom4.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_num_improper.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_improper_type.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_improper_atom1.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_improper_atom2.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_improper_atom3.modify<LMPDeviceType>();
atom_vec_full_kokkos.cpp: atomKK->k_improper_atom4.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: k_count.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: if (mask & X_MASK) atomKK->k_x.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: if (mask & V_MASK) atomKK->k_v.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: if (mask & F_MASK) atomKK->k_f.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: if (mask & TAG_MASK) atomKK->k_tag.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: if (mask & TYPE_MASK) atomKK->k_type.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: if (mask & MASK_MASK) atomKK->k_mask.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: if (mask & IMAGE_MASK) atomKK->k_image.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: if (mask & MOLECULE_MASK) atomKK->k_molecule.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_nspecial.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_special.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_num_bond.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_bond_type.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_bond_atom.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_num_angle.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_angle_type.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_angle_atom1.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_angle_atom2.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_angle_atom3.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_num_dihedral.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_dihedral_type.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_dihedral_atom1.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_dihedral_atom2.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_dihedral_atom3.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_dihedral_atom4.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_num_improper.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_improper_type.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_improper_atom1.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_improper_atom2.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_improper_atom3.modify<LMPDeviceType>();
atom_vec_molecular_kokkos.cpp: atomKK->k_improper_atom4.modify<LMPDeviceType>();
comm_kokkos.cpp: k_buf_send.modify<LMPDeviceType>();
neighbor_kokkos.cpp: k_bondlist.modify<LMPDeviceType>();
neighbor_kokkos.cpp: k_anglelist.modify<LMPDeviceType>();
neighbor_kokkos.cpp: k_dihedrallist.modify<LMPDeviceType>();
neighbor_kokkos.cpp: k_improperlist.modify<LMPDeviceType>();
verlet_kokkos.cpp: atomKK->k_f.modify<LMPDeviceType>();

View File

@ -54,10 +54,10 @@ int RegBlockKokkos<DeviceType>::k_inside(double x, double y, double z) const
}
template<class DeviceType>
void RegBlockKokkos<DeviceType>::match_all_kokkos(int groupbit_in, DAT::t_int_1d d_match_in)
void RegBlockKokkos<DeviceType>::match_all_kokkos(int groupbit_in, DAT::tdual_int_1d k_match_in)
{
groupbit = groupbit_in;
d_match = d_match_in;
d_match = k_match_in.template view<DeviceType>();
atomKK->sync(Device, X_MASK | MASK_MASK);
@ -69,6 +69,8 @@ void RegBlockKokkos<DeviceType>::match_all_kokkos(int groupbit_in, DAT::t_int_1d
Kokkos::parallel_for(Kokkos::RangePolicy<DeviceType, TagRegBlockMatchAll>(0,nlocal),*this);
DeviceType::fence();
copymode = 0;
k_match_in.template modify<DeviceType>();
}
template<class DeviceType>

View File

@ -39,14 +39,14 @@ class RegBlockKokkos : public RegBlock {
RegBlockKokkos(class LAMMPS *, int, char **);
~RegBlockKokkos();
void match_all_kokkos(int, DAT::t_int_1d);
void match_all_kokkos(int, DAT::tdual_int_1d);
KOKKOS_INLINE_FUNCTION
void operator()(TagRegBlockMatchAll, const int&) const;
private:
int groupbit;
DAT::t_int_1d d_match;
typename AT::t_int_1d d_match;
typename AT::t_x_array_randomread x;
typename AT::t_int_1d_randomread mask;

View File

@ -99,7 +99,7 @@ class DAT {
public:
typedef double tdual_xfloat_1d;
typedef double tdual_FFT_SCALAR_1d;
typedef int t_int_1d;
typedef int tdual_int_1d;
typedef int tdual_int_2d;
};

View File

@ -146,7 +146,7 @@ int Region::match(double x, double y, double z)
generate error if Kokkos function defaults to base class
------------------------------------------------------------------------- */
void Region::match_all_kokkos(int, DAT::t_int_1d)
void Region::match_all_kokkos(int, DAT::tdual_int_1d)
{
error->all(FLERR,"Can only use Kokkos supported regions with Kokkos package");
}

View File

@ -99,7 +99,7 @@ class Region : protected Pointers {
// Kokkos function, implemented by each Kokkos region
virtual void match_all_kokkos(int, DAT::t_int_1d);
virtual void match_all_kokkos(int, DAT::tdual_int_1d);
protected:
void add_contact(int, double *, double, double, double);