@@ -44,7 +44,6 @@ limitations under the License.
4444#include " xla/pjrt/pjrt_stream_executor_client.h"
4545#include " xla/pjrt/raw_buffer.h"
4646#include " xla/pjrt/tracked_device_buffer.h"
47- #include " xla/pjrt/transpose.h"
4847#include " xla/primitive_util.h"
4948#include " xla/service/generic_transfer_manager.h"
5049#include " xla/shape_util.h"
@@ -250,124 +249,6 @@ absl::StatusOr<PjRtRawBufferRef> PjRtStreamExecutorRawBuffer::Slice(
250249 RawSEDeviceMemory::CreateSlice (device_buffer_, offset, size), size);
251250}
252251
253- void PjRtStreamExecutorRawBuffer::CopyToLiteralAsync (
254- Promise<> promise, PjRtDeviceEventPromiseRef device_promise,
255- MutableLiteralBase* literal, xla::Shape shape) {
256- auto usage_event =
257- BufferSequencingEvent::Create (client_->async_work_runner ());
258- usage_event.AndThen ([device_buffer = device_buffer_]() {});
259- client_->async_work_runner ()->Schedule (
260- [usage_event, local_device = local_device_,
261- on_device_shape = std::move (shape), promise = std::move (promise),
262- literal, client = client_, memory_space = memory_space_,
263- device_buffer = device_buffer_]() mutable {
264- std::shared_ptr<TransposePlan> transpose;
265- se::Stream* stream = local_device->GetDeviceToHostStream ();
266- TransferManager* transfer_manager =
267- client->client ()->backend ().transfer_manager ();
268- if (on_device_shape.IsArray ()) {
269- xla::Layout literal_layout;
270- if (literal->shape ().has_layout ()) {
271- literal_layout = literal->shape ().layout ();
272- } else {
273- literal_layout = LayoutUtil::MakeDescendingLayout (
274- on_device_shape.dimensions ().size ());
275- }
276-
277- if (on_device_shape.layout () != literal_layout) {
278- absl::InlinedVector<int64_t , 4 > byte_strides (
279- on_device_shape.dimensions ().size ());
280- absl::Status s = ShapeUtil::UnpackedByteStrides (
281- on_device_shape, absl::MakeSpan (byte_strides));
282- if (!s.ok ()) {
283- promise.Set (s);
284- client->SetEventAsError (usage_event, s);
285- return ;
286- }
287- absl::Span<const int64_t > dims = on_device_shape.dimensions ();
288- absl::InlinedVector<int64_t , 4 > permutation (dims.size ());
289- absl::c_reverse_copy (literal_layout.minor_to_major (),
290- permutation.begin ());
291- TransposePlan::Options options;
292- options.elem_size_in_bytes =
293- primitive_util::ByteWidth (on_device_shape.element_type ());
294- options.dims = on_device_shape.dimensions ();
295- options.permutation = permutation;
296- options.input_striding = TransposePlan::Striding{byte_strides};
297- absl::StatusOr<std::shared_ptr<TransposePlan>> t =
298- client->GetTransposePlan (options);
299- if (!t.ok ()) {
300- promise.Set (t.status ());
301- client->SetEventAsError (usage_event, t.status ());
302- return ;
303- }
304- transpose = *std::move (t);
305- }
306- }
307-
308- absl::StatusOr<EventPool::Handle> event_or =
309- local_device->event_pool ().AllocateEvent (
310- client->async_work_runner (), stream->parent ());
311- if (!event_or.ok ()) {
312- promise.Set (event_or.status ());
313- client->SetEventAsError (usage_event, event_or.status ());
314- return ;
315- }
316-
317- ShapedBuffer shaped_buffer = device_buffer->AsShapedBuffer (
318- memory_space->devices ()[0 ], on_device_shape);
319-
320- GenericTransferManager::LiteralFromDeviceMetadata transfer_metadata;
321- // We never call device functions from the `done` callback.
322- transfer_metadata.callback_is_host_callback_safe = true ;
323-
324- TransferManager::TransferMetadata* transfer_metadata_ptr =
325- (dynamic_cast <GenericTransferManager*>(transfer_manager) != nullptr )
326- ? &transfer_metadata
327- : nullptr ;
328-
329- if (transpose) {
330- // Copy the device buffer to a temporary literal with descending
331- // layout and transpose to the requested layout.
332-
333- Shape stage_shape = literal->shape ();
334- *stage_shape.mutable_layout () =
335- LayoutUtil::MakeDescendingLayout (stage_shape.dimensions ().size ());
336- auto staged = std::make_shared<Literal>(stage_shape);
337-
338- transfer_manager->TransferLiteralFromDevice (
339- stream, shaped_buffer, staged.get (),
340- [transpose = std::move (transpose),
341- promise = std::move (promise).ToShared (), staged, client,
342- literal = std::move (literal)](absl::Status status) mutable {
343- if (status.ok ()) {
344- transpose->Execute (staged->untyped_data (),
345- literal->untyped_data ());
346- }
347- client->async_work_runner ()->Schedule (
348- [promise = std::move (promise),
349- status = std::move (status)]() {
350- promise->Set (std::move (status));
351- });
352- },
353- transfer_metadata_ptr);
354- } else {
355- transfer_manager->TransferLiteralFromDevice (
356- stream, shaped_buffer, literal,
357- [promise =
358- std::move (promise).ToShared ()](absl::Status status) mutable {
359- promise->Set (std::move (status));
360- },
361- transfer_metadata_ptr);
362- }
363-
364- client->ThenRecordEvent (usage_event, local_device,
365- std::move (event_or).value (), stream);
366- });
367-
368- device_promise.Set (PjRtDeviceEventRef (std::move (usage_event)));
369- }
370-
371252absl::StatusOr<PjRtDeviceEventRef>
372253PjRtStreamExecutorRawBuffer::MakeAllocationReadyEvent () {
373254 auto * client =
0 commit comments