@@ -103,15 +103,23 @@ void PjRtStreamExecutorDeviceEventPromise::SetReady() {
103103
104104absl::StatusOr<PjRtDeviceEventRef>
105105PjRtStreamExecutorRawBuffer::CopyRawHostToDeviceAndReturnEvent (
106- const void * src, int64_t offset, int64_t transfer_size) {
106+ const void * src, int64_t offset, int64_t transfer_size,
107+ PjRtDeviceEventRefVector dependencies) {
107108 se::Stream* stream = local_device_->host_to_device_stream ();
108109 auto device_event =
109110 BufferSequencingEvent::Create (client_->async_work_runner ());
110111 device_event.AndThen ([device_buffer = device_buffer_]() {});
111- client_->async_work_runner ()->Schedule ([client = client_, device_event,
112- local_device = local_device_, stream,
113- src, offset, transfer_size,
114- buf = tsl::FormRef (this )]() mutable {
112+
113+ auto run_transfer = [client = client_, device_event,
114+ local_device = local_device_, stream, src, offset,
115+ transfer_size, buf = tsl::FormRef (this ),
116+ dependencies = dependencies]() mutable {
117+ absl::Status dep_status = GetErrors (dependencies);
118+ if (!dep_status.ok ()) {
119+ client->SetEventAsError (device_event, dep_status);
120+ return ;
121+ }
122+
115123 se::DeviceAddressBase sub_buffer = buf->device_buffer_ ->mem ();
116124 if (transfer_size < sub_buffer.size ()) {
117125 sub_buffer = sub_buffer.GetByteSlice (offset, transfer_size);
@@ -155,21 +163,33 @@ PjRtStreamExecutorRawBuffer::CopyRawHostToDeviceAndReturnEvent(
155163 if (!status.ok ()) {
156164 client->SetEventAsError (device_event, status);
157165 }
158- });
166+ };
167+
168+ ExecuteWhenReady (dependencies, client_->async_work_runner (),
169+ std::move (run_transfer));
170+
159171 return PjRtDeviceEventRef (std::move (device_event));
160172}
161173
162174absl::StatusOr<PjRtDeviceEventRef>
163175PjRtStreamExecutorRawBuffer::CopyRawDeviceToHostAndReturnEvent (
164- void * dst, int64_t offset, int64_t transfer_size) {
176+ void * dst, int64_t offset, int64_t transfer_size,
177+ PjRtDeviceEventRefVector dependencies) {
165178 se::Stream* stream = local_device_->GetDeviceToHostStream ();
166179 auto device_event =
167180 BufferSequencingEvent::Create (client_->async_work_runner ());
168181 device_event.AndThen ([device_buffer = device_buffer_]() {});
169- client_->async_work_runner ()->Schedule ([client = client_, device_event,
170- local_device = local_device_, stream,
171- dst, offset, transfer_size,
172- buf = tsl::FormRef (this )]() mutable {
182+
183+ auto run_transfer = [client = client_, device_event,
184+ local_device = local_device_, stream, dst, offset,
185+ transfer_size, buf = tsl::FormRef (this ),
186+ dependencies = dependencies]() mutable {
187+ absl::Status dep_status = GetErrors (dependencies);
188+ if (!dep_status.ok ()) {
189+ client->SetEventAsError (device_event, dep_status);
190+ return ;
191+ }
192+
173193 se::DeviceAddressBase sub_buffer = buf->device_buffer_ ->mem ();
174194 if (transfer_size < sub_buffer.size ()) {
175195 sub_buffer = sub_buffer.GetByteSlice (offset, transfer_size);
@@ -214,7 +234,11 @@ PjRtStreamExecutorRawBuffer::CopyRawDeviceToHostAndReturnEvent(
214234 if (!status.ok ()) {
215235 client->SetEventAsError (device_event, status);
216236 }
217- });
237+ };
238+
239+ ExecuteWhenReady (dependencies, client_->async_work_runner (),
240+ std::move (run_transfer));
241+
218242 return PjRtDeviceEventRef (std::move (device_event));
219243}
220244
@@ -304,8 +328,8 @@ void PjRtStreamExecutorRawBuffer::CopyTo(
304328 definition_event_promise.Set (*std::move (h2d_event));
305329 return ;
306330 } else if (auto * dst_ptr = dst_raw_buffer->GetHostPointer ()) {
307- auto d2h_event =
308- CopyRawDeviceToHostAndReturnEvent ( dst_ptr, 0 , GetOnDeviceSizeInBytes ());
331+ auto d2h_event = CopyRawDeviceToHostAndReturnEvent (
332+ dst_ptr, 0 , GetOnDeviceSizeInBytes (), {} );
309333 if (!d2h_event.ok ()) {
310334 definition_event_promise.SetError (d2h_event.status ());
311335 src_usage_event_promise.SetError (d2h_event.status ());
@@ -332,7 +356,7 @@ void PjRtStreamExecutorRawBuffer::CopyTo(
332356 client_->GetHostMemoryAllocator ()->Allocate (GetOnDeviceSizeInBytes (),
333357 alloc_opts);
334358 auto d2h_event = CopyRawDeviceToHostAndReturnEvent (
335- staging_buffer.get (), 0 , GetOnDeviceSizeInBytes ());
359+ staging_buffer.get (), 0 , GetOnDeviceSizeInBytes (), {} );
336360 if (!d2h_event.ok ()) {
337361 definition_event_promise.SetError (d2h_event.status ());
338362 src_usage_event_promise.SetError (d2h_event.status ());
0 commit comments