From f07c871b468b9c5e3d05bf9c67d60e0712e0bdb7 Mon Sep 17 00:00:00 2001 From: kanduri Date: Tue, 30 Mar 2021 11:53:51 +0000 Subject: [PATCH] Turn t_forcerec.shift_vec into an std::vector of gmx::RVec Change function signatures so that call sites have minimal changes --- api/nblib/gmxsetup.cpp | 2 +- .../gmxlib/nonbonded/nb_free_energy.cpp | 11 ++--- src/gromacs/mdlib/forcerec.cpp | 5 +-- src/gromacs/mdlib/sim_util.cpp | 5 ++- src/gromacs/mdtypes/forcerec.h | 3 +- src/gromacs/nbnxm/atomdata.cpp | 7 +--- src/gromacs/nbnxm/atomdata.h | 4 +- src/gromacs/nbnxm/benchmark/bench_system.cpp | 2 +- src/gromacs/nbnxm/kerneldispatch.cpp | 41 ++++++++++--------- .../kernels_reference/kernel_gpu_ref.cpp | 30 +++++++------- .../nbnxm/kernels_reference/kernel_gpu_ref.h | 24 +++++------ .../kernels_reference/kernel_ref_prune.cpp | 17 ++++---- .../kernels_reference/kernel_ref_prune.h | 16 +++++--- .../nbnxm/kernels_simd_2xmm/kernel_prune.cpp | 27 ++++++------ .../nbnxm/kernels_simd_2xmm/kernel_prune.h | 17 +++++--- .../nbnxm/kernels_simd_4xm/kernel_prune.cpp | 27 ++++++------ .../nbnxm/kernels_simd_4xm/kernel_prune.h | 17 +++++--- src/gromacs/nbnxm/nbnxm.h | 3 +- src/gromacs/nbnxm/pairlistset.h | 2 +- src/gromacs/nbnxm/pairlistsets.h | 8 ++-- src/gromacs/nbnxm/prunekerneldispatch.cpp | 6 +-- src/gromacs/pbcutil/pbc.cpp | 2 +- src/gromacs/pbcutil/pbc.h | 2 +- src/gromacs/pbcutil/tests/pbc.cpp | 7 ++-- 24 files changed, 154 insertions(+), 131 deletions(-) diff --git a/api/nblib/gmxsetup.cpp b/api/nblib/gmxsetup.cpp index b19744755b..fd3cfd2a87 100644 --- a/api/nblib/gmxsetup.cpp +++ b/api/nblib/gmxsetup.cpp @@ -298,7 +298,7 @@ void NbvSetupUtil::setupForceRec(const matrix& box) { assert((gmxForceCalculator_->forcerec_ && "Forcerec not initialized")); gmxForceCalculator_->forcerec_->nbfp = nonbondedParameters_; - snew(gmxForceCalculator_->forcerec_->shift_vec, numShiftVectors); + gmxForceCalculator_->forcerec_->shift_vec.resize(numShiftVectors); calc_shifts(box, gmxForceCalculator_->forcerec_->shift_vec); } diff --git a/src/gromacs/gmxlib/nonbonded/nb_free_energy.cpp b/src/gromacs/gmxlib/nonbonded/nb_free_energy.cpp index 86c17b7479..8fde84db9f 100644 --- a/src/gromacs/gmxlib/nonbonded/nb_free_energy.cpp +++ b/src/gromacs/gmxlib/nonbonded/nb_free_energy.cpp @@ -241,7 +241,7 @@ static void nb_free_energy_kernel(const t_nblist& nlist, gmx::ArrayRef shift = nlist.shift; gmx::ArrayRef gid = nlist.gid; - const real* shiftvec = fr.shift_vec[0]; + const auto shiftvec = fr.shift_vec; const int ntype = fr.ntype; gmx::ArrayRef nbfp = fr.nbfp; gmx::ArrayRef nbfp_grid = fr.ljpme_c6grid; @@ -385,10 +385,11 @@ static void nb_free_energy_kernel(const t_nblist& nlist, { int npair_within_cutoff = 0; - const int is3 = 3 * shift[n]; - const real shX = shiftvec[is3]; - const real shY = shiftvec[is3 + 1]; - const real shZ = shiftvec[is3 + 2]; + const int is = shift[n]; + const int is3 = DIM * is; + const real shX = shiftvec[is][XX]; + const real shY = shiftvec[is][YY]; + const real shZ = shiftvec[is][ZZ]; const int nj0 = jindex[n]; const int nj1 = jindex[n + 1]; const int ii = iinr[n]; diff --git a/src/gromacs/mdlib/forcerec.cpp b/src/gromacs/mdlib/forcerec.cpp index cda7d5743e..c2004aa45e 100644 --- a/src/gromacs/mdlib/forcerec.cpp +++ b/src/gromacs/mdlib/forcerec.cpp @@ -1218,9 +1218,9 @@ void init_forcerec(FILE* fplog, forcerec->forceHelperBuffers.emplace_back(haveDirectVirialContributions); } - if (forcerec->shift_vec == nullptr) + if (forcerec->shift_vec.empty()) { - snew(forcerec->shift_vec, SHIFTS); + forcerec->shift_vec.resize(SHIFTS); } if (forcerec->nbfp.empty()) @@ -1418,6 +1418,5 @@ t_forcerec::t_forcerec() = default; t_forcerec::~t_forcerec() { /* Note: This code will disappear when types are converted to C++ */ - sfree(shift_vec); sfree(ewc_t); } diff --git a/src/gromacs/mdlib/sim_util.cpp b/src/gromacs/mdlib/sim_util.cpp index f02d9fa9c7..0d27bedbda 100644 --- a/src/gromacs/mdlib/sim_util.cpp +++ b/src/gromacs/mdlib/sim_util.cpp @@ -165,8 +165,9 @@ static void calc_virial(int start, PbcType pbcType) { /* The short-range virial from surrounding boxes */ - const rvec* fshift = as_rvec_array(forceWithShiftForces.shiftForces().data()); - calc_vir(SHIFTS, fr->shift_vec, fshift, vir_part, pbcType == PbcType::Screw, box); + const rvec* fshift = as_rvec_array(forceWithShiftForces.shiftForces().data()); + const rvec* shiftVecPointer = as_rvec_array(fr->shift_vec.data()); + calc_vir(SHIFTS, shiftVecPointer, fshift, vir_part, pbcType == PbcType::Screw, box); inc_nrnb(nrnb, eNR_VIRIAL, SHIFTS); /* Calculate partial virial, for local atoms only, based on short range. diff --git a/src/gromacs/mdtypes/forcerec.h b/src/gromacs/mdtypes/forcerec.h index f6404b4848..ee8425551f 100644 --- a/src/gromacs/mdtypes/forcerec.h +++ b/src/gromacs/mdtypes/forcerec.h @@ -44,6 +44,7 @@ #include "gromacs/math/vectypes.h" #include "gromacs/mdtypes/md_enums.h" +#include "gromacs/pbcutil/ishift.h" #include "gromacs/pbcutil/pbc.h" #include "gromacs/utility/arrayref.h" #include "gromacs/utility/real.h" @@ -240,7 +241,7 @@ struct t_forcerec /* Information about atom properties for local and non-local atoms */ std::vector cginfo; - rvec* shift_vec = nullptr; + std::vector shift_vec; std::unique_ptr wholeMoleculeTransform; diff --git a/src/gromacs/nbnxm/atomdata.cpp b/src/gromacs/nbnxm/atomdata.cpp index d9639e9b5b..1fa91c6f03 100644 --- a/src/gromacs/nbnxm/atomdata.cpp +++ b/src/gromacs/nbnxm/atomdata.cpp @@ -946,13 +946,10 @@ void nbnxn_atomdata_set(nbnxn_atomdata_t* nbat, } /* Copies the shift vector array to nbnxn_atomdata_t */ -void nbnxn_atomdata_copy_shiftvec(gmx_bool bDynamicBox, rvec* shift_vec, nbnxn_atomdata_t* nbat) +void nbnxn_atomdata_copy_shiftvec(gmx_bool bDynamicBox, gmx::ArrayRef shift_vec, nbnxn_atomdata_t* nbat) { nbat->bDynamicBox = bDynamicBox; - for (int i = 0; i < SHIFTS; i++) - { - copy_rvec(shift_vec[i], nbat->shift_vec[i]); - } + std::copy(shift_vec.begin(), shift_vec.end(), nbat->shift_vec.begin()); } // This is slightly different from nbnxn_get_atom_range(...) at the end of the file diff --git a/src/gromacs/nbnxm/atomdata.h b/src/gromacs/nbnxm/atomdata.h index 39a46794fa..d676ae1f4c 100644 --- a/src/gromacs/nbnxm/atomdata.h +++ b/src/gromacs/nbnxm/atomdata.h @@ -337,7 +337,9 @@ void nbnxn_atomdata_set(nbnxn_atomdata_t* nbat, gmx::ArrayRef atomInfo); //! Copy the shift vectors to nbat -void nbnxn_atomdata_copy_shiftvec(gmx_bool dynamic_box, rvec* shift_vec, nbnxn_atomdata_t* nbat); +void nbnxn_atomdata_copy_shiftvec(gmx_bool dynamic_box, + gmx::ArrayRef shift_vec, + nbnxn_atomdata_t* nbat); /*! \brief Transform coordinates to xbat layout * diff --git a/src/gromacs/nbnxm/benchmark/bench_system.cpp b/src/gromacs/nbnxm/benchmark/bench_system.cpp index 999457ae62..3076939ce5 100644 --- a/src/gromacs/nbnxm/benchmark/bench_system.cpp +++ b/src/gromacs/nbnxm/benchmark/bench_system.cpp @@ -200,7 +200,7 @@ BenchmarkSystem::BenchmarkSystem(const int multiplicationFactor, const std::stri forceRec.ntype = numAtomTypes; forceRec.nbfp = nonbondedParameters; - snew(forceRec.shift_vec, SHIFTS); + forceRec.shift_vec.resize(SHIFTS); calc_shifts(box, forceRec.shift_vec); if (!outputFile.empty()) { diff --git a/src/gromacs/nbnxm/kerneldispatch.cpp b/src/gromacs/nbnxm/kerneldispatch.cpp index 0bfa57b992..24608cf456 100644 --- a/src/gromacs/nbnxm/kerneldispatch.cpp +++ b/src/gromacs/nbnxm/kerneldispatch.cpp @@ -238,16 +238,16 @@ static int getVdwKernelType(const Nbnxm::KernelSetup& kernelSetup, * \param[out] vVdw Output buffer for Van der Waals energies * \param[in] wcycle Pointer to cycle counting data structure. */ -static void nbnxn_kernel_cpu(const PairlistSet& pairlistSet, - const Nbnxm::KernelSetup& kernelSetup, - nbnxn_atomdata_t* nbat, - const interaction_const_t& ic, - rvec* shiftVectors, - const gmx::StepWorkload& stepWork, - int clearF, - real* vCoulomb, - real* vVdw, - gmx_wallcycle* wcycle) +static void nbnxn_kernel_cpu(const PairlistSet& pairlistSet, + const Nbnxm::KernelSetup& kernelSetup, + nbnxn_atomdata_t* nbat, + const interaction_const_t& ic, + gmx::ArrayRef shiftVectors, + const gmx::StepWorkload& stepWork, + int clearF, + real* vCoulomb, + real* vVdw, + gmx_wallcycle* wcycle) { const nbnxn_atomdata_t::Params& nbatParams = nbat->params(); @@ -257,6 +257,8 @@ static void nbnxn_kernel_cpu(const PairlistSet& pairlistSet, gmx::ArrayRef pairlists = pairlistSet.cpuLists(); + auto shiftVecPointer = as_rvec_array(shiftVectors.data()); + int gmx_unused nthreads = gmx_omp_nthreads_get(emntNonbonded); wallcycle_sub_start(wcycle, ewcsNONBONDED_CLEAR); #pragma omp parallel for schedule(static) num_threads(nthreads) @@ -288,16 +290,16 @@ static void nbnxn_kernel_cpu(const PairlistSet& pairlistSet, switch (kernelSetup.kernelType) { case Nbnxm::KernelType::Cpu4x4_PlainC: - nbnxn_kernel_noener_ref[coulkt][vdwkt](pairlist, nbat, &ic, shiftVectors, out); + nbnxn_kernel_noener_ref[coulkt][vdwkt](pairlist, nbat, &ic, shiftVecPointer, out); break; #ifdef GMX_NBNXN_SIMD_2XNN case Nbnxm::KernelType::Cpu4xN_Simd_2xNN: - nbnxm_kernel_noener_simd_2xmm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVectors, out); + nbnxm_kernel_noener_simd_2xmm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVecPointer, out); break; #endif #ifdef GMX_NBNXN_SIMD_4XN case Nbnxm::KernelType::Cpu4xN_Simd_4xN: - nbnxm_kernel_noener_simd_4xm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVectors, out); + nbnxm_kernel_noener_simd_4xm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVecPointer, out); break; #endif default: GMX_RELEASE_ASSERT(false, "Unsupported kernel architecture"); @@ -312,16 +314,16 @@ static void nbnxn_kernel_cpu(const PairlistSet& pairlistSet, switch (kernelSetup.kernelType) { case Nbnxm::KernelType::Cpu4x4_PlainC: - nbnxn_kernel_ener_ref[coulkt][vdwkt](pairlist, nbat, &ic, shiftVectors, out); + nbnxn_kernel_ener_ref[coulkt][vdwkt](pairlist, nbat, &ic, shiftVecPointer, out); break; #ifdef GMX_NBNXN_SIMD_2XNN case Nbnxm::KernelType::Cpu4xN_Simd_2xNN: - nbnxm_kernel_ener_simd_2xmm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVectors, out); + nbnxm_kernel_ener_simd_2xmm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVecPointer, out); break; #endif #ifdef GMX_NBNXN_SIMD_4XN case Nbnxm::KernelType::Cpu4xN_Simd_4xN: - nbnxm_kernel_ener_simd_4xm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVectors, out); + nbnxm_kernel_ener_simd_4xm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVecPointer, out); break; #endif default: GMX_RELEASE_ASSERT(false, "Unsupported kernel architecture"); @@ -338,18 +340,19 @@ static void nbnxn_kernel_cpu(const PairlistSet& pairlistSet, { case Nbnxm::KernelType::Cpu4x4_PlainC: unrollj = c_nbnxnCpuIClusterSize; - nbnxn_kernel_energrp_ref[coulkt][vdwkt](pairlist, nbat, &ic, shiftVectors, out); + nbnxn_kernel_energrp_ref[coulkt][vdwkt](pairlist, nbat, &ic, shiftVecPointer, out); break; #ifdef GMX_NBNXN_SIMD_2XNN case Nbnxm::KernelType::Cpu4xN_Simd_2xNN: unrollj = GMX_SIMD_REAL_WIDTH / 2; - nbnxm_kernel_energrp_simd_2xmm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVectors, out); + nbnxm_kernel_energrp_simd_2xmm[coulkt][vdwkt]( + pairlist, nbat, &ic, shiftVecPointer, out); break; #endif #ifdef GMX_NBNXN_SIMD_4XN case Nbnxm::KernelType::Cpu4xN_Simd_4xN: unrollj = GMX_SIMD_REAL_WIDTH; - nbnxm_kernel_energrp_simd_4xm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVectors, out); + nbnxm_kernel_energrp_simd_4xm[coulkt][vdwkt](pairlist, nbat, &ic, shiftVecPointer, out); break; #endif default: GMX_RELEASE_ASSERT(false, "Unsupported kernel architecture"); diff --git a/src/gromacs/nbnxm/kernels_reference/kernel_gpu_ref.cpp b/src/gromacs/nbnxm/kernels_reference/kernel_gpu_ref.cpp index 8fa8d6797a..6002eb5be7 100644 --- a/src/gromacs/nbnxm/kernels_reference/kernel_gpu_ref.cpp +++ b/src/gromacs/nbnxm/kernels_reference/kernel_gpu_ref.cpp @@ -56,16 +56,16 @@ static constexpr int c_clSize = c_nbnxnGpuClusterSize; -void nbnxn_kernel_gpu_ref(const NbnxnPairlistGpu* nbl, - const nbnxn_atomdata_t* nbat, - const interaction_const_t* iconst, - rvec* shift_vec, - const gmx::StepWorkload& stepWork, - int clearF, - gmx::ArrayRef f, - real* fshift, - real* Vc, - real* Vvdw) +void nbnxn_kernel_gpu_ref(const NbnxnPairlistGpu* nbl, + const nbnxn_atomdata_t* nbat, + const interaction_const_t* iconst, + gmx::ArrayRef shiftvec, + const gmx::StepWorkload& stepWork, + int clearF, + gmx::ArrayRef f, + real* fshift, + real* Vc, + real* Vvdw) { real fscal = NAN; real vcoul = 0; @@ -97,7 +97,6 @@ void nbnxn_kernel_gpu_ref(const NbnxnPairlistGpu* nbl, const int* type = nbat->params().type.data(); const real facel = iconst->epsfac; - const real* shiftvec = shift_vec[0]; const real* vdwparam = nbat->params().nbfp.data(); const int ntype = nbat->params().numTypes; @@ -109,10 +108,11 @@ void nbnxn_kernel_gpu_ref(const NbnxnPairlistGpu* nbl, for (const nbnxn_sci_t& nbln : nbl->sci) { - const int ish3 = 3 * nbln.shift; - const real shX = shiftvec[ish3]; - const real shY = shiftvec[ish3 + 1]; - const real shZ = shiftvec[ish3 + 2]; + const int ish = nbln.shift; + const int ish3 = DIM * ish; + const real shX = shiftvec[ish][XX]; + const real shY = shiftvec[ish][YY]; + const real shZ = shiftvec[ish][ZZ]; const int cj4_ind0 = nbln.cj4_ind_start; const int cj4_ind1 = nbln.cj4_ind_end; const int sci = nbln.sci; diff --git a/src/gromacs/nbnxm/kernels_reference/kernel_gpu_ref.h b/src/gromacs/nbnxm/kernels_reference/kernel_gpu_ref.h index 57570a7efb..83c59b65f0 100644 --- a/src/gromacs/nbnxm/kernels_reference/kernel_gpu_ref.h +++ b/src/gromacs/nbnxm/kernels_reference/kernel_gpu_ref.h @@ -1,8 +1,8 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2012,2013,2014,2015,2018 by the GROMACS development team. - * Copyright (c) 2019,2020, by the GROMACS development team, led by + * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team. + * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -60,15 +60,15 @@ class StepWorkload; } //! Reference (slow) kernel for nb n vs n GPU type pair lists -void nbnxn_kernel_gpu_ref(const NbnxnPairlistGpu* nbl, - const nbnxn_atomdata_t* nbat, - const interaction_const_t* iconst, - rvec* shift_vec, - const gmx::StepWorkload& stepWork, - int clearF, - gmx::ArrayRef f, - real* fshift, - real* Vc, - real* Vvdw); +void nbnxn_kernel_gpu_ref(const NbnxnPairlistGpu* nbl, + const nbnxn_atomdata_t* nbat, + const interaction_const_t* iconst, + gmx::ArrayRef shiftvec, + const gmx::StepWorkload& stepWork, + int clearF, + gmx::ArrayRef f, + real* fshift, + real* Vc, + real* Vvdw); #endif diff --git a/src/gromacs/nbnxm/kernels_reference/kernel_ref_prune.cpp b/src/gromacs/nbnxm/kernels_reference/kernel_ref_prune.cpp index 245529cd47..8d94eaed56 100644 --- a/src/gromacs/nbnxm/kernels_reference/kernel_ref_prune.cpp +++ b/src/gromacs/nbnxm/kernels_reference/kernel_ref_prune.cpp @@ -1,7 +1,8 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2017,2018,2019, by the GROMACS development team, led by + * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team. + * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -42,10 +43,10 @@ #include "gromacs/utility/gmxassert.h" /* Prune a single NbnxnPairlistCpu entry with distance rlistInner */ -void nbnxn_kernel_prune_ref(NbnxnPairlistCpu* nbl, - const nbnxn_atomdata_t* nbat, - const rvec* gmx_restrict shift_vec, - real rlistInner) +void nbnxn_kernel_prune_ref(NbnxnPairlistCpu* nbl, + const nbnxn_atomdata_t* nbat, + gmx::ArrayRef shiftvec, + real rlistInner) { /* We avoid push_back() for efficiency reasons and resize after filling */ nbl->ci.resize(nbl->ciOuter.size()); @@ -57,8 +58,7 @@ void nbnxn_kernel_prune_ref(NbnxnPairlistCpu* nbl, const nbnxn_cj_t* gmx_restrict cjOuter = nbl->cjOuter.data(); nbnxn_cj_t* gmx_restrict cjInner = nbl->cj.data(); - const real* gmx_restrict shiftvec = shift_vec[0]; - const real* gmx_restrict x = nbat->x().data(); + const real* gmx_restrict x = nbat->x().data(); const real rlist2 = rlistInner * rlistInner; @@ -93,8 +93,7 @@ void nbnxn_kernel_prune_ref(NbnxnPairlistCpu* nbl, { for (int d = 0; d < DIM; d++) { - xi[i * c_xiStride + d] = - x[(ci * c_iUnroll + i) * c_xStride + d] + shiftvec[ish * DIM + d]; + xi[i * c_xiStride + d] = x[(ci * c_iUnroll + i) * c_xStride + d] + shiftvec[ish][d]; } } diff --git a/src/gromacs/nbnxm/kernels_reference/kernel_ref_prune.h b/src/gromacs/nbnxm/kernels_reference/kernel_ref_prune.h index 1df5dc065d..d29cc4266c 100644 --- a/src/gromacs/nbnxm/kernels_reference/kernel_ref_prune.h +++ b/src/gromacs/nbnxm/kernels_reference/kernel_ref_prune.h @@ -1,7 +1,8 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2017,2018,2019, by the GROMACS development team, led by + * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team. + * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -49,12 +50,17 @@ struct nbnxn_atomdata_t; struct NbnxnPairlistCpu; +namespace gmx +{ +template +class ArrayRef; +} /*! \brief Prune a single NbnxnPairlistCpu entry with distance \p rlistInner * * Reads a cluster pairlist \p nbl->ciOuter, \p nbl->cjOuter and writes * all cluster pairs within \p rlistInner to \p nbl->ci, \p nbl->cj. */ -void nbnxn_kernel_prune_ref(NbnxnPairlistCpu* nbl, - const nbnxn_atomdata_t* nbat, - const rvec* gmx_restrict shift_vec, - real rlistInner); +void nbnxn_kernel_prune_ref(NbnxnPairlistCpu* nbl, + const nbnxn_atomdata_t* nbat, + gmx::ArrayRef shiftvec, + real rlistInner); diff --git a/src/gromacs/nbnxm/kernels_simd_2xmm/kernel_prune.cpp b/src/gromacs/nbnxm/kernels_simd_2xmm/kernel_prune.cpp index 3787909e12..eab55185f0 100644 --- a/src/gromacs/nbnxm/kernels_simd_2xmm/kernel_prune.cpp +++ b/src/gromacs/nbnxm/kernels_simd_2xmm/kernel_prune.cpp @@ -1,7 +1,8 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by + * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team. + * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -48,10 +49,10 @@ #endif /* Prune a single nbnxn_pairtlist_t entry with distance rlistInner */ -void nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu* nbl, - const nbnxn_atomdata_t* nbat, - const rvec* gmx_restrict shift_vec, - real rlistInner) +void nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu* nbl, + const nbnxn_atomdata_t* nbat, + gmx::ArrayRef shiftvec, + real rlistInner) { #ifdef GMX_NBNXN_SIMD_2XNN using namespace gmx; @@ -66,8 +67,7 @@ void nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu* nbl, const nbnxn_cj_t* gmx_restrict cjOuter = nbl->cjOuter.data(); nbnxn_cj_t* gmx_restrict cjInner = nbl->cj.data(); - const real* gmx_restrict shiftvec = shift_vec[0]; - const real* gmx_restrict x = nbat->x().data(); + const real* gmx_restrict x = nbat->x().data(); const SimdReal rlist2_S(rlistInner * rlistInner); @@ -85,13 +85,12 @@ void nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu* nbl, ciInner[nciInner].cj_ind_start = ncjInner; /* Extract shift data */ - int ish = (ciEntry->shift & NBNXN_CI_SHIFT); - int ish3 = ish * 3; - int ci = ciEntry->ci; + int ish = (ciEntry->shift & NBNXN_CI_SHIFT); + int ci = ciEntry->ci; - SimdReal shX_S = SimdReal(shiftvec[ish3]); - SimdReal shY_S = SimdReal(shiftvec[ish3 + 1]); - SimdReal shZ_S = SimdReal(shiftvec[ish3 + 2]); + SimdReal shX_S = SimdReal(shiftvec[ish][XX]); + SimdReal shY_S = SimdReal(shiftvec[ish][YY]); + SimdReal shZ_S = SimdReal(shiftvec[ish][ZZ]); # if UNROLLJ <= 4 int scix = ci * STRIDE * DIM; @@ -171,7 +170,7 @@ void nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu* nbl, GMX_UNUSED_VALUE(nbl); GMX_UNUSED_VALUE(nbat); - GMX_UNUSED_VALUE(shift_vec); + GMX_UNUSED_VALUE(shiftvec); GMX_UNUSED_VALUE(rlistInner); #endif /* GMX_NBNXN_SIMD_2XNN */ diff --git a/src/gromacs/nbnxm/kernels_simd_2xmm/kernel_prune.h b/src/gromacs/nbnxm/kernels_simd_2xmm/kernel_prune.h index ce2b878030..9abafd8b21 100644 --- a/src/gromacs/nbnxm/kernels_simd_2xmm/kernel_prune.h +++ b/src/gromacs/nbnxm/kernels_simd_2xmm/kernel_prune.h @@ -1,7 +1,8 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2016,2017,2019, by the GROMACS development team, led by + * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team. + * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -49,12 +50,18 @@ struct nbnxn_atomdata_t; struct NbnxnPairlistCpu; +namespace gmx +{ +template +class ArrayRef; +} + /*! \brief Prune a single NbnxnPairlistCpu entry with distance \p rlistInner * * Reads a cluster pairlist \p nbl->ciOuter, \p nbl->cjOuter and writes * all cluster pairs within \p rlistInner to \p nbl->ci, \p nbl->cj. */ -void nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu* nbl, - const nbnxn_atomdata_t* nbat, - const rvec* gmx_restrict shift_vec, - real rlistInner); +void nbnxn_kernel_prune_2xnn(NbnxnPairlistCpu* nbl, + const nbnxn_atomdata_t* nbat, + gmx::ArrayRef shift_vec, + real rlistInner); diff --git a/src/gromacs/nbnxm/kernels_simd_4xm/kernel_prune.cpp b/src/gromacs/nbnxm/kernels_simd_4xm/kernel_prune.cpp index d48a526f83..cb2059a713 100644 --- a/src/gromacs/nbnxm/kernels_simd_4xm/kernel_prune.cpp +++ b/src/gromacs/nbnxm/kernels_simd_4xm/kernel_prune.cpp @@ -1,7 +1,8 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2016,2017,2018,2019, by the GROMACS development team, led by + * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team. + * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -48,10 +49,10 @@ #endif /* Prune a single nbnxn_pairtlist_t entry with distance rlistInner */ -void nbnxn_kernel_prune_4xn(NbnxnPairlistCpu* nbl, - const nbnxn_atomdata_t* nbat, - const rvec* gmx_restrict shift_vec, - real rlistInner) +void nbnxn_kernel_prune_4xn(NbnxnPairlistCpu* nbl, + const nbnxn_atomdata_t* nbat, + gmx::ArrayRef shiftvec, + real rlistInner) { #ifdef GMX_NBNXN_SIMD_4XN using namespace gmx; @@ -66,8 +67,7 @@ void nbnxn_kernel_prune_4xn(NbnxnPairlistCpu* nbl, const nbnxn_cj_t* gmx_restrict cjOuter = nbl->cjOuter.data(); nbnxn_cj_t* gmx_restrict cjInner = nbl->cj.data(); - const real* gmx_restrict shiftvec = shift_vec[0]; - const real* gmx_restrict x = nbat->x().data(); + const real* gmx_restrict x = nbat->x().data(); const SimdReal rlist2_S(rlistInner * rlistInner); @@ -85,13 +85,12 @@ void nbnxn_kernel_prune_4xn(NbnxnPairlistCpu* nbl, ciInner[nciInner].cj_ind_start = ncjInner; /* Extract shift data */ - int ish = (ciEntry->shift & NBNXN_CI_SHIFT); - int ish3 = ish * 3; - int ci = ciEntry->ci; + int ish = (ciEntry->shift & NBNXN_CI_SHIFT); + int ci = ciEntry->ci; - SimdReal shX_S = SimdReal(shiftvec[ish3]); - SimdReal shY_S = SimdReal(shiftvec[ish3 + 1]); - SimdReal shZ_S = SimdReal(shiftvec[ish3 + 2]); + SimdReal shX_S = SimdReal(shiftvec[ish][XX]); + SimdReal shY_S = SimdReal(shiftvec[ish][YY]); + SimdReal shZ_S = SimdReal(shiftvec[ish][ZZ]); # if UNROLLJ <= 4 int scix = ci * STRIDE * DIM; @@ -189,7 +188,7 @@ void nbnxn_kernel_prune_4xn(NbnxnPairlistCpu* nbl, GMX_UNUSED_VALUE(nbl); GMX_UNUSED_VALUE(nbat); - GMX_UNUSED_VALUE(shift_vec); + GMX_UNUSED_VALUE(shiftvec); GMX_UNUSED_VALUE(rlistInner); #endif /* GMX_NBNXN_SIMD_4XN */ diff --git a/src/gromacs/nbnxm/kernels_simd_4xm/kernel_prune.h b/src/gromacs/nbnxm/kernels_simd_4xm/kernel_prune.h index ca6113dde9..025ba4a02e 100644 --- a/src/gromacs/nbnxm/kernels_simd_4xm/kernel_prune.h +++ b/src/gromacs/nbnxm/kernels_simd_4xm/kernel_prune.h @@ -1,7 +1,8 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2016,2017,2019, by the GROMACS development team, led by + * Copyright (c) 2012,2013,2014,2015,2016 by the GROMACS development team. + * Copyright (c) 2017,2018,2019,2020,2021, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -49,12 +50,18 @@ struct nbnxn_atomdata_t; struct NbnxnPairlistCpu; +namespace gmx +{ +template +class ArrayRef; +} + /*! \brief Prune a single NbnxnPairlistCpu entry with distance \p rlistInner * * Reads a cluster pairlist \p nbl->ciOuter, \p nbl->cjOuter and writes * all cluster pairs within \p rlistInner to \p nbl->ci, \p nbl->cj. */ -void nbnxn_kernel_prune_4xn(NbnxnPairlistCpu* nbl, - const nbnxn_atomdata_t* nbat, - const rvec* gmx_restrict shift_vec, - real rlistInner); +void nbnxn_kernel_prune_4xn(NbnxnPairlistCpu* nbl, + const nbnxn_atomdata_t* nbat, + gmx::ArrayRef shiftvec, + real rlistInner); diff --git a/src/gromacs/nbnxm/nbnxm.h b/src/gromacs/nbnxm/nbnxm.h index bbfe22453d..b44fcaa808 100644 --- a/src/gromacs/nbnxm/nbnxm.h +++ b/src/gromacs/nbnxm/nbnxm.h @@ -351,7 +351,8 @@ public: bool isDynamicPruningStepGpu(int64_t step) const; //! Dispatches the dynamic pruning kernel for the given locality, for CPU lists - void dispatchPruneKernelCpu(gmx::InteractionLocality iLocality, const rvec* shift_vec) const; + void dispatchPruneKernelCpu(gmx::InteractionLocality iLocality, + gmx::ArrayRef shift_vec) const; //! Dispatches the dynamic pruning kernel for GPU lists void dispatchPruneKernelGpu(int64_t step); diff --git a/src/gromacs/nbnxm/pairlistset.h b/src/gromacs/nbnxm/pairlistset.h index c7f80e9f48..c88a907f37 100644 --- a/src/gromacs/nbnxm/pairlistset.h +++ b/src/gromacs/nbnxm/pairlistset.h @@ -98,7 +98,7 @@ public: SearchCycleCounting* searchCycleCounting); //! Dispatch the kernel for dynamic pairlist pruning - void dispatchPruneKernel(const nbnxn_atomdata_t* nbat, const rvec* shift_vec); + void dispatchPruneKernel(const nbnxn_atomdata_t* nbat, gmx::ArrayRef shift_vec); //! Returns the lists of CPU pairlists gmx::ArrayRef cpuLists() const { return cpuLists_; } diff --git a/src/gromacs/nbnxm/pairlistsets.h b/src/gromacs/nbnxm/pairlistsets.h index 0119680c72..8bbb92d9c4 100644 --- a/src/gromacs/nbnxm/pairlistsets.h +++ b/src/gromacs/nbnxm/pairlistsets.h @@ -2,7 +2,7 @@ * This file is part of the GROMACS molecular simulation package. * * Copyright (c) 2012,2013,2014,2015,2017 by the GROMACS development team. - * Copyright (c) 2018,2019,2020, by the GROMACS development team, led by + * Copyright (c) 2018,2019,2020,2021, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -84,9 +84,9 @@ public: t_nrnb* nrnb); //! Dispatches the dynamic pruning kernel for the given locality - void dispatchPruneKernel(gmx::InteractionLocality iLocality, - const nbnxn_atomdata_t* nbat, - const rvec* shift_vec); + void dispatchPruneKernel(gmx::InteractionLocality iLocality, + const nbnxn_atomdata_t* nbat, + gmx::ArrayRef shift_vec); //! Returns the pair list parameters const PairlistParams& params() const { return params_; } diff --git a/src/gromacs/nbnxm/prunekerneldispatch.cpp b/src/gromacs/nbnxm/prunekerneldispatch.cpp index 4a09d6d94d..f3e4dee503 100644 --- a/src/gromacs/nbnxm/prunekerneldispatch.cpp +++ b/src/gromacs/nbnxm/prunekerneldispatch.cpp @@ -52,12 +52,12 @@ void PairlistSets::dispatchPruneKernel(const gmx::InteractionLocality iLocality, const nbnxn_atomdata_t* nbat, - const rvec* shift_vec) + gmx::ArrayRef shift_vec) { pairlistSet(iLocality).dispatchPruneKernel(nbat, shift_vec); } -void PairlistSet::dispatchPruneKernel(const nbnxn_atomdata_t* nbat, const rvec* shift_vec) +void PairlistSet::dispatchPruneKernel(const nbnxn_atomdata_t* nbat, gmx::ArrayRef shift_vec) { const real rlistInner = params_.rlistInner; @@ -93,7 +93,7 @@ void PairlistSet::dispatchPruneKernel(const nbnxn_atomdata_t* nbat, const rvec* } void nonbonded_verlet_t::dispatchPruneKernelCpu(const gmx::InteractionLocality iLocality, - const rvec* shift_vec) const + gmx::ArrayRef shift_vec) const { pairlistSets_->dispatchPruneKernel(iLocality, nbat.get(), shift_vec); } diff --git a/src/gromacs/pbcutil/pbc.cpp b/src/gromacs/pbcutil/pbc.cpp index 3e6fbb6623..900663ad0c 100644 --- a/src/gromacs/pbcutil/pbc.cpp +++ b/src/gromacs/pbcutil/pbc.cpp @@ -1196,7 +1196,7 @@ void pbc_dx_d(const t_pbc* pbc, const dvec x1, const dvec x2, dvec dx) } } -void calc_shifts(const matrix box, rvec shift_vec[]) +void calc_shifts(const matrix box, gmx::ArrayRef shift_vec) { for (int n = 0, m = -D_BOX_Z; m <= D_BOX_Z; m++) { diff --git a/src/gromacs/pbcutil/pbc.h b/src/gromacs/pbcutil/pbc.h index 17ccfbcf5a..fce60b814f 100644 --- a/src/gromacs/pbcutil/pbc.h +++ b/src/gromacs/pbcutil/pbc.h @@ -283,7 +283,7 @@ void pbc_dx_d(const t_pbc* pbc, const dvec x1, const dvec x2, dvec dx); * \param[in] box The simulation box * \param[out] shift_vec The shifting vectors */ -void calc_shifts(const matrix box, rvec shift_vec[]); +void calc_shifts(const matrix box, gmx::ArrayRef shift_vec); /*! \brief Calculates the center of the box. * diff --git a/src/gromacs/pbcutil/tests/pbc.cpp b/src/gromacs/pbcutil/tests/pbc.cpp index 47e3cf5bbc..6ad87561fa 100644 --- a/src/gromacs/pbcutil/tests/pbc.cpp +++ b/src/gromacs/pbcutil/tests/pbc.cpp @@ -1,7 +1,7 @@ /* * This file is part of the GROMACS molecular simulation package. * - * Copyright (c) 2019, by the GROMACS development team, led by + * Copyright (c) 2019,2021, by the GROMACS development team, led by * Mark Abraham, David van der Spoel, Berk Hess, and Erik Lindahl, * and including many others, as listed in the AUTHORS file in the * top-level source directory and at http://www.gromacs.org. @@ -47,6 +47,7 @@ #include "gromacs/math/vectypes.h" #include "gromacs/pbcutil/ishift.h" +#include "gromacs/utility/arrayref.h" #include "testutils/refdata.h" @@ -61,8 +62,8 @@ TEST(PbcTest, CalcShiftsWorks) // Choose box vector entries whose magnitudes will lead to unique // shift vector values when the largest box shift in any dimension // is two. - const matrix box = { { 0.01, 1, -100 }, { 300, -0.03, 3 }, { -6, -600, 0.06 } }; - rvec shiftVectors[SHIFTS]; + const matrix box = { { 0.01, 1, -100 }, { 300, -0.03, 3 }, { -6, -600, 0.06 } }; + std::vector shiftVectors(SHIFTS); calc_shifts(box, shiftVectors); -- 2.22.0