@@ -15,6 +15,7 @@ limitations under the License.
1515
1616#include " xla/pjrt/raw_buffer.h"
1717
18+ #include < cstddef>
1819#include < utility>
1920#include < vector>
2021
@@ -27,6 +28,7 @@ limitations under the License.
2728#include " xla/future.h"
2829#include " xla/pjrt/async_work_runner.h"
2930#include " xla/pjrt/c/pjrt_c_api_raw_buffer_extension.h"
31+ #include " xla/pjrt/c/pjrt_c_api_status_utils.h"
3032#include " xla/pjrt/device_event.h"
3133#include " xla/pjrt/device_event_utils.h"
3234#include " xla/pjrt/pjrt_client.h"
@@ -73,6 +75,19 @@ class WrappedPjRtStagingBuffer : public PjRtStagingBuffer {
7375 private:
7476 tsl::AsyncValueRef<PjRtStagingBuffer> real_buffer_;
7577};
78+
79+ Future<> ConvertEventToFuture (PjRtDeviceEventRef event) {
80+ auto [promise, future] = tsl::MakePromise<void >();
81+ event.AndThen ([promise = std::move (promise), event]() mutable {
82+ auto error = event.GetErrorIfPresent ();
83+ if (error.has_value () && !error->ok ()) {
84+ promise.Set (*error);
85+ } else {
86+ promise.Set ();
87+ }
88+ });
89+ return std::move (future);
90+ }
7691} // namespace
7792
7893std::vector<RegisterRawBufferFactory::FactoryFuncT>& GetFactoryFuncs () {
@@ -224,21 +239,110 @@ const PJRT_RawBuffer_FunctionTable PjRtRawBuffer::kRawBufferVtable = {
224239 static_cast <PjRtRawBuffer*>(raw_buffer)->DropRef ();
225240 },
226241 /* get_on_device_size_in_bytes=*/
227- +[](PJRT_RawBuffer* raw_buffer) -> size_t {
228- return static_cast <PjRtRawBuffer*>(raw_buffer)->GetOnDeviceSizeInBytes ();
242+ +[](const PJRT_RawBuffer* raw_buffer) -> size_t {
243+ return static_cast <const PjRtRawBuffer*>(raw_buffer)
244+ ->GetOnDeviceSizeInBytes ();
229245 },
230246 /* get_memory_space=*/
231- +[](PJRT_RawBuffer* raw_buffer) -> PJRT_Memory* {
232- return static_cast <PjRtRawBuffer*>(raw_buffer)
247+ +[](const PJRT_RawBuffer* raw_buffer) -> PJRT_Memory* {
248+ return static_cast <const PjRtRawBuffer*>(raw_buffer)
233249 ->memory_space ()
234250 ->ToCApiPtr ();
235251 },
236252 /* get_host_pointer=*/
237- +[](PJRT_RawBuffer* raw_buffer) -> void * {
238- return static_cast <PjRtRawBuffer*>(raw_buffer)->GetHostPointer ();
253+ +[](const PJRT_RawBuffer* raw_buffer) -> void * {
254+ return static_cast <const PjRtRawBuffer*>(raw_buffer)->GetHostPointer ();
255+ },
256+ /* copy_raw_host_to_device_and_return_event=*/
257+ +[](PJRT_RawBuffer* raw_buffer, const void * src, int64_t offset,
258+ int64_t transfer_size, PJRT_DeviceEvent* event) -> PJRT_Error* {
259+ auto result =
260+ static_cast <PjRtRawBuffer*>(raw_buffer)
261+ ->CopyRawHostToDeviceAndReturnEvent (src, offset, transfer_size);
262+ if (!result.ok ()) {
263+ return pjrt::StatusToPjRtError (result.status ());
264+ }
265+ *event = std::move (*result).release ().ToC ();
266+ return nullptr ;
267+ },
268+ /* copy_raw_device_to_host_and_return_event=*/
269+ +[](PJRT_RawBuffer* raw_buffer, void * dst, int64_t offset,
270+ int64_t transfer_size, PJRT_DeviceEvent* event) -> PJRT_Error* {
271+ auto result =
272+ static_cast <PjRtRawBuffer*>(raw_buffer)
273+ ->CopyRawDeviceToHostAndReturnEvent (dst, offset, transfer_size);
274+ if (!result.ok ()) {
275+ return pjrt::StatusToPjRtError (result.status ());
276+ }
277+ *event = std::move (*result).release ().ToC ();
278+ return nullptr ;
279+ },
280+ /* opaque_device_memory_data_pointer=*/
281+ +[](const PJRT_RawBuffer* raw_buffer) -> void * {
282+ return static_cast <const PjRtRawBuffer*>(raw_buffer)
283+ ->OpaqueDeviceMemoryDataPointer ();
239284 },
240285};
241286
242287PjRtRawBuffer::PjRtRawBuffer () { vtable = &kRawBufferVtable ; }
243288
289+ absl::StatusOr<PjRtDeviceEventRef>
290+ PjRtRawBufferInterface::CopyRawHostToDeviceAndReturnEvent (
291+ const void * src, int64_t offset, int64_t transfer_size) {
292+ PJRT_DeviceEvent device_event;
293+ PJRT_Error* error = vtable->copy_raw_host_to_device_and_return_event (
294+ this , src, offset, transfer_size, &device_event);
295+ if (error != nullptr ) {
296+ return pjrt::PjrtErrorToStatus (error);
297+ }
298+ return PjRtDeviceEventRef::TakeRef (PjRtDeviceEventPtr (device_event));
299+ }
300+
301+ absl::StatusOr<PjRtDeviceEventRef>
302+ PjRtRawBufferInterface::CopyRawDeviceToHostAndReturnEvent (
303+ void * dst, int64_t offset, int64_t transfer_size) {
304+ PJRT_DeviceEvent device_event;
305+ PJRT_Error* error = vtable->copy_raw_device_to_host_and_return_event (
306+ this , dst, offset, transfer_size, &device_event);
307+ if (error != nullptr ) {
308+ return pjrt::PjrtErrorToStatus (error);
309+ }
310+ return PjRtDeviceEventRef::TakeRef (PjRtDeviceEventPtr (device_event));
311+ }
312+
313+ void * PjRtRawBufferInterface::OpaqueDeviceMemoryDataPointer () const {
314+ return vtable->opaque_device_memory_data_pointer (this );
315+ }
316+
317+ void PjRtRawBufferInterface::AddRef () { vtable->inc_ref (this ); }
318+
319+ void PjRtRawBufferInterface::DropRef () { vtable->dec_ref (this ); }
320+
321+ PjRtMemorySpace* PjRtRawBufferInterface::memory_space () const {
322+ return PjRtMemorySpace::FromC (vtable->get_memory_space (this ));
323+ }
324+
325+ void * PjRtRawBufferInterface::GetHostPointer () const {
326+ return vtable->get_host_pointer (this );
327+ }
328+
329+ size_t PjRtRawBufferInterface::GetOnDeviceSizeInBytes () const {
330+ return vtable->get_on_device_size_in_bytes (this );
331+ }
332+
333+ Future<> PjRtRawBufferInterface::CopyRawHostToDevice (const void * src,
334+ int64_t offset,
335+ int64_t transfer_size) {
336+ ASSIGN_OR_RETURN (auto event, CopyRawHostToDeviceAndReturnEvent (
337+ src, offset, transfer_size));
338+ return ConvertEventToFuture (std::move (event));
339+ }
340+
341+ Future<> PjRtRawBufferInterface::CopyRawDeviceToHost (void * dst, int64_t offset,
342+ int64_t transfer_size) {
343+ ASSIGN_OR_RETURN (auto event, CopyRawDeviceToHostAndReturnEvent (
344+ dst, offset, transfer_size));
345+ return ConvertEventToFuture (std::move (event));
346+ }
347+
244348} // namespace xla
0 commit comments