QMCPACK
QueueCUDA.hpp
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2024 QMCPACK developers.
6 //
7 // File developed by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
8 //
9 // File created by: Ye Luo, yeluo@anl.gov, Argonne National Laboratory
10 //////////////////////////////////////////////////////////////////////////////////////
11 
12 #ifndef QMCPLUSPLUS_QUEUE_CUDA_H
13 #define QMCPLUSPLUS_QUEUE_CUDA_H
14 
15 #include "Queue.hpp"
16 #include "CUDAruntime.hpp"
17 
18 namespace qmcplusplus
19 {
20 
21 namespace compute
22 {
23 
24 template<>
26 {
27 public:
28  Queue() { cudaErrorCheck(cudaStreamCreate(&hstream_), "cudaStreamCreate failed!"); }
29 
30  ~Queue() { cudaErrorCheck(cudaStreamDestroy(hstream_), "cudaStreamDestroy failed!"); }
31 
32  // dualspace container
33  template<class DSC>
34  void enqueueH2D(DSC& dataset, typename DSC::size_type size = 0, typename DSC::size_type offset = 0)
35  {
36  if (dataset.data() == dataset.device_data()) return;
37 
38  if (size == 0)
39  {
40  cudaErrorCheck(cudaMemcpyAsync(dataset.device_data() + offset, dataset.data() + offset,
41  dataset.size() * sizeof(typename DSC::value_type), cudaMemcpyHostToDevice, hstream_),
42  "Queue<PlatformKind::CUDA>::enqueueH2D cudaMemcpyAsync failed!");
43  }
44  else
45  {
46  cudaErrorCheck(cudaMemcpyAsync(dataset.device_data() + offset, dataset.data() + offset,
47  size * sizeof(typename DSC::value_type), cudaMemcpyHostToDevice, hstream_),
48  "Queue<PlatformKind::CUDA>::enqueueH2D cudaMemcpyAsync failed!");
49  }
50  }
51 
52  template<class DSC>
53  void enqueueD2H(DSC& dataset, typename DSC::size_type size = 0, typename DSC::size_type offset = 0)
54  {
55  if (dataset.data() == dataset.device_data()) return;
56 
57  if (size == 0)
58  {
59  cudaErrorCheck(cudaMemcpyAsync(dataset.data() + offset, dataset.device_data() + offset,
60  dataset.size() * sizeof(typename DSC::value_type), cudaMemcpyDeviceToHost, hstream_),
61  "Queue<PlatformKind::CUDA>::enqueueD2H cudaMemcpyAsync failed!");
62  }
63  else
64  {
65  cudaErrorCheck(cudaMemcpyAsync(dataset.data() + offset, dataset.device_data() + offset,
66  size * sizeof(typename DSC::value_type), cudaMemcpyDeviceToHost, hstream_),
67  "Queue<PlatformKind::CUDA>::enqueueD2H cudaMemcpyAsync failed!");
68  }
69  }
70 
71  void sync() { cudaErrorCheck(cudaStreamSynchronize(hstream_), "cudaStreamSynchronize failed!"); }
72 
73  cudaStream_t getNative() { return hstream_; }
74 
75 private:
77 };
78 
79 } // namespace compute
80 
81 } // namespace qmcplusplus
82 
83 #endif
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
handle CUDA/HIP runtime selection.
#define cudaStreamDestroy
Definition: cuda2hip.h:151
void enqueueD2H(DSC &dataset, typename DSC::size_type size=0, typename DSC::size_type offset=0)
Definition: QueueCUDA.hpp:53
#define cudaStream_t
Definition: cuda2hip.h:149
#define cudaStreamCreate
Definition: cuda2hip.h:150
cudaErrorCheck(cudaMemcpyAsync(dev_lu.data(), lu.data(), sizeof(decltype(lu)::value_type) *lu.size(), cudaMemcpyHostToDevice, hstream), "cudaMemcpyAsync failed copying log_values to device")
#define cudaMemcpyDeviceToHost
Definition: cuda2hip.h:138
#define cudaStreamSynchronize
Definition: cuda2hip.h:152
#define cudaMemcpyHostToDevice
Definition: cuda2hip.h:139
void enqueueH2D(DSC &dataset, typename DSC::size_type size=0, typename DSC::size_type offset=0)
Definition: QueueCUDA.hpp:34
QMCTraits::FullPrecRealType value_type
#define cudaMemcpyAsync
Definition: cuda2hip.h:136