Feature #2816: Device-side update&constraits, buffer ops and multi-gpu comms
CUDA Update and Constraints module
LINCS for non-water constraints. SETTLE for water constraints. Leap frog integrator. Merge of the three into single module.
- Remove the scaffolding from LINCS, SETTLE and Leap-Frog:
Coordinates, velocities, forces management.
- PBC management.
- Virial reduction.
- Update tests.
- Remove Impl.
- Template computeVirial and updateVelocities
Combine CUDA Leap-Frog, LINCS and SETTLE. I.
This is the first step in combining constraints and integrator
into "UpdateAndConstraints" module. The initial merge does not
imply any performance optimisation or code clean-up. Hence, this
patch keeps all the temporary infrastructure that was built
around SETTLE, LINCS and Leap-Frog to allow them to function as
a separate units. In the following commits, this infrastructure
will be removed and these three implementations will be more closely
integrated. To enable, set GMX_UPDATE_CONSTRAIN_GPU environment
variable. Note, that environment variables GMX_LINCS_GPU,
GMX_SETTLE_GPU and GMX_INTEGRATE_GPU will no longer work.
Combine CUDA Leap-Frog, LINCS and SETTLE. II.
Stand-alone CUDA implementations of Leap-Frog, LINCS
and SETTLE required additional scaffolding for integration
and testing. The most prominent part of this is the
management of coordinates, velocities and forces, which
is removed in this commit. Management of periodic boundary
conditions and virial reduction will be removed in
Memory management fixes in CUDA version of LINCS
This fix is to prepare LINCS to run with DD.
1. The masses array size depends on the current number of atoms
rather than on the number of constraints.
2. The size of other arrays should be based on the number of
threads launched on the GPU, which include padding added to
align coupled constraints with the thread blocks. Also
renamed variable according to conventions.
Remove PImpl scaffolding from CUDA version of LINCS
The CUDA implementation of LINCS was initially introduced as a
stand-alone feature. This required hiding CUDA-specific variables
and subroutines into the private implementation subclass. Since the
LINCS is not a part of Update and Constraints module, this is no
longer required and can be removed.