歴代iOSデバイスのGPUまとめ - GPU Family と Metal Feature Sets

Metalはハードウェアと密接したAPIなので、「iOS xx以上で利用可能」といったiOSのバージョン以外に、**「GPUファミリー」（GPU Family）**というハードウェア面からの区分も考慮して利用可否を判断する必要があります。

それらの情報はAppleの公式ページに載ってはいるのですが、あっちこっちのページに散らばっている [^2] ので、それらを統合してみました。

[^2]: たとえば`MTLFeatureSet`のcaseそれぞれが示しているハードウェア/iOSバージョンを調べようと思うと、各caseのページに飛んで"Discussion"の欄を見る必要があります。。


## 各iOSデバイスとGPU Familyの対応

歴代iOSデバイスのGPU（SoC）と、その属するGPU Familyをまとめました。

GPU Familyの欄に"3"とあれば、"iOS GPU family 3"を意味します。

### Metal対応デバイス

| SoC | GPU Family | Devices |
|:----|:---:|:-------|
| A11  | 4 | iPhone X, iPhone 8 & 8 Plus |
| A10X  | 3 | iPad Pro 12.9-inch (2nd) & iPad Pro (10.5-inch) |
| A10  | 3 | iPhone 7 & 7 Plus |
| A9X  | 3 | iPad (5th), iPad Pro (12.9-inch, 9.7-inch) |
| A9 | 3 | iPhone 6s, 6s Plus, SE |
| A8X | 2 | iPad Air 2  |
| A8 | 2 | iPhone 6 & 6 Plus, iPad mini 4, iPod Touch (6th)  |
| A7 | 1 | iPhone 5s, iPad Air, iPad mini 2 & 3 |

- A7以降は Metal & OpenGL ES 3.0 compatible
  - A7以降の iPod Touch (6th) 以外は OpenGL ES 2.0 も compatible


### Metal非対応デバイス

| SoC | GPU | Devices |
|:----|:----|:-------|
| A6X | SGX 554MP4 | iPad (4th) |
| A6 | SGX 543MP3 | iPhone 5 & 5c |
| A5X | SGX 543MP4 | iPad (3rd) |
| A5 | SGX 543MP2 | iPhone 4s, iPad 2, iPad mini, iPod Touch (5th) |
| A4 | SGX 535 | iPhone 3GS & 4, iPad, iPod Touch (3rd & 4th) |

- A6以前はOpenGL ES 2.0 compatible


（参考ページ）

- [MTLFeatureSet - Metal | Apple Developer Documentation](https://developer.apple.com/documentation/metal/mtlfeatureset)
- [iPad - Compare Models - Apple](https://www.apple.com/ipad/compare/)
- <a href="https://developer.apple.com/library/content/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/HardwareGPUInformation/HardwareGPUInformation.html" >Hardware GPU Information - iOS Developer Library</a>
- <a href="http://wlog.flatlib.jp/item/1782" >Mac OS X Metal の対応 GPU</a>
- <a href="http://wlog.flatlib.jp/item/1781" >歴代 iPad の CPU/GPU 速度の比較と iPad Pro の速度の目安</a>


## Metal Feature Sets

前項で示したデバイスの区分GPU Familyと、iOSのバージョンを加味して定義された**Metalの機能セットの区分**を示す`MTLFeatureSet`という型があります。

- [Feature Sets - Metal - Apple Developer](https://developer.apple.com/metal/feature-sets/)

enum型で、以下のcaseが定義されています。

| case | 値 | @available | ハードウェア/iOSバージョン |
|:---|--:|:---:|:---|
| `iOS_GPUFamily1_v1` | 0 | iOS 8.0 | A7 / iOS 8 |
| `iOS_GPUFamily2_v1` | 1 | iOS 8.0 | A8 / iOS 8 |
| `iOS_GPUFamily1_v2` | 2 | iOS 9.0 | A7 / iOS 9 |
| `iOS_GPUFamily2_v2` | 3 | iOS 9.0 | A8 / iOS 9 |
| `iOS_GPUFamily3_v1` | 4 | iOS 9.0 | A9, A10 / iOS 9 |
| `iOS_GPUFamily1_v3` | 5 | iOS 10.0 | A7 / iOS 10 |
| `iOS_GPUFamily2_v3` | 6 | iOS 10.0 | A8 / iOS 10 |
| `iOS_GPUFamily3_v2` | 7 | iOS 10.0 | A9, A10 / iOS 10 |
| `iOS_GPUFamily1_v4` | 8 | iOS 11.0 | A7 / iOS 11 |
| `iOS_GPUFamily2_v4` | 9 | iOS 11.0 | A8 / iOS 11 |
| `iOS_GPUFamily3_v3` | 10 | iOS 11.0 | A9, A10 / iOS 11 |
| `iOS_GPUFamily4_v1` | 11 | iOS 10.0 [^1] | A11 / iOS 11 |

[^1]: `iOS_GPUFamily4_v1`はA11 / iOS 11で利用可能な機能セットを示すが、このcase自体はiOS 10以降で利用可能

より詳細な機能ごとの表がPDFで公開されています。

- [Metal Feature Set Tables](https://developer.apple.com/metal/Metal-Feature-Set-Tables.pdf)

<img width="338" alt="Screen Shot 2016-12-01 at 16.50.02 copy.png" src="https://qiita-image-store.s3.amazonaws.com/0/3180/e4f0dbbf-9deb-658d-1a79-98ec265bdfa7.png">

たとえば、この表のFeaturesの2列目にMetal Performance Shaders（以下MPS）があります。これは、**iOS 10でCNN (Convolutional Neural Network) まわりの機能が追加**された、かなり魅力的なフレームワークですが、上記表で見ると、`iOS_GPUFamily1_vx`は、MetalKitはサポートしているものの、MPSはサポートしていません。つまり、GPU Family 1に属するiPhone 5sでは`MTKView`を使った画面の描画はできても、MPSを使ったCNNの計算はできない、ということになります。

## コードからMetalフィーチャーセットの利用可否を判定する

`MTLDevice`の`supportsFeatureSet(_:)`メソッドを利用します。

```swift
func supportsFeatureSet(_ featureSet: MTLFeatureSet) -> Bool
```

引数には前述した`MTLFeatureSet`型の値を渡します。



## Metal の Device Capability

Device Capabilityで`metal`を指定することもできます。

- [Declaring the Required Device Capabilities](https://developer.apple.com/library/ios/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/DeviceCompatibilityMatrix/DeviceCompatibilityMatrix.html#//apple_ref/doc/uid/TP40013599-CH17-SW10)