/* * Copyright (c) Meta Platforms, Inc. and affiliates. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. */ #pragma once // @lint-ignore-every CLANGTIDY facebook-hte-BadMemberName #include #include #include #include namespace vkcompute { namespace vkapi { // // A Vulkan Runtime initializes a Vulkan instance and decouples the concept of // Vulkan instance initialization from initialization of, and subsequent // interactions with, Vulkan [physical and logical] devices as a precursor to // multi-GPU support. The Vulkan Runtime can be queried for available Adapters // (i.e. physical devices) in the system which in turn can be used for creation // of a Vulkan Context (i.e. logical devices). All Vulkan tensors in PyTorch // are associated with a Context to make tensor <-> device affinity explicit. // enum AdapterSelector { First, }; struct RuntimeConfig final { bool enable_validation_messages; bool init_default_device; AdapterSelector default_selector; uint32_t num_requested_queues; std::string cache_data_path; }; class Runtime final { public: explicit Runtime(const RuntimeConfig); // Do not allow copying. There should be only one global instance of this // class. Runtime(const Runtime&) = delete; Runtime& operator=(const Runtime&) = delete; Runtime(Runtime&&) = delete; Runtime& operator=(Runtime&&) = delete; ~Runtime(); using DeviceMapping = std::pair; using AdapterPtr = std::unique_ptr; private: RuntimeConfig config_; VkInstance instance_; std::vector device_mappings_; std::vector adapters_; uint32_t default_adapter_i_; VkDebugReportCallbackEXT debug_report_callback_; public: inline VkInstance instance() const { return instance_; } inline Adapter* get_adapter_p() { VK_CHECK_COND( default_adapter_i_ >= 0 && default_adapter_i_ < adapters_.size(), "Pytorch Vulkan Runtime: Default device adapter is not set correctly!"); return adapters_[default_adapter_i_].get(); } inline Adapter* get_adapter_p(uint32_t i) { VK_CHECK_COND( i >= 0 && i < adapters_.size(), "Pytorch Vulkan Runtime: Adapter at index ", i, " is not available!"); return adapters_[i].get(); } inline uint32_t default_adapter_i() const { return default_adapter_i_; } using Selector = std::function&)>; uint32_t create_adapter(const Selector&); }; // The global runtime is retrieved using this function, where it is declared as // a static local variable. Runtime* runtime(); } // namespace vkapi } // namespace vkcompute