#pragma once #include // device_lazy_init() is always compiled, even for CPU-only builds. namespace torch::utils { /** * This mechanism of lazy initialization is designed for each device backend. * Currently, CUDA and XPU follow this design. This function `device_lazy_init` * MUST be called before you attempt to access any Type(CUDA or XPU) object * from ATen, in any way. It guarantees that the device runtime status is lazily * initialized when the first runtime API is requested. * * Here are some common ways that a device object may be retrieved: * - You call getNonVariableType or getNonVariableTypeOpt * - You call toBackend() on a Type * * It's important to do this correctly, because if you forget to add it you'll * get an oblique error message seems like "Cannot initialize CUDA without * ATen_cuda library" or "Cannot initialize XPU without ATen_xpu library" if you * try to use CUDA or XPU functionality from a CPU-only build, which is not good * UX. */ void device_lazy_init(at::DeviceType device_type); void set_requires_device_init(at::DeviceType device_type, bool value); static inline void maybe_initialize_device(at::Device& device) { // Add more devices here to enable lazy initialization. if (device.is_cuda() || device.is_xpu() || device.is_privateuseone()) { device_lazy_init(device.type()); } } static inline void maybe_initialize_device(c10::optional& device) { if (!device.has_value()) { return; } maybe_initialize_device(device.value()); } static inline void maybe_initialize_device(const at::TensorOptions& options) { auto device = options.device(); maybe_initialize_device(device); } bool is_device_initialized(at::DeviceType device_type); } // namespace torch::utils