/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2016,2017,2018, 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.
#include "gmxpre.h"
-#include "config.h"
-
#include "gromacs/gpu_utils/cuda_arch_utils.cuh"
#include "gromacs/gpu_utils/cudautils.cuh"
#include "gromacs/utility/exceptions.h"
//! Solving kernel max block size in threads
constexpr int c_solveMaxThreadsPerBlock = (c_solveMaxWarpsPerBlock * warp_size);
-// CUDA 6.5 can not compile enum class as a template kernel parameter,
-// so we replace it with a duplicate simple enum
-#if GMX_CUDA_VERSION >= 7000
-using GridOrderingInternal = GridOrdering;
-#else
-enum GridOrderingInternal
-{
- YZX,
- XYZ
-};
-#endif
-
/*! \brief
* PME complex grid solver kernel function.
*
* \param[in] kernelParams Input PME CUDA data in constant memory.
*/
template<
- GridOrderingInternal gridOrdering,
+ GridOrdering gridOrdering,
bool computeEnergyAndVirial
>
__launch_bounds__(c_solveMaxThreadsPerBlock)
int majorDim, middleDim, minorDim;
switch (gridOrdering)
{
- case GridOrderingInternal::YZX:
+ case GridOrdering::YZX:
majorDim = YY;
middleDim = ZZ;
minorDim = XX;
break;
- case GridOrderingInternal::XYZ:
+ case GridOrdering::XYZ:
majorDim = XX;
middleDim = YY;
minorDim = ZZ;
const int kMiddle = indexMiddle + localOffsetMiddle;
float mMiddle = kMiddle;
/* Checking Y in XYZ case */
- if (gridOrdering == GridOrderingInternal::XYZ)
+ if (gridOrdering == GridOrdering::XYZ)
{
mMiddle = (kMiddle < maxkMiddle) ? kMiddle : (kMiddle - nMiddle);
}
const int kMinor = localOffsetMinor + indexMinor;
float mMinor = kMinor;
/* Checking X in YZX case */
- if (gridOrdering == GridOrderingInternal::YZX)
+ if (gridOrdering == GridOrdering::YZX)
{
mMinor = (kMinor < maxkMinor) ? kMinor : (kMinor - nMinor);
}
float mX, mY, mZ;
switch (gridOrdering)
{
- case GridOrderingInternal::YZX:
+ case GridOrdering::YZX:
mX = mMinor;
mY = mMajor;
mZ = mMiddle;
break;
- case GridOrderingInternal::XYZ:
+ case GridOrdering::XYZ:
mX = mMajor;
mY = mMiddle;
mZ = mMinor;
float corner_fac = 1.0f;
switch (gridOrdering)
{
- case GridOrderingInternal::YZX:
+ case GridOrdering::YZX:
if ((kMiddle == 0) | (kMiddle == maxkMiddle))
{
corner_fac = 0.5f;
}
break;
- case GridOrderingInternal::XYZ:
+ case GridOrdering::XYZ:
if ((kMinor == 0) | (kMinor == maxkMinor))
{
corner_fac = 0.5f;
{
if (computeEnergyAndVirial)
{
- pme_solve_kernel<GridOrderingInternal::YZX, true> <<< blocks, threads, 0, stream>>> (*kernelParamsPtr);
+ pme_solve_kernel<GridOrdering::YZX, true> <<< blocks, threads, 0, stream>>> (*kernelParamsPtr);
}
else
{
- pme_solve_kernel<GridOrderingInternal::YZX, false> <<< blocks, threads, 0, stream>>> (*kernelParamsPtr);
+ pme_solve_kernel<GridOrdering::YZX, false> <<< blocks, threads, 0, stream>>> (*kernelParamsPtr);
}
}
else if (gridOrdering == GridOrdering::XYZ)
{
if (computeEnergyAndVirial)
{
- pme_solve_kernel<GridOrderingInternal::XYZ, true> <<< blocks, threads, 0, stream>>> (*kernelParamsPtr);
+ pme_solve_kernel<GridOrdering::XYZ, true> <<< blocks, threads, 0, stream>>> (*kernelParamsPtr);
}
else
{
- pme_solve_kernel<GridOrderingInternal::XYZ, false> <<< blocks, threads, 0, stream>>> (*kernelParamsPtr);
+ pme_solve_kernel<GridOrdering::XYZ, false> <<< blocks, threads, 0, stream>>> (*kernelParamsPtr);
}
}
CU_LAUNCH_ERR("pme_solve_kernel");