1 #ifndef PYTORCH_MOBILE_METAL_DEVICE_H_
2 #define PYTORCH_MOBILE_METAL_DEVICE_H_
3
4 #import <Metal/Metal.h>
5
6 #include <string>
7
8 namespace at::native::metal {
9
10 struct MetalDeviceInfo {
11 std::string name;
12 MTLLanguageVersion languageVersion;
13 };
14
createDeviceInfo(id<MTLDevice> device)15 static inline MetalDeviceInfo createDeviceInfo(id<MTLDevice> device) {
16 MetalDeviceInfo device_info;
17 if (device.name != nil) {
18 device_info.name = device.name.UTF8String;
19 }
20 if (@available(macOS 11.0, iOS 14.0, *)) {
21 device_info.languageVersion = MTLLanguageVersion2_3;
22 } else if (@available(macOS 10.15, iOS 13.0, *)) {
23 device_info.languageVersion = MTLLanguageVersion2_2;
24 } else if (@available(macOS 10.14, iOS 12.0, *)) {
25 device_info.languageVersion = MTLLanguageVersion2_1;
26 } else if (@available(macOS 10.13, iOS 11.0, *)) {
27 device_info.languageVersion = MTLLanguageVersion2_0;
28 } else if (@available(macOS 10.12, iOS 10.0, *)) {
29 device_info.languageVersion = MTLLanguageVersion1_2;
30 } else if (@available(macOS 10.11, iOS 9.0, *)) {
31 device_info.languageVersion = MTLLanguageVersion1_1;
32 }
33 #if ( \
34 defined(__IPHONE_9_0) && \
35 __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_9_0) || \
36 (defined(__MAC_10_11) && __MAC_OS_X_VERSION_MIN_REQUIRED >= __MAC_10_11)
37 #else
38 #error "Metal is not available on the current platform."
39 #endif
40 return device_info;
41 }
42
43 } // namespace at::native::metal
44
45 #endif
46