Collective Variables Module - Developer Documentation
Loading...
Searching...
No Matches
colvarproxy_gpu.h
Go to the documentation of this file.
1#ifndef COLVARPROXY_GPU_H
2#define COLVARPROXY_GPU_H
3
4#include "colvar_gpu_support.h"
5#include "colvarmodule.h"
6#include <array>
7
17public:
21 bool has_gpu_support() const {
22 return support_gpu;
23 }
25 std::string gpu_name() const;
27 std::string gpu_bus_id() const;
29 int gpu_device_id() const;
31 std::string gpu_platform() const;
33 int gpu_warp_size() const;
34#if defined (COLVARS_CUDA) || defined (COLVARS_HIP) || defined (COLVARS_SYCL)
36 virtual cudaStream_t get_default_stream() {return (cudaStream_t)0;}
38 int init_gpu();
40 enum class event_type {
41 copy_atoms,
42 update_lattice,
43 num_event_types,
44 };
46 cudaEvent_t get_event(event_type type) const {return events[static_cast<int>(type)];}
55 template <typename T>
56 int allocate_host(T **pp, const size_t len) {
57 return allocate_host_T((void **)pp, len, sizeof(T));
58 }
66 template <typename T>
67 int deallocate_host(T **pp) {
68 return deallocate_host_T((void **)pp);
69 }
78 template <typename T>
79 int allocate_device(T **pp, const size_t len) {
80 return allocate_device_T((void **)pp, len, sizeof(T));
81 }
93 template <typename T>
94 int reallocate_device(T **pp, const size_t len) {
95 int error_code = COLVARS_OK;
96 error_code |= deallocate_device(pp);
97 error_code |= allocate_device_T((void **)pp, len, sizeof(T));
98 return error_code;
99 }
111 template <typename T>
112 int reallocate_host(T **pp, const size_t len) {
113 int error_code = COLVARS_OK;
114 error_code |= deallocate_host(pp);
115 error_code |= allocate_host_T((void **)pp, len, sizeof(T));
116 return error_code;
117 }
127 template <typename T>
128 int allocate_device_async(T **pp, const size_t len, cudaStream_t stream) {
129 return allocate_device_T_async((void **)pp, len, sizeof(T), stream);
130 }
138 template <typename T>
139 int deallocate_device(T **pp) {
140 return deallocate_device_T((void **)pp);
141 }
150 template <typename T>
151 int deallocate_device_async(T **pp, cudaStream_t stream) {
152 return deallocate_device_T_async((void **)pp, stream);
153 }
162 template <typename T>
163 int clear_device_array(T *data, const size_t ndata) {
164 return clear_device_array_T(data, ndata, sizeof(T));
165 }
175 template <typename T>
176 int clear_device_array_async(T *data, const size_t ndata, cudaStream_t stream) {
177 return clear_device_array_T_async(data, ndata, sizeof(T), stream);
178 }
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));
191 }
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);
205 }
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));
218 }
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);
232 }
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));
245 }
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);
259 }
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);
280 virtual float* proxy_atoms_masses_gpu_float() {return nullptr;}
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;}
288#endif // defined (COLVARS_CUDA) || defined (COLVARS_HIP)
290 virtual ~colvarproxy_gpu();
291protected:
296#if defined (COLVARS_CUDA) || defined (COLVARS_HIP)
297 std::array<cudaEvent_t, static_cast<int>(event_type::num_event_types)> events = {};
298#endif
299};
300
301#endif // COLVARPROXY_GPU_H
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.