1#ifndef COLVARPROXY_GPU_H
2#define COLVARPROXY_GPU_H
4#include "colvar_gpu_support.h"
34#if defined (COLVARS_CUDA) || defined (COLVARS_HIP) || defined (COLVARS_SYCL)
68 return deallocate_host_T((
void **)pp);
80 return allocate_device_T((
void **)pp, len,
sizeof(T));
95 int error_code = COLVARS_OK;
97 error_code |= allocate_device_T((
void **)pp, len,
sizeof(T));
111 template <
typename T>
113 int error_code = COLVARS_OK;
127 template <
typename T>
129 return allocate_device_T_async((
void **)pp, len,
sizeof(T), stream);
138 template <
typename T>
140 return deallocate_device_T((
void **)pp);
150 template <
typename T>
152 return deallocate_device_T_async((
void **)pp, stream);
162 template <
typename T>
164 return clear_device_array_T(data, ndata,
sizeof(T));
175 template <
typename T>
177 return clear_device_array_T_async(data, ndata,
sizeof(T), stream);
188 template <
typename T>
189 int copy_HtoD(
const T *h_array, T *d_array,
size_t array_len) {
190 return copy_HtoD_T(h_array, d_array, array_len,
sizeof(T));
202 template <
typename T>
203 int copy_HtoD_async(
const T *h_array, T *d_array,
size_t array_len, cudaStream_t stream) {
204 return copy_HtoD_T_async(h_array, d_array, array_len,
sizeof(T), stream);
215 template <
typename T>
216 int copy_DtoH(
const T *d_array, T *h_array,
size_t array_len) {
217 return copy_DtoH_T(d_array, h_array, array_len,
sizeof(T));
229 template <
typename T>
230 int copy_DtoH_async(
const T *d_array, T *h_array,
size_t array_len, cudaStream_t stream) {
231 return copy_DtoH_T_async(d_array, h_array, array_len,
sizeof(T), stream);
242 template <
typename T>
243 int copy_DtoD(
const T *d_src, T *d_dst,
size_t array_len) {
244 return copy_DtoD_T(d_src, d_dst, array_len,
sizeof(T));
256 template <
typename T>
257 int copy_DtoD_async(
const T *d_src, T *d_dst,
size_t array_len, cudaStream_t stream) {
258 return copy_DtoD_T_async(d_src, d_dst, array_len,
sizeof(T), stream);
262 virtual int allocate_host_T(
void **pp,
const size_t len,
const size_t sizeofT);
263 virtual int deallocate_host_T(
void **pp);
264 virtual int allocate_device_T(
void **pp,
const size_t len,
const size_t sizeofT);
265 virtual int deallocate_device_T(
void **pp);
266 virtual int clear_device_array_T(
void *data,
const size_t ndata,
const size_t sizeofT);
267 virtual int allocate_device_T_async(
void **pp,
const size_t len,
const size_t sizeofT, cudaStream_t stream);
268 virtual int deallocate_device_T_async(
void **pp, cudaStream_t stream);
269 virtual int clear_device_array_T_async(
void *data,
const size_t ndata,
const size_t sizeofT, cudaStream_t stream);
270 virtual int copy_HtoD_T(
const void *h_array,
void *d_array,
size_t array_len,
const size_t sizeofT);
271 virtual int copy_HtoD_T_async(
const void *h_array,
void *d_array,
size_t array_len,
const size_t sizeofT, cudaStream_t stream);
272 virtual int copy_DtoH_T(
const void *d_array,
void *h_array,
size_t array_len,
const size_t sizeofT);
273 virtual int copy_DtoH_T_async(
const void *d_array,
void *h_array,
size_t array_len,
const size_t sizeofT, cudaStream_t stream);
274 virtual int copy_DtoD_T(
const void *d_src,
void *d_dst,
size_t array_len,
const size_t sizeofT);
275 virtual int copy_DtoD_T_async(
const void *d_src,
void *d_dst,
size_t array_len,
const size_t sizeofT, cudaStream_t stream);
281 virtual float* proxy_atoms_charges_gpu_float() {
return nullptr;}
282 virtual cvm::real* proxy_atoms_masses_gpu() {
return nullptr;}
283 virtual cvm::real* proxy_atoms_charges_gpu() {
return nullptr;}
284 virtual cvm::real* proxy_atoms_positions_gpu() {
return nullptr;}
285 virtual cvm::real* proxy_atoms_total_forces_gpu() {
return nullptr;}
286 virtual cvm::real* proxy_atoms_new_colvar_forces_gpu() {
return nullptr;}
290 virtual ~colvarproxy_gpu();
296#if defined (COLVARS_CUDA) || defined (COLVARS_HIP)
297 std::array<cudaEvent_t, static_cast<int>(event_type::num_event_types)> events = {};
double real
Defining an abstract real number allows to switch precision.
Definition: colvarmodule.h:98
Class for managing GPU memory allocation and data transfer.
Definition: colvarproxy_gpu.h:16
event_type
Available CUDA event types.
Definition: colvarproxy_gpu.h:40
int reallocate_device(T **pp, const size_t len)
Template function to reallocate device memory.
Definition: colvarproxy_gpu.h:94
std::string gpu_name() const
Get the GPU name.
Definition: colvarproxy_gpu.cpp:138
int copy_HtoD(const T *h_array, T *d_array, size_t array_len)
Template function to copy data from host to device.
Definition: colvarproxy_gpu.h:189
int deallocate_device_async(T **pp, cudaStream_t stream)
Template function to deallocate device memory asynchronously.
Definition: colvarproxy_gpu.h:151
int warp_size
Warp size.
Definition: colvarproxy_gpu.h:295
int copy_DtoH(const T *d_array, T *h_array, size_t array_len)
Template function to copy data from device to host.
Definition: colvarproxy_gpu.h:216
int reallocate_host(T **pp, const size_t len)
Template function to reallocate host-pinned memory.
Definition: colvarproxy_gpu.h:112
int gpu_device_id() const
Get the GPU device number.
Definition: colvarproxy_gpu.cpp:128
int gpu_warp_size() const
CUDA warp size or HIP wave front size.
Definition: colvarproxy_gpu.cpp:172
virtual int allocate_host_T(void **pp, const size_t len, const size_t sizeofT)
Memory management and data transfer implementations.
Definition: colvarproxy_gpu.cpp:7
int copy_DtoD(const T *d_src, T *d_dst, size_t array_len)
Template function to copy data from device to device.
Definition: colvarproxy_gpu.h:243
std::string gpu_bus_id() const
Get the GPU PCI bus ID.
Definition: colvarproxy_gpu.cpp:149
int deallocate_device(T **pp)
Template function to deallocate device memory.
Definition: colvarproxy_gpu.h:139
virtual float * proxy_atoms_masses_gpu_float()
Functions to get device pointers for atom properties This functions should be overridden in derived p...
Definition: colvarproxy_gpu.h:280
std::string gpu_platform() const
Get the GPU platform (CUDA, HIP or SYCL)
Definition: colvarproxy_gpu.cpp:160
int copy_DtoH_async(const T *d_array, T *h_array, size_t array_len, cudaStream_t stream)
Template function to copy data from device to host asynchronously.
Definition: colvarproxy_gpu.h:230
virtual cudaStream_t get_default_stream()
Get the default CUDA stream from the proxy.
Definition: colvarproxy_gpu.h:36
int clear_device_array_async(T *data, const size_t ndata, cudaStream_t stream)
Template function to clear a device array to zero asynchronously.
Definition: colvarproxy_gpu.h:176
int copy_DtoD_async(const T *d_src, T *d_dst, size_t array_len, cudaStream_t stream)
Template function to copy data from device to device asynchronously.
Definition: colvarproxy_gpu.h:257
int allocate_device(T **pp, const size_t len)
Template function to allocate device memory.
Definition: colvarproxy_gpu.h:79
int allocate_host(T **pp, const size_t len)
Template function to allocate host-pinned memory.
Definition: colvarproxy_gpu.h:56
bool has_gpu_support() const
Whether the proxy supports GPU.
Definition: colvarproxy_gpu.h:21
cudaEvent_t get_event(event_type type) const
Get the default CUDA event from the proxy.
Definition: colvarproxy_gpu.h:46
int deallocate_host(T **pp)
Template function to deallocate host-pinned memory.
Definition: colvarproxy_gpu.h:67
int clear_device_array(T *data, const size_t ndata)
Template function to clear a device array to zero.
Definition: colvarproxy_gpu.h:163
int init_gpu()
Initialize the GPU data (called by colvarproxy::setup)
Definition: colvarproxy_gpu.cpp:100
bool support_gpu
Whether the proxy supports GPU.
Definition: colvarproxy_gpu.h:293
colvarproxy_gpu()
Constructor.
Definition: colvarproxy_gpu.h:19
int allocate_device_async(T **pp, const size_t len, cudaStream_t stream)
Template function to allocate device memory asynchronously.
Definition: colvarproxy_gpu.h:128
int copy_HtoD_async(const T *h_array, T *d_array, size_t array_len, cudaStream_t stream)
Template function to copy data from host to device asynchronously.
Definition: colvarproxy_gpu.h:203
Collective variables main module.