#if !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION) // Copyright © 2022 Apple Inc. #pragma once #include #include #include #include #ifdef __OBJC__ // Metal.h pulls in Foundation.h, which transitively includes CarbonCore // headers that emit a flood of -Wdeprecated-declarations on recent macOS SDKs. C10_DIAGNOSTIC_PUSH_AND_IGNORED_IF_DEFINED("-Wdeprecated-declarations") #include C10_DIAGNOSTIC_POP() typedef id MTLDevice_t; #else typedef void* MTLDevice_t; #endif namespace at::mps { // Helper enum to check if a MPSGraph op is supported in a given macOS version enum class MacOSVersion : uint32_t { MACOS_VER_14_4_PLUS = 0, MACOS_VER_15_0_PLUS, MACOS_VER_15_1_PLUS, MACOS_VER_15_2_PLUS, MACOS_VER_26_0_PLUS, MACOS_VER_26_4_PLUS, }; // Helper enum for GPU-family-gated workarounds enum class AppleGPUFamily : uint32_t { APPLE_7_PLUS = 1007, // M1 APPLE_8_PLUS = 1008, // M2 APPLE_9_PLUS = 1009, // M3 / M4 APPLE_10_PLUS = 1010, // M5 }; //----------------------------------------------------------------- // MPSDevice // // MPSDevice is a singleton class that returns the default device //----------------------------------------------------------------- class TORCH_API MPSDevice { public: /** * MPSDevice should not be cloneable. */ MPSDevice(MPSDevice& other) = delete; /** * MPSDevice should not be assignable. */ void operator=(const MPSDevice&) = delete; /** * Gets single instance of the Device. */ static MPSDevice* getInstance(); /** * Returns the single device. */ MTLDevice_t device() { return _mtl_device; } /** * Returns whether running on Ventura or newer */ bool isMacOS13Plus(MacOSVersion version) const; /** * Returns device name */ std::string getName() const; /** * Returns number of GPU cores. * 1 Core = 16 ExecutionUnit x 8 ALU x 24 threads */ unsigned getCoreCount() const; ~MPSDevice(); private: static MPSDevice* _device; MTLDevice_t _mtl_device; MPSDevice(); }; TORCH_API bool is_available(); TORCH_API bool is_macos_13_or_newer(MacOSVersion version); TORCH_API bool is_apple_family_or_newer(AppleGPUFamily family); TORCH_API at::Allocator* GetMPSAllocator(); inline Device getDeviceFromPtr(void* ptr) { return {c10::DeviceType::MPS, 0}; } } // namespace at::mps #else #error "This file should not be included when either TORCH_STABLE_ONLY or TORCH_TARGET_VERSION is defined." #endif // !defined(TORCH_STABLE_ONLY) && !defined(TORCH_TARGET_VERSION)