@@ -88,6 +88,14 @@ class CudaContext::CudaContextImpl {
8888 return Status::OK ();
8989 }
9090
91+ Status ExportIpcBuffer (uint8_t * data, std::unique_ptr<CudaIpcMemHandle>* handle) {
92+ CU_RETURN_NOT_OK (cuCtxSetCurrent (context_));
93+ CUipcMemHandle cu_handle;
94+ CU_RETURN_NOT_OK (cuIpcGetMemHandle (&cu_handle, reinterpret_cast <CUdeviceptr>(data)));
95+ *handle = std::unique_ptr<CudaIpcMemHandle>(new CudaIpcMemHandle (&cu_handle));
96+ return Status::OK ();
97+ }
98+
9199 Status OpenIpcBuffer (const CudaIpcMemHandle& ipc_handle, uint8_t ** out) {
92100 CU_RETURN_NOT_OK (cuCtxSetCurrent (context_));
93101 auto handle = reinterpret_cast <const CUipcMemHandle*>(ipc_handle.handle ());
@@ -151,12 +159,17 @@ class CudaDeviceManager::CudaDeviceManagerImpl {
151159 return Status::OK ();
152160 }
153161
162+ Status CreateNewContext (int device_number, std::shared_ptr<CudaContext>* out) {
163+ *out = std::shared_ptr<CudaContext>(new CudaContext ());
164+ return (*out)->impl_ ->Init (devices_[device_number]);
165+ }
166+
154167 Status GetContext (int device_number, std::shared_ptr<CudaContext>* out) {
155168 auto it = contexts_.find (device_number);
156169 if (it == contexts_.end ()) {
157- auto ctx = std::shared_ptr<CudaContext>( new CudaContext ()) ;
158- RETURN_NOT_OK (ctx-> impl_ -> Init (devices_[ device_number] ));
159- contexts_[device_number] = *out = ctx ;
170+ std::shared_ptr<CudaContext> new_context ;
171+ RETURN_NOT_OK (CreateNewContext ( device_number, &new_context ));
172+ contexts_[device_number] = *out = new_context ;
160173 } else {
161174 *out = it->second ;
162175 }
@@ -193,6 +206,11 @@ Status CudaDeviceManager::GetContext(int device_number,
193206 return impl_->GetContext (device_number, out);
194207}
195208
209+ Status CudaDeviceManager::CreateNewContext (int device_number,
210+ std::shared_ptr<CudaContext>* out) {
211+ return impl_->CreateNewContext (device_number, out);
212+ }
213+
196214Status CudaDeviceManager::AllocateHost (int64_t nbytes,
197215 std::shared_ptr<CudaHostBuffer>* out) {
198216 uint8_t * data = nullptr ;
@@ -221,6 +239,11 @@ Status CudaContext::Allocate(int64_t nbytes, std::shared_ptr<CudaBuffer>* out) {
221239 return Status::OK ();
222240}
223241
242+ Status CudaContext::ExportIpcBuffer (uint8_t * data,
243+ std::unique_ptr<CudaIpcMemHandle>* handle) {
244+ return impl_->ExportIpcBuffer (data, handle);
245+ }
246+
224247Status CudaContext::CopyHostToDevice (uint8_t * dst, const uint8_t * src, int64_t nbytes) {
225248 return impl_->CopyHostToDevice (dst, src, nbytes);
226249}
@@ -229,6 +252,8 @@ Status CudaContext::CopyDeviceToHost(uint8_t* dst, const uint8_t* src, int64_t n
229252 return impl_->CopyDeviceToHost (dst, src, nbytes);
230253}
231254
255+ Status CudaContext::Close () { return impl_->Close (); }
256+
232257Status CudaContext::Free (uint8_t * device_ptr, int64_t nbytes) {
233258 return impl_->Free (device_ptr, nbytes);
234259}
0 commit comments