2121#include < cstdint>
2222#include < memory>
2323#include < string>
24+ #include < unordered_map>
25+ #include < vector>
2426
2527#include < cuda.h>
2628
29+ #include " arrow/gpu/cuda_common.h"
30+ #include " arrow/gpu/cuda_memory.h"
31+
2732namespace arrow {
2833namespace gpu {
2934
@@ -39,7 +44,7 @@ class CudaContext::CudaContextImpl {
3944
4045 Status Init (const CudaDevice& device) {
4146 device_ = device;
42- CU_RETURN_NOT_OK (cuCtxCreate (context_, 0 , device_.handle ));
47+ CU_RETURN_NOT_OK (cuCtxCreate (& context_, 0 , device_.handle ));
4348 is_open_ = true ;
4449 return Status::OK ();
4550 }
@@ -58,22 +63,23 @@ class CudaContext::CudaContextImpl {
5863 CU_RETURN_NOT_OK (cuCtxSetCurrent (context_));
5964
6065 CUdeviceptr data;
61- CU_RETURN_NOT_OK (cuMemAlloc (&data, nbytes));
66+ CU_RETURN_NOT_OK (cuMemAlloc (&data, static_cast < size_t >( nbytes) ));
6267 *out = reinterpret_cast <uint8_t *>(data);
6368 return Status::OK ();
6469 }
6570
6671 Status CopyHostToDevice (uint8_t * dst, const uint8_t * src, int64_t nbytes) {
6772 CU_RETURN_NOT_OK (cuCtxSetCurrent (context_));
68- CU_RETURN_NOT_OK (cuMemcpyDtoH (reinterpret_cast <CUdeviceptr>(dst),
69- src, nbytes));
70- return Statsu::OK ();
73+ CU_RETURN_NOT_OK (cuMemcpyHtoD (reinterpret_cast <CUdeviceptr>(dst),
74+ reinterpret_cast <const void *>(src),
75+ static_cast <size_t >(nbytes)));
76+ return Status::OK ();
7177 }
7278
7379 Status CopyDeviceToHost (uint8_t * dst, const uint8_t * src, int64_t nbytes) {
7480 CU_RETURN_NOT_OK (cuCtxSetCurrent (context_));
75- CU_RETURN_NOT_OK (cuMemcpyHtoD (src , reinterpret_cast <const CUdeviceptr>(src),
76- nbytes));
81+ CU_RETURN_NOT_OK (cuMemcpyDtoH (dst , reinterpret_cast <const CUdeviceptr>(src),
82+ static_cast < size_t >( nbytes) ));
7783 return Status::OK ();
7884 }
7985
@@ -113,7 +119,8 @@ class CudaDeviceManager::CudaDeviceManagerImpl {
113119
114120 Status AllocateHost (int64_t nbytes, uint8_t ** out) {
115121 CU_RETURN_NOT_OK (cuMemHostAlloc (reinterpret_cast <void **>(out),
116- nbytes, CU_MEMHOSTALLOC_PORTABLE ));
122+ static_cast <size_t >(nbytes),
123+ CU_MEMHOSTALLOC_PORTABLE ));
117124 host_bytes_allocated_ += nbytes;
118125 return Status::OK ();
119126 }
@@ -134,9 +141,16 @@ class CudaDeviceManager::CudaDeviceManagerImpl {
134141 return Status::OK ();
135142 }
136143
137- Status CreateContext (int device_number, std::shared_ptr<CudaContext>* out) {
138- *out = std::shared_ptr<CudaContext>(new CudaContext ());
139- return (*out)->impl_ ->Init (devices_[i]);
144+ Status GetContext (int device_number, std::shared_ptr<CudaContext>* out) {
145+ auto it = contexts_.find (device_number);
146+ if (it == contexts_.end ()) {
147+ auto ctx = std::shared_ptr<CudaContext>(new CudaContext ());
148+ RETURN_NOT_OK (ctx->impl_ ->Init (devices_[device_number]));
149+ contexts_[device_number] = *out = ctx;
150+ } else {
151+ *out = it->second ;
152+ }
153+ return Status::OK ();
140154 }
141155
142156 int num_devices () const { return num_devices_; }
@@ -145,13 +159,18 @@ class CudaDeviceManager::CudaDeviceManagerImpl {
145159 int num_devices_;
146160 std::vector<CudaDevice> devices_;
147161
162+ // device_number -> CudaContext
163+ std::unordered_map<int , std::shared_ptr<CudaContext>> contexts_;
164+
148165 int host_bytes_allocated_;
149166};
150167
151168CudaDeviceManager::CudaDeviceManager () {
152169 impl_.reset (new CudaDeviceManagerImpl ());
153170}
154171
172+ std::unique_ptr<CudaDeviceManager> CudaDeviceManager::instance_ = nullptr ;
173+
155174Status CudaDeviceManager::GetInstance (CudaDeviceManager** manager) {
156175 if (!instance_) {
157176 instance_.reset (new CudaDeviceManager ());
@@ -161,21 +180,21 @@ Status CudaDeviceManager::GetInstance(CudaDeviceManager** manager) {
161180 return Status::OK ();
162181}
163182
164- Status CudaDeviceManager::Create (int device_number,
165- std::shared_ptr<CudaContext>* out) {
166- return impl_->Create (device_number, out);
183+ Status CudaDeviceManager::GetContext (int device_number,
184+ std::shared_ptr<CudaContext>* out) {
185+ return impl_->GetContext (device_number, out);
167186}
168187
169188Status CudaDeviceManager::AllocateHost (int64_t nbytes,
170189 std::shared_ptr<CudaHostBuffer>* out) {
171- uint8_t * data;
190+ uint8_t * data = nullptr ;
172191 RETURN_NOT_OK (impl_->AllocateHost (nbytes, &data));
173- *out = std::shared_ptr <CudaHostBuffer>(data, nbytes);
192+ *out = std::make_shared <CudaHostBuffer>(data, nbytes);
174193 return Status::OK ();
175194}
176195
177196Status CudaDeviceManager::FreeHost (uint8_t * data, int64_t nbytes) {
178- return impl_->FreeHost (data, nbytes)) ;
197+ return impl_->FreeHost (data, nbytes);
179198}
180199
181200int CudaDeviceManager::num_devices () const {
@@ -185,8 +204,14 @@ int CudaDeviceManager::num_devices() const {
185204// ----------------------------------------------------------------------
186205// CudaContext public API
187206
188- Status CudaContext::Allocate (int64_t nbytes, std::shared_ptr<CudaBuffer>* out) {
189- return impl_->AllocateHost (nbytes, out);
207+ CudaContext::CudaContext () {
208+ impl_.reset (new CudaContextImpl ());
209+ }
210+
211+ CudaContext::~CudaContext () {}
212+
213+ Status CudaContext::Allocate (int64_t nbytes, uint8_t ** out) {
214+ return impl_->Allocate (nbytes, out);
190215}
191216
192217Status CudaContext::CopyHostToDevice (uint8_t * dst, const uint8_t * src, int64_t nbytes) {
0 commit comments