return numAtoms/(size[XX]*size[YY]*size[ZZ]);
}
-void Grid::setDimensions(const int ddZone,
- const int numAtoms,
- const rvec lowerCorner,
- const rvec upperCorner,
- real atomDensity,
- const real maxAtomGroupRadius,
- const bool haveFep)
+void Grid::setDimensions(const int ddZone,
+ const int numAtoms,
+ const rvec lowerCorner,
+ const rvec upperCorner,
+ real atomDensity,
+ const real maxAtomGroupRadius,
+ const bool haveFep,
+ gmx::PinningPolicy pinningPolicy)
{
/* For the home zone we compute the density when not set (=-1) or when =0 */
if (ddZone == 0 && atomDensity <= 0)
/* We need one additional cell entry for particles moved by DD */
cxy_na_.resize(numColumns() + 1);
cxy_ind_.resize(numColumns() + 2);
- changePinningPolicy(&cxy_na_, gmx::PinningPolicy::PinnedIfSupported);
- changePinningPolicy(&cxy_ind_, gmx::PinningPolicy::PinnedIfSupported);
+ changePinningPolicy(&cxy_na_, pinningPolicy);
+ changePinningPolicy(&cxy_ind_, pinningPolicy);
/* Worst case scenario of 1 atom in each last cell */
int maxNumCells;
const rvec upperCorner,
real atomDensity,
real maxAtomGroupRadius,
- bool haveFep);
+ bool haveFep,
+ gmx::PinningPolicy pinningPolicy);
//! Sets the cell indices using indices in \p gridSetData and \p gridWork
void setCellIndices(int ddZone,
const gmx_domdec_zones_t *ddZones,
const PairlistType pairlistType,
const bool haveFep,
- const int numThreads) :
+ const int numThreads,
+ gmx::PinningPolicy pinningPolicy) :
domainSetup_(ePBC, numDDCells, ddZones),
grids_(numDDZones(domainSetup_.haveMultipleDomainsPerDim), Grid(pairlistType, haveFep_)),
haveFep_(haveFep),
gridWork_(numThreads)
{
clear_mat(box_);
- changePinningPolicy(&gridSetData_.cells, gmx::PinningPolicy::PinnedIfSupported);
- changePinningPolicy(&gridSetData_.atomIndices, gmx::PinningPolicy::PinnedIfSupported);
+ changePinningPolicy(&gridSetData_.cells, pinningPolicy);
+ changePinningPolicy(&gridSetData_.atomIndices, pinningPolicy);
}
void GridSet::setLocalAtomOrder()
/* We always use the home zone (grid[0]) for setting the cell size,
* since determining densities for non-local zones is difficult.
*/
+ // grid data used in GPU transfers inherits the gridset pinnin policy
+ auto pinPolicy = gridSetData_.cells.get_allocator().pinningPolicy();
grid.setDimensions(ddZone, n - numAtomsMoved,
lowerCorner, upperCorner,
atomDensity,
maxAtomGroupRadius,
- haveFep_);
+ haveFep_,
+ pinPolicy);
for (GridWork &work : gridWork_)
{
const gmx_domdec_zones_t *ddZones,
PairlistType pairlistType,
bool haveFep,
- int numThreads);
+ int numThreads,
+ gmx::PinningPolicy pinningPolicy);
//! Puts the atoms in \p ddZone on the grid and copies the coordinates to \p nbat
void putOnGrid(const matrix box,
enbnxninitcombrule = enbnxninitcombruleNONE;
}
- auto nbat =
- std::make_unique<nbnxn_atomdata_t>(useGpu ? gmx::PinningPolicy::PinnedIfSupported : gmx::PinningPolicy::CannotBePinned);
+ auto pinPolicy = (useGpu ? gmx::PinningPolicy::PinnedIfSupported : gmx::PinningPolicy::CannotBePinned);
- int mimimumNumEnergyGroupNonbonded = ir->opts.ngener;
+ auto nbat = std::make_unique<nbnxn_atomdata_t>(pinPolicy);
+
+ int mimimumNumEnergyGroupNonbonded = ir->opts.ngener;
if (ir->opts.ngener - ir->nwall == 1)
{
/* We have only one non-wall energy group, we do not need energy group
DOMAINDECOMP(cr) ? domdec_zones(cr->dd) : nullptr,
pairlistParams.pairlistType,
bFEP_NonBonded,
- gmx_omp_nthreads_get(emntPairsearch));
+ gmx_omp_nthreads_get(emntPairsearch),
+ pinPolicy);
return std::make_unique<nonbonded_verlet_t>(std::move(pairlistSets),
std::move(pairSearch),
const gmx_domdec_zones_t *ddZones,
const PairlistType pairlistType,
const bool haveFep,
- const int maxNumThreads) :
- gridSet_(ePBC, numDDCells, ddZones, pairlistType, haveFep, maxNumThreads),
+ const int maxNumThreads,
+ gmx::PinningPolicy pinningPolicy) :
+ gridSet_(ePBC, numDDCells, ddZones, pairlistType, haveFep, maxNumThreads, pinningPolicy),
work_(maxNumThreads)
{
cycleCounting_.recordCycles_ = (getenv("GMX_NBNXN_CYCLE") != nullptr);
const gmx_domdec_zones_t *zones,
PairlistType pairlistType,
bool haveFep,
- int maxNumthreads);
+ int maxNumthreads,
+ gmx::PinningPolicy pinningPolicy);
//! Sets the order of the local atoms to the order grid atom ordering
void setLocalAtomOrder()