#define TORCH_ASSERT_ONLY_METHOD_OPERATORS #include #include #include #include #include #include #ifndef AT_PER_OPERATOR_HEADERS #include #else #include #endif namespace at::native { void resize_bytes_cuda(StorageImpl* storage, size_t size_bytes) { TORCH_CHECK(storage->resizable(), "Trying to resize storage that is not resizable"); auto allocator = storage->allocator(); TORCH_CHECK(allocator != nullptr, "Trying to resize storage without an allocator"); c10::Device device = storage->device(); if (size_bytes == 0) { storage->set_data_ptr_noswap(at::DataPtr(nullptr, device)); storage->set_nbytes(0); return; } c10::cuda::CUDAGuard guard(device.index()); at::DataPtr data = allocator->allocate(size_bytes); if (storage->data_ptr()) { at::globalContext().lazyInitCUDA(); C10_CUDA_CHECK( cudaMemcpyAsync( data.get(), storage->data(), std::min(storage->nbytes(), size_bytes), cudaMemcpyDeviceToDevice, c10::cuda::getCurrentCUDAStream())); } // Destructively overwrite data_ptr storage->set_data_ptr_noswap(std::move(data)); storage->set_nbytes(size_bytes); } const Tensor& resize_cuda_( const Tensor& self, IntArrayRef size, std::optional optional_memory_format) { if (self.has_names()) { return resize_named_tensor_(self, size, optional_memory_format); } auto* self_ = self.unsafeGetTensorImpl(); int64_t old_storage_nbytes = self_->unsafe_storage() ? self_->unsafe_storage().nbytes() : 0; resize_impl_cuda_(self_, size, /*strides=*/std::nullopt); if (optional_memory_format.has_value()) { auto memory_format = optional_memory_format.value(); TORCH_CHECK( memory_format != MemoryFormat::Preserve, "Unsupported memory format", memory_format); self_->empty_tensor_restride(memory_format); } // See Note [Enabling Deterministic Operations] if (C10_UNLIKELY(at::globalContext().deterministicAlgorithms() && at::globalContext().deterministicFillUninitializedMemory())) { at::native::fill_resize_deterministic_(self, old_storage_nbytes); } return self; } } // namespace at::native