return true;
}
+/*! \brief Free a device-side buffer.
+ * TODO: fully replace cu_free_buffered with this.
+ *
+ * \param[in] buffer Pointer to the buffer to free.
+ */
+template <typename DeviceBuffer>
+void freeDeviceBuffer(DeviceBuffer *buffer)
+{
+ GMX_ASSERT(buffer, "needs a buffer pointer");
+ if (*buffer)
+ {
+ GMX_RELEASE_ASSERT(cudaFree(*buffer) == cudaSuccess, "cudaFree failed");
+ }
+}
+
#endif
/*
* This file is part of the GROMACS molecular simulation package.
*
- * Copyright (c) 2014,2015,2016,2017, by the GROMACS development team, led by
+ * Copyright (c) 2014,2015,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.
return false;
}
+/*! \brief Free a device-side buffer.
+ * TODO: fully replace free_ocl_buffer and ocl_free_buffered with this.
+ *
+ * \param[in] buffer Pointer to the buffer to free.
+ */
+template <typename DeviceBuffer>
+void freeDeviceBuffer(DeviceBuffer *buffer)
+{
+ GMX_ASSERT(buffer, "needs a buffer pointer");
+ if (*buffer)
+ {
+ GMX_RELEASE_ASSERT(clReleaseMemObject(*buffer) == CL_SUCCESS, "clReleaseMemObject failed");
+ }
+}
+
#endif
cudaError_t stat;
cu_atomdata_t *atdat;
cu_nbparam_t *nbparam;
- cu_plist_t *plist, *plist_nl;
if (nb == NULL)
{
atdat = nb->atdat;
nbparam = nb->nbparam;
- plist = nb->plist[eintLocal];
- plist_nl = nb->plist[eintNonlocal];
nbnxn_cuda_free_nbparam_table(nbparam, nb->dev_info);
cu_free_buffered(atdat->atom_types, &atdat->ntypes);
cu_free_buffered(atdat->lj_comb);
- cu_free_buffered(plist->sci, &plist->nsci, &plist->sci_nalloc);
- cu_free_buffered(plist->cj4, &plist->ncj4, &plist->cj4_nalloc);
- cu_free_buffered(plist->imask, &plist->nimask, &plist->imask_nalloc);
- cu_free_buffered(plist->excl, &plist->nexcl, &plist->excl_nalloc);
+ /* Free plist */
+ auto *plist = nb->plist[eintLocal];
+ freeDeviceBuffer(&plist->sci);
+ freeDeviceBuffer(&plist->cj4);
+ freeDeviceBuffer(&plist->imask);
+ freeDeviceBuffer(&plist->excl);
+ sfree(plist);
if (nb->bUseTwoStreams)
{
- cu_free_buffered(plist_nl->sci, &plist_nl->nsci, &plist_nl->sci_nalloc);
- cu_free_buffered(plist_nl->cj4, &plist_nl->ncj4, &plist_nl->cj4_nalloc);
- cu_free_buffered(plist_nl->imask, &plist_nl->nimask, &plist_nl->imask_nalloc);
- cu_free_buffered(plist_nl->excl, &plist_nl->nexcl, &plist->excl_nalloc);
+ auto *plist_nl = nb->plist[eintNonlocal];
+ freeDeviceBuffer(&plist_nl->sci);
+ freeDeviceBuffer(&plist_nl->cj4);
+ freeDeviceBuffer(&plist_nl->imask);
+ freeDeviceBuffer(&plist_nl->excl);
+ sfree(plist_nl);
}
sfree(atdat);
sfree(nbparam);
- sfree(plist);
- if (nb->bUseTwoStreams)
- {
- sfree(plist_nl);
- }
sfree(nb->timings);
sfree(nb);
sfree(nb->nbparam);
/* Free plist */
- free_ocl_buffer(&(nb->plist[eintLocal]->sci));
- free_ocl_buffer(&(nb->plist[eintLocal]->cj4));
- free_ocl_buffer(&(nb->plist[eintLocal]->imask));
- free_ocl_buffer(&(nb->plist[eintLocal]->excl));
- sfree(nb->plist[eintLocal]);
+ auto *plist = nb->plist[eintLocal];
+ freeDeviceBuffer(&plist->sci);
+ freeDeviceBuffer(&plist->cj4);
+ freeDeviceBuffer(&plist->imask);
+ freeDeviceBuffer(&plist->excl);
+ sfree(plist);
if (nb->bUseTwoStreams)
{
- free_ocl_buffer(&(nb->plist[eintNonlocal]->sci));
- free_ocl_buffer(&(nb->plist[eintNonlocal]->cj4));
- free_ocl_buffer(&(nb->plist[eintNonlocal]->imask));
- free_ocl_buffer(&(nb->plist[eintNonlocal]->excl));
- sfree(nb->plist[eintNonlocal]);
+ auto *plist_nl = nb->plist[eintNonlocal];
+ freeDeviceBuffer(&plist_nl->sci);
+ freeDeviceBuffer(&plist_nl->cj4);
+ freeDeviceBuffer(&plist_nl->imask);
+ freeDeviceBuffer(&plist_nl->excl);
+ sfree(plist_nl);
}
/* Free nbst */