Commit 71e06460 authored by Steve Plimpton's avatar Steve Plimpton
Browse files

Merge branch 'gridcomm-tiled' of github.com:lammps/lammps into gridcomm-tiled

parents eb78f884 f1afa45b
Loading
Loading
Loading
Loading
+581 −266

File changed.

Preview size limit exceeded, changes collapsed.

+44 −64
Original line number Diff line number Diff line
@@ -14,83 +14,63 @@
#ifndef LMP_GRIDCOMM_KOKKOS_H
#define LMP_GRIDCOMM_KOKKOS_H

#include "pointers.h"
#include "gridcomm.h"
#include "kokkos_type.h"
#include "fftdata_kokkos.h"

#ifdef FFT_SINGLE
typedef float FFT_SCALAR;
#define MPI_FFT_SCALAR MPI_FLOAT
#else
typedef double FFT_SCALAR;
#define MPI_FFT_SCALAR MPI_DOUBLE
#endif

namespace LAMMPS_NS {

template<class DeviceType>
class GridCommKokkos : protected Pointers {
class GridCommKokkos : public GridComm {
 public:
  typedef DeviceType device_type;
  typedef ArrayTypes<DeviceType> AT;
  typedef FFTArrayTypes<DeviceType> FFT_AT;

  GridCommKokkos(class LAMMPS *, MPI_Comm, int, int,
           int, int, int, int, int, int,
  GridCommKokkos(class LAMMPS *, MPI_Comm, int, int, int,
	   int, int, int, int, int, int,
	   int, int, int, int, int, int);
  GridCommKokkos(class LAMMPS *, MPI_Comm, int, int,
           int, int, int, int, int, int,
  GridCommKokkos(class LAMMPS *, MPI_Comm, int, int, int, int,
	   int, int, int, int, int, int,
	   int, int, int, int, int, int,
	   int, int, int, int, int, int);
  ~GridCommKokkos();
  void ghost_notify();
  int ghost_overlap();
  void setup();
  void forward_comm(class KSpace *, int);
  void reverse_comm(class KSpace *, int);
  double memory_usage();
  void setup(int &, int &);
  int ghost_adjacent();
  void forward_comm_kspace(class KSpace *, int, int, int,
			   void *, void *, MPI_Datatype);
  void reverse_comm_kspace(class KSpace *, int, int, int,
			   void *, void *, MPI_Datatype);

 private:
  int me;
  int nforward,nreverse;
  MPI_Comm gridcomm;
  MPI_Request request;

  // in = inclusive indices of 3d grid chunk that I own
  // out = inclusive indices of 3d grid chunk I own plus ghosts I use
  // proc = 6 neighbor procs that surround me
  // ghost = # of my owned grid planes needed from me
  //         by each of 6 neighbor procs to become their ghost planes

  int inxlo,inxhi,inylo,inyhi,inzlo,inzhi;
  int outxlo,outxhi,outylo,outyhi,outzlo,outzhi;
  int outxlo_max,outxhi_max,outylo_max,outyhi_max,outzlo_max,outzhi_max;
  int procxlo,procxhi,procylo,procyhi,proczlo,proczhi;
  int ghostxlo,ghostxhi,ghostylo,ghostyhi,ghostzlo,ghostzhi;

  int nbuf;
  //FFT_SCALAR *buf1,*buf2;
  FFT_DAT::tdual_FFT_SCALAR_1d k_buf1;
  FFT_DAT::tdual_FFT_SCALAR_1d k_buf2;

  struct Swap {
    int sendproc;       // proc to send to for forward comm
    int recvproc;       // proc to recv from for forward comm
    int npack;          // # of datums to pack
    int nunpack;        // # of datums to unpack
    //int *packlist;      // 3d array offsets to pack
    //int *unpacklist;    // 3d array offsets to unpack
  };
  DAT::tdual_int_2d k_swap_packlist;
  DAT::tdual_int_2d k_swap_unpacklist;

  DAT::tdual_int_2d k_send_packlist;

  DAT::tdual_int_2d k_recv_unpacklist;

  DAT::tdual_int_2d k_copy_packlist;
  DAT::tdual_int_2d k_copy_unpacklist;

  // -------------------------------------------
  // internal methods
  // -------------------------------------------

  void setup_regular(int &, int &);
  void setup_tiled(int &, int &);

  DAT::tdual_int_2d k_packlist;
  DAT::tdual_int_2d k_unpacklist;
  void forward_comm_kspace_regular(class KSpace *, int, int, int,
                                   void *, void *, MPI_Datatype);
  void forward_comm_kspace_tiled(class KSpace *, int, int, int,
                                 void *, void *, MPI_Datatype);
  void reverse_comm_kspace_regular(class KSpace *, int, int, int,
                                   void *, void *, MPI_Datatype);
  void reverse_comm_kspace_tiled(class KSpace *, int, int, int,
                                 void *, void *, MPI_Datatype);

  int nswap;
  Swap *swap;
  void grow_swap();
  
  int indices(DAT::tdual_int_2d &, int, int, int, int, int, int, int);
  int indices_kokkos(DAT::tdual_int_2d &, int, int, int, int, int, int, int);
};

}
+2 −2
Original line number Diff line number Diff line
@@ -24,9 +24,9 @@ class KokkosBaseFFT {

  //Kspace
  virtual void pack_forward_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
  virtual void unpack_forward_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
  virtual void unpack_forward_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, int, DAT::tdual_int_2d &, int) {};
  virtual void pack_reverse_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
  virtual void unpack_reverse_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int) {};
  virtual void unpack_reverse_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, int, DAT::tdual_int_2d &, int) {};
};

}
+10 −8
Original line number Diff line number Diff line
@@ -2568,7 +2568,7 @@ void PPPMKokkos<DeviceType>::operator()(TagPPPM_fieldforce_peratom, const int &i
------------------------------------------------------------------------- */

template<class DeviceType>
void PPPMKokkos<DeviceType>::pack_forward_kspace_kokkos(int flag, FFT_DAT::tdual_FFT_SCALAR_1d &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
void PPPMKokkos<DeviceType>::pack_forward_grid_kokkos(int flag, FFT_DAT::tdual_FFT_SCALAR_1d &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
{
  typename AT::t_int_2d_um d_list = k_list.view<DeviceType>();
  d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL());
@@ -2624,11 +2624,12 @@ void PPPMKokkos<DeviceType>::operator()(TagPPPM_pack_forward2, const int &i) con
------------------------------------------------------------------------- */

template<class DeviceType>
void PPPMKokkos<DeviceType>::unpack_forward_kspace_kokkos(int flag, FFT_DAT::tdual_FFT_SCALAR_1d &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
void PPPMKokkos<DeviceType>::unpack_forward_grid_kokkos(int flag, FFT_DAT::tdual_FFT_SCALAR_1d &k_buf, int offset, int nlist, DAT::tdual_int_2d &k_list, int index)
{
  typename AT::t_int_2d_um d_list = k_list.view<DeviceType>();
  d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL());
  d_buf = k_buf.view<DeviceType>();
  unpack_offset = offset;

  nx = (nxhi_out-nxlo_out+1);
  ny = (nyhi_out-nylo_out+1);
@@ -2652,9 +2653,9 @@ void PPPMKokkos<DeviceType>::operator()(TagPPPM_unpack_forward1, const int &i) c
  const int iz = (int) (dlist/(nx*ny));
  const int iy = (int) ((dlist - iz*nx*ny)/nx);
  const int ix = d_list_index[i] - iz*nx*ny - iy*nx;
  d_vdx_brick(iz,iy,ix) = d_buf[3*i];
  d_vdy_brick(iz,iy,ix) = d_buf[3*i+1];
  d_vdz_brick(iz,iy,ix) = d_buf[3*i+2];
  d_vdx_brick(iz,iy,ix) = d_buf[3*i + unpack_offset];
  d_vdy_brick(iz,iy,ix) = d_buf[3*i+1 + unpack_offset];
  d_vdz_brick(iz,iy,ix) = d_buf[3*i+2 + unpack_offset];
}

template<class DeviceType>
@@ -2681,7 +2682,7 @@ void PPPMKokkos<DeviceType>::operator()(TagPPPM_unpack_forward2, const int &i) c
------------------------------------------------------------------------- */

template<class DeviceType>
void PPPMKokkos<DeviceType>::pack_reverse_kspace_kokkos(int flag, FFT_DAT::tdual_FFT_SCALAR_1d &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
void PPPMKokkos<DeviceType>::pack_reverse_grid_kokkos(int flag, FFT_DAT::tdual_FFT_SCALAR_1d &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
{
  typename AT::t_int_2d_um d_list = k_list.view<DeviceType>();
  d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL());
@@ -2711,11 +2712,12 @@ void PPPMKokkos<DeviceType>::operator()(TagPPPM_pack_reverse, const int &i) cons
------------------------------------------------------------------------- */

template<class DeviceType>
void PPPMKokkos<DeviceType>::unpack_reverse_kspace_kokkos(int flag, FFT_DAT::tdual_FFT_SCALAR_1d &k_buf, int nlist, DAT::tdual_int_2d &k_list, int index)
void PPPMKokkos<DeviceType>::unpack_reverse_grid_kokkos(int flag, FFT_DAT::tdual_FFT_SCALAR_1d &k_buf, int offset, int nlist, DAT::tdual_int_2d &k_list, int index)
{
  typename AT::t_int_2d_um d_list = k_list.view<DeviceType>();
  d_list_index = Kokkos::subview(d_list,index,Kokkos::ALL());
  d_buf = k_buf.view<DeviceType>();
  unpack_offset = offset;

  nx = (nxhi_out-nxlo_out+1);
  ny = (nyhi_out-nylo_out+1);
@@ -2733,7 +2735,7 @@ void PPPMKokkos<DeviceType>::operator()(TagPPPM_unpack_reverse, const int &i) co
  const int iz = (int) (dlist/(nx*ny));
  const int iy = (int) ((dlist - iz*nx*ny)/nx);
  const int ix = d_list_index[i] - iz*nx*ny - iy*nx;
  d_density_brick(iz,iy,ix) += d_buf[i];
  d_density_brick(iz,iy,ix) += d_buf[i + unpack_offset];
}

/* ----------------------------------------------------------------------
+3 −2
Original line number Diff line number Diff line
@@ -311,6 +311,7 @@ class PPPMKokkos : public PPPM, public KokkosBaseFFT {
  int nx,ny,nz;
  typename AT::t_int_1d_um d_list_index;
  typename FFT_AT::t_FFT_SCALAR_1d_um d_buf;
  int unpack_offset;

  DAT::tdual_int_scalar k_flag;

@@ -404,9 +405,9 @@ class PPPMKokkos : public PPPM, public KokkosBaseFFT {
  // grid communication

  void pack_forward_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int);
  void unpack_forward_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int);
  void unpack_forward_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, int, DAT::tdual_int_2d &, int);
  void pack_reverse_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int);
  void unpack_reverse_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, DAT::tdual_int_2d &, int);
  void unpack_reverse_kspace_kokkos(int, FFT_DAT::tdual_FFT_SCALAR_1d &, int, int, DAT::tdual_int_2d &, int);

  // triclinic

Loading