git-svn-id: svn://svn.icms.temple.edu/lammps-ro/trunk@12656 f3b2605a-c512-4ea7-a41b-209d697bcdaa
This commit is contained in:
@ -40,7 +40,8 @@ extern int lmp_init_device(MPI_Comm world, MPI_Comm replica,
|
|||||||
const int first_gpu, const int last_gpu,
|
const int first_gpu, const int last_gpu,
|
||||||
const int gpu_mode, const double particle_split,
|
const int gpu_mode, const double particle_split,
|
||||||
const int nthreads, const int t_per_atom,
|
const int nthreads, const int t_per_atom,
|
||||||
const double cell_size, char *opencl_flags);
|
const double cell_size, char *opencl_flags,
|
||||||
|
const int block_pair);
|
||||||
extern void lmp_clear_device();
|
extern void lmp_clear_device();
|
||||||
extern double lmp_gpu_forces(double **f, double **tor, double *eatom,
|
extern double lmp_gpu_forces(double **f, double **tor, double *eatom,
|
||||||
double **vatom, double *virial, double &ecoul);
|
double **vatom, double *virial, double &ecoul);
|
||||||
@ -98,6 +99,7 @@ FixGPU::FixGPU(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
int threads_per_atom = -1;
|
int threads_per_atom = -1;
|
||||||
double binsize = 0.0;
|
double binsize = 0.0;
|
||||||
char *opencl_flags = NULL;
|
char *opencl_flags = NULL;
|
||||||
|
int block_pair = -1;
|
||||||
|
|
||||||
int iarg = 4;
|
int iarg = 4;
|
||||||
while (iarg < narg) {
|
while (iarg < narg) {
|
||||||
@ -142,15 +144,13 @@ FixGPU::FixGPU(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
if (iarg+2 > narg) error->all(FLERR,"Illegal package gpu command");
|
if (iarg+2 > narg) error->all(FLERR,"Illegal package gpu command");
|
||||||
opencl_flags = arg[iarg+1];
|
opencl_flags = arg[iarg+1];
|
||||||
iarg += 2;
|
iarg += 2;
|
||||||
|
} else if (strcmp(arg[iarg],"blocksize") == 0) {
|
||||||
|
if (iarg+2 > narg) error->all(FLERR,"Illegal package gpu command");
|
||||||
|
block_pair = force->inumeric(FLERR,arg[iarg+1]);
|
||||||
|
iarg += 2;
|
||||||
} else error->all(FLERR,"Illegal package gpu command");
|
} else error->all(FLERR,"Illegal package gpu command");
|
||||||
}
|
}
|
||||||
|
|
||||||
// error check
|
|
||||||
|
|
||||||
if ((_gpu_mode == GPU_NEIGH || _gpu_mode == GPU_HYB_NEIGH) &&
|
|
||||||
domain->triclinic)
|
|
||||||
error->all(FLERR,"Cannot use package gpu neigh yes with triclinic box");
|
|
||||||
|
|
||||||
#ifndef _OPENMP
|
#ifndef _OPENMP
|
||||||
if (nthreads > 1)
|
if (nthreads > 1)
|
||||||
error->all(FLERR,"No OpenMP support compiled in");
|
error->all(FLERR,"No OpenMP support compiled in");
|
||||||
@ -171,7 +171,8 @@ FixGPU::FixGPU(LAMMPS *lmp, int narg, char **arg) :
|
|||||||
if (binsize == 0.0) binsize = -1.0;
|
if (binsize == 0.0) binsize = -1.0;
|
||||||
int gpu_flag = lmp_init_device(universe->uworld, world, first_gpu, last_gpu,
|
int gpu_flag = lmp_init_device(universe->uworld, world, first_gpu, last_gpu,
|
||||||
_gpu_mode, _particle_split, nthreads,
|
_gpu_mode, _particle_split, nthreads,
|
||||||
threads_per_atom, binsize, opencl_flags);
|
threads_per_atom, binsize, opencl_flags,
|
||||||
|
block_pair);
|
||||||
GPU_EXTRA::check_flag(gpu_flag,error,world);
|
GPU_EXTRA::check_flag(gpu_flag,error,world);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -215,6 +216,17 @@ void FixGPU::init()
|
|||||||
error->all(FLERR,"GPU split param must be positive "
|
error->all(FLERR,"GPU split param must be positive "
|
||||||
"for hybrid pair styles");
|
"for hybrid pair styles");
|
||||||
|
|
||||||
|
// neighbor list builds on the GPU with triclinic box is not yet supported
|
||||||
|
|
||||||
|
if ((_gpu_mode == GPU_NEIGH || _gpu_mode == GPU_HYB_NEIGH) &&
|
||||||
|
domain->triclinic)
|
||||||
|
error->all(FLERR,"Cannot use package gpu neigh yes with triclinic box");
|
||||||
|
|
||||||
|
// give a warning if no pair style is defined
|
||||||
|
|
||||||
|
if (!force->pair)
|
||||||
|
error->warning(FLERR,"Using package gpu without any pair style defined");
|
||||||
|
|
||||||
// make sure fdotr virial is not accumulated multiple times
|
// make sure fdotr virial is not accumulated multiple times
|
||||||
|
|
||||||
if (force->pair_match("hybrid",1) != NULL) {
|
if (force->pair_match("hybrid",1) != NULL) {
|
||||||
@ -246,7 +258,7 @@ void FixGPU::setup(int vflag)
|
|||||||
|
|
||||||
if (strstr(update->integrate_style,"verlet")) post_force(vflag);
|
if (strstr(update->integrate_style,"verlet")) post_force(vflag);
|
||||||
else {
|
else {
|
||||||
// in setup only, all forces calculated on GPU are put in the outer level
|
// In setup only, all forces calculated on GPU are put in the outer level
|
||||||
((Respa *) update->integrate)->copy_flevel_f(_nlevels_respa-1);
|
((Respa *) update->integrate)->copy_flevel_f(_nlevels_respa-1);
|
||||||
post_force(vflag);
|
post_force(vflag);
|
||||||
((Respa *) update->integrate)->copy_f_flevel(_nlevels_respa-1);
|
((Respa *) update->integrate)->copy_f_flevel(_nlevels_respa-1);
|
||||||
@ -264,6 +276,8 @@ void FixGPU::min_setup(int vflag)
|
|||||||
|
|
||||||
void FixGPU::post_force(int vflag)
|
void FixGPU::post_force(int vflag)
|
||||||
{
|
{
|
||||||
|
if (!force->pair) return;
|
||||||
|
|
||||||
timer->stamp();
|
timer->stamp();
|
||||||
double lvirial[6];
|
double lvirial[6];
|
||||||
for (int i = 0; i < 6; i++) lvirial[i] = 0.0;
|
for (int i = 0; i < 6; i++) lvirial[i] = 0.0;
|
||||||
|
|||||||
@ -56,6 +56,9 @@ int ljcl_gpu_init(const int ntypes, double **cutsq, double **host_lj1,
|
|||||||
double **host_cut_ljsq, double host_cut_coulsq,
|
double **host_cut_ljsq, double host_cut_coulsq,
|
||||||
double *host_special_coul, const double qqrd2e,
|
double *host_special_coul, const double qqrd2e,
|
||||||
const double g_ewald);
|
const double g_ewald);
|
||||||
|
int ljcl_gpu_reinit(const int ntypes, double **cutsq, double **host_lj1,
|
||||||
|
double **host_lj2, double **host_lj3, double **host_lj4,
|
||||||
|
double **offset, double **host_lj_cutsq);
|
||||||
void ljcl_gpu_clear();
|
void ljcl_gpu_clear();
|
||||||
int ** ljcl_gpu_compute_n(const int ago, const int inum,
|
int ** ljcl_gpu_compute_n(const int ago, const int inum,
|
||||||
const int nall, double **host_x, int *host_type,
|
const int nall, double **host_x, int *host_type,
|
||||||
@ -79,7 +82,6 @@ PairLJCutCoulLongGPU::PairLJCutCoulLongGPU(LAMMPS *lmp) :
|
|||||||
PairLJCutCoulLong(lmp), gpu_mode(GPU_FORCE)
|
PairLJCutCoulLong(lmp), gpu_mode(GPU_FORCE)
|
||||||
{
|
{
|
||||||
respa_enable = 0;
|
respa_enable = 0;
|
||||||
reinitflag = 0;
|
|
||||||
cpu_time = 0.0;
|
cpu_time = 0.0;
|
||||||
GPU_EXTRA::gpu_ready(lmp->modify, lmp->error);
|
GPU_EXTRA::gpu_ready(lmp->modify, lmp->error);
|
||||||
}
|
}
|
||||||
@ -195,6 +197,15 @@ void PairLJCutCoulLongGPU::init_style()
|
|||||||
|
|
||||||
/* ---------------------------------------------------------------------- */
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
void PairLJCutCoulLongGPU::reinit()
|
||||||
|
{
|
||||||
|
Pair::reinit();
|
||||||
|
|
||||||
|
ljcl_gpu_reinit(atom->ntypes+1, cutsq, lj1, lj2, lj3, lj4, offset, cut_ljsq);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ---------------------------------------------------------------------- */
|
||||||
|
|
||||||
double PairLJCutCoulLongGPU::memory_usage()
|
double PairLJCutCoulLongGPU::memory_usage()
|
||||||
{
|
{
|
||||||
double bytes = Pair::memory_usage();
|
double bytes = Pair::memory_usage();
|
||||||
|
|||||||
@ -31,6 +31,7 @@ class PairLJCutCoulLongGPU : public PairLJCutCoulLong {
|
|||||||
void cpu_compute(int, int, int, int, int *, int *, int **);
|
void cpu_compute(int, int, int, int, int *, int *, int **);
|
||||||
void compute(int, int);
|
void compute(int, int);
|
||||||
void init_style();
|
void init_style();
|
||||||
|
void reinit();
|
||||||
double memory_usage();
|
double memory_usage();
|
||||||
|
|
||||||
enum { GPU_FORCE, GPU_NEIGH, GPU_HYB_NEIGH };
|
enum { GPU_FORCE, GPU_NEIGH, GPU_HYB_NEIGH };
|
||||||
|
|||||||
Reference in New Issue
Block a user