NAMD
Functions
CudaUtils.C File Reference
#include <stdio.h>
#include "common.h"
#include "charm++.h"
#include "CudaUtils.h"

Go to the source code of this file.

Functions

void cudaDie (const char *msg, cudaError_t err)
 
void curandDie (const char *msg, int err)
 
void cudaNAMD_bug (const char *msg)
 
void cuda_affinity_initialize ()
 
void clear_device_array_async_T (void *data, const size_t ndata, cudaStream_t stream, const size_t sizeofT)
 
void clear_device_array_T (void *data, const size_t ndata, const size_t sizeofT)
 
void allocate_host_T (void **pp, const size_t len, const size_t sizeofT)
 
void allocate_device_T (void **pp, const size_t len, const size_t sizeofT)
 
void allocate_device_T_managed (void **pp, const size_t len, const size_t sizeofT)
 
void allocate_device_T_async (void **pp, const size_t len, const size_t sizeofT, cudaStream_t stream)
 
void deallocate_device_T (void **pp)
 
void deallocate_device_T_async (void **pp, cudaStream_t stream)
 
void deallocate_host_T (void **pp)
 
bool reallocate_device_T (void **pp, size_t *curlen, const size_t newlen, const float fac, const size_t sizeofT)
 
bool reallocate_host_T (void **pp, size_t *curlen, const size_t newlen, const float fac, const unsigned int flag, const size_t sizeofT)
 
void copy_HtoD_async_T (const void *h_array, void *d_array, size_t array_len, cudaStream_t stream, const size_t sizeofT)
 
void copy_HtoD_T (const void *h_array, void *d_array, size_t array_len, const size_t sizeofT)
 
void copy_DtoH_async_T (const void *d_array, void *h_array, const size_t array_len, cudaStream_t stream, const size_t sizeofT)
 
void copy_DtoH_T (const void *d_array, void *h_array, const size_t array_len, const size_t sizeofT)
 
void copy_DtoD_async_T (const void *d_src, void *d_dst, const size_t array_len, cudaStream_t stream, const size_t sizeofT)
 
void copy_DtoD_T (const void *d_src, void *d_dst, const size_t array_len, const size_t sizeofT)
 
void copy_PeerDtoD_async_T (const int src_dev, const int dst_dev, const void *d_src, void *d_dst, const size_t array_len, cudaStream_t stream, const size_t sizeofT)
 
void copy3D_HtoD_T (void *src_data, void *dst_data, int src_x0, int src_y0, int src_z0, size_t src_xsize, size_t src_ysize, int dst_x0, int dst_y0, int dst_z0, size_t dst_xsize, size_t dst_ysize, size_t width, size_t height, size_t depth, size_t sizeofT, cudaStream_t stream)
 
void copy3D_DtoH_T (void *src_data, void *dst_data, int src_x0, int src_y0, int src_z0, size_t src_xsize, size_t src_ysize, int dst_x0, int dst_y0, int dst_z0, size_t dst_xsize, size_t dst_ysize, size_t width, size_t height, size_t depth, size_t sizeofT, cudaStream_t stream)
 
void copy3D_DtoD_T (void *src_data, void *dst_data, int src_x0, int src_y0, int src_z0, size_t src_xsize, size_t src_ysize, int dst_x0, int dst_y0, int dst_z0, size_t dst_xsize, size_t dst_ysize, size_t width, size_t height, size_t depth, size_t sizeofT, cudaStream_t stream)
 
void copy3D_PeerDtoD_T (int src_dev, int dst_dev, void *src_data, void *dst_data, int src_x0, int src_y0, int src_z0, size_t src_xsize, size_t src_ysize, int dst_x0, int dst_y0, int dst_z0, size_t dst_xsize, size_t dst_ysize, size_t width, size_t height, size_t depth, size_t sizeofT, cudaStream_t stream)
 

Function Documentation

◆ allocate_device_T()

void allocate_device_T ( void **  pp,
const size_t  len,
const size_t  sizeofT 
)

Definition at line 97 of file CudaUtils.C.

References cudaCheck.

Referenced by allocate_device(), allocate_device_T_async(), and bindTextureObject().

97  {
98  cudaCheck(cudaMalloc(pp, sizeofT*len));
99 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ allocate_device_T_async()

void allocate_device_T_async ( void **  pp,
const size_t  len,
const size_t  sizeofT,
cudaStream_t  stream 
)

Definition at line 105 of file CudaUtils.C.

References allocate_device_T(), and cudaCheck.

Referenced by allocate_device_async().

105  {
106 #if (CUDART_VERSION >= 11020)
107  cudaCheck(cudaMallocAsync(pp, sizeofT*len, stream));
108 #else
109  allocate_device_T(pp, len, sizeofT);
110 #endif
111 }
void allocate_device_T(void **pp, const size_t len, const size_t sizeofT)
Definition: CudaUtils.C:97
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ allocate_device_T_managed()

void allocate_device_T_managed ( void **  pp,
const size_t  len,
const size_t  sizeofT 
)

Definition at line 101 of file CudaUtils.C.

References cudaCheck.

Referenced by allocate_device_managed().

101  {
102  cudaCheck(cudaMallocManaged(pp, sizeofT*len));
103 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ allocate_host_T()

void allocate_host_T ( void **  pp,
const size_t  len,
const size_t  sizeofT 
)

Definition at line 87 of file CudaUtils.C.

References cudaCheck.

Referenced by allocate_host().

87  {
88  cudaCheck(cudaMallocHost(pp, sizeofT*len));
89 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ clear_device_array_async_T()

void clear_device_array_async_T ( void *  data,
const size_t  ndata,
cudaStream_t  stream,
const size_t  sizeofT 
)

Definition at line 73 of file CudaUtils.C.

References cudaCheck.

Referenced by clear_device_array().

73  {
74  cudaCheck(cudaMemsetAsync(data, 0, sizeofT*ndata, stream));
75 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ clear_device_array_T()

void clear_device_array_T ( void *  data,
const size_t  ndata,
const size_t  sizeofT 
)

Definition at line 77 of file CudaUtils.C.

References cudaCheck.

Referenced by clear_device_array_sync().

77  {
78  cudaCheck(cudaMemset(data, 0, sizeofT*ndata));
79 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy3D_DtoD_T()

void copy3D_DtoD_T ( void *  src_data,
void *  dst_data,
int  src_x0,
int  src_y0,
int  src_z0,
size_t  src_xsize,
size_t  src_ysize,
int  dst_x0,
int  dst_y0,
int  dst_z0,
size_t  dst_xsize,
size_t  dst_ysize,
size_t  width,
size_t  height,
size_t  depth,
size_t  sizeofT,
cudaStream_t  stream 
)

Definition at line 319 of file CudaUtils.C.

References cudaCheck.

Referenced by copy3D_DtoD().

325  {
326  cudaMemcpy3DParms parms = {0};
327 
328  parms.srcPos = make_cudaPos(sizeofT*src_x0, src_y0, src_z0);
329  parms.srcPtr = make_cudaPitchedPtr(src_data, sizeofT*src_xsize, src_xsize, src_ysize);
330 
331  parms.dstPos = make_cudaPos(sizeofT*dst_x0, dst_y0, dst_z0);
332  parms.dstPtr = make_cudaPitchedPtr(dst_data, sizeofT*dst_xsize, dst_xsize, dst_ysize);
333 
334  parms.extent = make_cudaExtent(sizeofT*width, height, depth);
335  parms.kind = cudaMemcpyDeviceToDevice;
336 
337  cudaCheck(cudaMemcpy3DAsync(&parms, stream));
338 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy3D_DtoH_T()

void copy3D_DtoH_T ( void *  src_data,
void *  dst_data,
int  src_x0,
int  src_y0,
int  src_z0,
size_t  src_xsize,
size_t  src_ysize,
int  dst_x0,
int  dst_y0,
int  dst_z0,
size_t  dst_xsize,
size_t  dst_ysize,
size_t  width,
size_t  height,
size_t  depth,
size_t  sizeofT,
cudaStream_t  stream 
)

Definition at line 294 of file CudaUtils.C.

References cudaCheck.

Referenced by copy3D_DtoH().

300  {
301  cudaMemcpy3DParms parms = {0};
302 
303  parms.srcPos = make_cudaPos(sizeofT*src_x0, src_y0, src_z0);
304  parms.srcPtr = make_cudaPitchedPtr(src_data, sizeofT*src_xsize, src_xsize, src_ysize);
305 
306  parms.dstPos = make_cudaPos(sizeofT*dst_x0, dst_y0, dst_z0);
307  parms.dstPtr = make_cudaPitchedPtr(dst_data, sizeofT*dst_xsize, dst_xsize, dst_ysize);
308 
309  parms.extent = make_cudaExtent(sizeofT*width, height, depth);
310  parms.kind = cudaMemcpyDeviceToHost;
311 
312  cudaCheck(cudaMemcpy3DAsync(&parms, stream));
313 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy3D_HtoD_T()

void copy3D_HtoD_T ( void *  src_data,
void *  dst_data,
int  src_x0,
int  src_y0,
int  src_z0,
size_t  src_xsize,
size_t  src_ysize,
int  dst_x0,
int  dst_y0,
int  dst_z0,
size_t  dst_xsize,
size_t  dst_ysize,
size_t  width,
size_t  height,
size_t  depth,
size_t  sizeofT,
cudaStream_t  stream 
)

Definition at line 269 of file CudaUtils.C.

References cudaCheck.

Referenced by copy3D_HtoD().

275  {
276  cudaMemcpy3DParms parms = {0};
277 
278  parms.srcPos = make_cudaPos(sizeofT*src_x0, src_y0, src_z0);
279  parms.srcPtr = make_cudaPitchedPtr(src_data, sizeofT*src_xsize, src_xsize, src_ysize);
280 
281  parms.dstPos = make_cudaPos(sizeofT*dst_x0, dst_y0, dst_z0);
282  parms.dstPtr = make_cudaPitchedPtr(dst_data, sizeofT*dst_xsize, dst_xsize, dst_ysize);
283 
284  parms.extent = make_cudaExtent(sizeofT*width, height, depth);
285  parms.kind = cudaMemcpyHostToDevice;
286 
287  cudaCheck(cudaMemcpy3DAsync(&parms, stream));
288 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy3D_PeerDtoD_T()

void copy3D_PeerDtoD_T ( int  src_dev,
int  dst_dev,
void *  src_data,
void *  dst_data,
int  src_x0,
int  src_y0,
int  src_z0,
size_t  src_xsize,
size_t  src_ysize,
int  dst_x0,
int  dst_y0,
int  dst_z0,
size_t  dst_xsize,
size_t  dst_ysize,
size_t  width,
size_t  height,
size_t  depth,
size_t  sizeofT,
cudaStream_t  stream 
)

Definition at line 344 of file CudaUtils.C.

References cudaCheck, and cudaDie().

Referenced by copy3D_PeerDtoD().

351  {
352 #ifdef NAMD_HIP
353 // TODO-HIP: Is a workaround possible? cudaMemcpy3D+cudaMemcpyPeer+cudaMemcpy3D
354  cudaDie("cudaMemcpy3DPeerAsync is not supported by HIP");
355 #else
356  cudaMemcpy3DPeerParms parms = {0};
357 
358  parms.srcDevice = src_dev;
359  parms.dstDevice = dst_dev;
360 
361  parms.srcPos = make_cudaPos(sizeofT*src_x0, src_y0, src_z0);
362  parms.srcPtr = make_cudaPitchedPtr(src_data, sizeofT*src_xsize, src_xsize, src_ysize);
363 
364  parms.dstPos = make_cudaPos(sizeofT*dst_x0, dst_y0, dst_z0);
365  parms.dstPtr = make_cudaPitchedPtr(dst_data, sizeofT*dst_xsize, dst_xsize, dst_ysize);
366 
367  parms.extent = make_cudaExtent(sizeofT*width, height, depth);
368 
369  cudaCheck(cudaMemcpy3DPeerAsync(&parms, stream));
370 #endif
371 }
void cudaDie(const char *msg, cudaError_t err)
Definition: CudaUtils.C:9
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy_DtoD_async_T()

void copy_DtoD_async_T ( const void *  d_src,
void *  d_dst,
const size_t  array_len,
cudaStream_t  stream,
const size_t  sizeofT 
)

Definition at line 246 of file CudaUtils.C.

References cudaCheck.

Referenced by copy_DtoD().

247  {
248  cudaCheck(cudaMemcpyAsync(d_dst, d_src, sizeofT*array_len, cudaMemcpyDeviceToDevice, stream));
249 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy_DtoD_T()

void copy_DtoD_T ( const void *  d_src,
void *  d_dst,
const size_t  array_len,
const size_t  sizeofT 
)

Definition at line 251 of file CudaUtils.C.

References cudaCheck.

Referenced by copy_DtoD_sync().

251  {
252  cudaCheck(cudaMemcpy(d_dst, d_src, sizeofT*array_len, cudaMemcpyDeviceToDevice));
253 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy_DtoH_async_T()

void copy_DtoH_async_T ( const void *  d_array,
void *  h_array,
const size_t  array_len,
cudaStream_t  stream,
const size_t  sizeofT 
)

Definition at line 233 of file CudaUtils.C.

References cudaCheck.

Referenced by copy_DtoH().

234  {
235  cudaCheck(cudaMemcpyAsync(h_array, d_array, sizeofT*array_len, cudaMemcpyDeviceToHost, stream));
236 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy_DtoH_T()

void copy_DtoH_T ( const void *  d_array,
void *  h_array,
const size_t  array_len,
const size_t  sizeofT 
)

Definition at line 238 of file CudaUtils.C.

References cudaCheck.

Referenced by copy_DtoH_sync().

238  {
239  cudaCheck(cudaMemcpy(h_array, d_array, sizeofT*array_len, cudaMemcpyDeviceToHost));
240 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy_HtoD_async_T()

void copy_HtoD_async_T ( const void *  h_array,
void *  d_array,
size_t  array_len,
cudaStream_t  stream,
const size_t  sizeofT 
)

Definition at line 219 of file CudaUtils.C.

References cudaCheck.

Referenced by copy_HtoD().

220  {
221  cudaCheck(cudaMemcpyAsync(d_array, h_array, sizeofT*array_len, cudaMemcpyHostToDevice, stream));
222 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy_HtoD_T()

void copy_HtoD_T ( const void *  h_array,
void *  d_array,
size_t  array_len,
const size_t  sizeofT 
)

Definition at line 224 of file CudaUtils.C.

References cudaCheck.

Referenced by bindTextureObject(), and copy_HtoD_sync().

225  {
226  cudaCheck(cudaMemcpy(d_array, h_array, sizeofT*array_len, cudaMemcpyHostToDevice));
227 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ copy_PeerDtoD_async_T()

void copy_PeerDtoD_async_T ( const int  src_dev,
const int  dst_dev,
const void *  d_src,
void *  d_dst,
const size_t  array_len,
cudaStream_t  stream,
const size_t  sizeofT 
)

Definition at line 259 of file CudaUtils.C.

References cudaCheck.

Referenced by copy_PeerDtoD().

261  {
262  cudaCheck(cudaMemcpyPeerAsync(d_dst, dst_dev, d_src, src_dev, sizeofT*array_len, stream));
263 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ cuda_affinity_initialize()

void cuda_affinity_initialize ( )

Definition at line 55 of file CudaUtils.C.

Referenced by all_init().

55  {
56  int devcnt = 0;
57  cudaError_t err = cudaGetDeviceCount(&devcnt);
58  if ( devcnt == 1 ) { // only one device so it must be ours
59  int *dummy;
60  if ( err == cudaSuccess ) err = cudaSetDevice(0);
61  if ( err == cudaSuccess ) err = cudaSetDeviceFlags(cudaDeviceMapHost);
62  if ( err == cudaSuccess ) err = cudaMalloc(&dummy, 4);
63  }
64  if ( err != cudaSuccess ) {
65  char host[128];
66  gethostname(host, 128); host[127] = 0;
67  fprintf(stderr,"CUDA initialization error on %s: %s\n", host, cudaGetErrorString(err));
68  }
69 }

◆ cudaDie()

void cudaDie ( const char *  msg,
cudaError_t  err 
)

Definition at line 9 of file CudaUtils.C.

References NAMD_die().

Referenced by copy3D_PeerDtoD_T(), cuda_check_pme_charges(), cuda_check_pme_forces(), and DeviceCUDA::initialize().

9  {
10  char host[128];
11  gethostname(host, 128); host[127] = 0;
12  char devstr[128] = "";
13  int devnum;
14  if ( cudaGetDevice(&devnum) == cudaSuccess ) {
15  sprintf(devstr, " device %d", devnum);
16  }
17  cudaDeviceProp deviceProp;
18  if ( cudaGetDeviceProperties(&deviceProp, devnum) == cudaSuccess ) {
19  sprintf(devstr, " device %d pci %x:%x:%x", devnum,
20  deviceProp.pciDomainID, deviceProp.pciBusID, deviceProp.pciDeviceID);
21  }
22  char errmsg[1024];
23  if (err == cudaSuccess) {
24  sprintf(errmsg,"CUDA error %s on Pe %d (%s%s)", msg, CkMyPe(), host, devstr);
25  } else {
26  sprintf(errmsg,"CUDA error %s on Pe %d (%s%s): %s", msg, CkMyPe(), host, devstr, cudaGetErrorString(err));
27  }
28  NAMD_die(errmsg);
29 }
void NAMD_die(const char *err_msg)
Definition: common.C:147

◆ cudaNAMD_bug()

void cudaNAMD_bug ( const char *  msg)

Definition at line 53 of file CudaUtils.C.

References NAMD_bug().

Referenced by CudaFFTCompute::backward(), and CudaFFTCompute::forward().

53 {NAMD_bug(msg);}
void NAMD_bug(const char *err_msg)
Definition: common.C:195

◆ curandDie()

void curandDie ( const char *  msg,
int  err 
)

Definition at line 31 of file CudaUtils.C.

References NAMD_die().

31  {
32  char host[128];
33  gethostname(host, 128); host[127] = 0;
34  char devstr[128] = "";
35  int devnum;
36  if ( cudaGetDevice(&devnum) == cudaSuccess ) {
37  sprintf(devstr, " device %d", devnum);
38  }
39  cudaDeviceProp deviceProp;
40  if ( cudaGetDeviceProperties(&deviceProp, devnum) == cudaSuccess ) {
41  sprintf(devstr, " device %d pci %x:%x:%x", devnum,
42  deviceProp.pciDomainID, deviceProp.pciBusID, deviceProp.pciDeviceID);
43  }
44  char errmsg[1024];
45  if (err == cudaSuccess) {
46  sprintf(errmsg,"CUDA cuRAND error %s on Pe %d (%s%s)", msg, CkMyPe(), host, devstr);
47  } else {
48  sprintf(errmsg,"CUDA cuRAND error %s on Pe %d (%s%s): status value %d", msg, CkMyPe(), host, devstr, err);
49  }
50  NAMD_die(errmsg);
51 }
void NAMD_die(const char *err_msg)
Definition: common.C:147

◆ deallocate_device_T()

void deallocate_device_T ( void **  pp)

Definition at line 118 of file CudaUtils.C.

References cudaCheck.

Referenced by deallocate_device(), and deallocate_device_T_async().

118  {
119 
120  if (*pp != NULL) {
121  cudaCheck(cudaFree((void *)(*pp)));
122  *pp = NULL;
123  }
124 
125 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ deallocate_device_T_async()

void deallocate_device_T_async ( void **  pp,
cudaStream_t  stream 
)

Definition at line 127 of file CudaUtils.C.

References cudaCheck, and deallocate_device_T().

Referenced by deallocate_device_async().

127  {
128 #if (CUDART_VERSION >= 11020)
129  if (*pp != NULL) {
130  cudaCheck(cudaFreeAsync((void *)(*pp), stream));
131  *pp = NULL;
132  }
133 #else
135 #endif
136 }
void deallocate_device_T(void **pp)
Definition: CudaUtils.C:118
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ deallocate_host_T()

void deallocate_host_T ( void **  pp)

Definition at line 142 of file CudaUtils.C.

References cudaCheck.

Referenced by deallocate_host().

142  {
143 
144  if (*pp != NULL) {
145  cudaCheck(cudaFreeHost((void *)(*pp)));
146  *pp = NULL;
147  }
148 
149 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ reallocate_device_T()

bool reallocate_device_T ( void **  pp,
size_t *  curlen,
const size_t  newlen,
const float  fac,
const size_t  sizeofT 
)

Definition at line 161 of file CudaUtils.C.

References cudaCheck.

Referenced by reallocate_device().

161  {
162 
163  if (*pp != NULL && *curlen < newlen) {
164  cudaCheck(cudaFree((void *)(*pp)));
165  *pp = NULL;
166  }
167 
168  if (*pp == NULL) {
169  if (fac > 1.0f) {
170  *curlen = (size_t)(((double)(newlen))*(double)fac);
171  } else {
172  *curlen = newlen;
173  }
174  cudaCheck(cudaMalloc(pp, sizeofT*(*curlen)));
175  return true;
176  }
177 
178  return false;
179 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233

◆ reallocate_host_T()

bool reallocate_host_T ( void **  pp,
size_t *  curlen,
const size_t  newlen,
const float  fac,
const unsigned int  flag,
const size_t  sizeofT 
)

Definition at line 194 of file CudaUtils.C.

References cudaCheck.

Referenced by reallocate_host().

195  {
196 
197  if (*pp != NULL && *curlen < newlen) {
198  cudaCheck(cudaFreeHost((void *)(*pp)));
199  *pp = NULL;
200  }
201 
202  if (*pp == NULL) {
203  if (fac > 1.0f) {
204  *curlen = (size_t)(((double)(newlen))*(double)fac);
205  } else {
206  *curlen = newlen;
207  }
208  cudaCheck(cudaHostAlloc(pp, sizeofT*(*curlen), flag));
209  return true;
210  }
211 
212  return false;
213 }
#define cudaCheck(stmt)
Definition: CudaUtils.h:233