Appleシリコンについてまとめてみた

## 自己紹介
今回がQiitaへの初投稿となります。[サイエンスパーク株式会社](https://sciencepark.co.jp/)の森本です。
Qiitaにはいつもお世話になっているので、自分からもQiitaに少しでも貢献できればと思い情報共有を始めることにしました。
サイエンスパークでは主にMacのドライバやアプリの開発を行っているので、Mac、Apple製品開発を中心に発信していくことになると思います。

## 始めに
今年開催されたアップル社の開発者向けイベントWWDC20でMacに搭載しているCPUをIntel社製のCPUから自社設計のCPU「Appleシリコン」に移行することを発表した。Appleシリコンで何が変わるのか、macOS開発者の観点からAppleシリコンについてまとめてみた。

## Appleシリコンとは
Appleシリコンは、初代iPhoneに搭載されたApple社が自社設計をしたARMアーキテクチャーのCPUおよびGPUや通信チップなどを含めたSoCである。
2017年にはGPUも自社設計となるA11Bionicがリリースされ、Face IDなどの機械学習に用いるニューラルネットワークハードウェアなども含まれるようになった。
これにより名実ともに「Apple」シリコンとなり、CPUとGPUが協調して動作をするAPIが提供されることになった。

## Armアーキテクチャー = iPhone、iPadと同じアーキテクチャー
![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/apple-silicon/iOSapp.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/apple-silicon/iOSapp.png)
<sup>[https://developer.apple.com/](https://developer.apple.com/documentation/apple_silicon/running_your_ios_apps_on_macos)より</sup>

iPhoneやiPadに加えApple WatchやApple TVにて搭載されてきたAppleシリコンは、ついにAppleの本丸ともいえるMacにも搭載されることが発表された。
これによって、クロスプラットフォーム（macOS・iOS）のアプリの開発は容易になり、既存のiOS用アプリケーションをそのままにAppleシリコンMacで実行できるになる。
画面設計や操作性は同じではないためUIに関する修正を行わないとMacには最適化されないが、アプリケーション1つでマルチプラットフォームで動作することは、デスクトップ―モバイル間をシームレスに行き来するうえでも非常に有意義なものである。

## CPUとGPUが同じSoCに搭載
従来のIntel版MacにはIntel製のCPUに加えIntel、NVIDIAまたはAMD製のGPUを搭載していた。Appleシリコン版MacではApple製のCPUとApple製のGPUが同じチップ（SoC）に共存するような形になる。
NVIDIAやAMDなどのディスクリートGPUは非常にパワフルであると同時に消費電力が大きい。
デザイナーやクリエイターなどは非常にパワフルなGPUを必要とするが、一般的なユーザーはそこまでのGPUを必要としない。
Webを見たり、動画を見たり、ちょっとした機械学習を使用するアプリを起動するだけのユーザーが多数を占める。
そういったユーザーは普段上限まで使用しないGPUの性能よりもより長く操作できる方が有益である。
Appleシリコンは、CPUとGPUがAppleの自社設計により同一SoC上に搭載される。
CPUとGPUは強調して動作されるように設計されており、共有するメモリー空間を使用することが可能である。
CPUとGPUは余計なI/Fを介在する必要なく画像処理を行うことできるため、高速に処理することが可能である。
また、Appleシリコン向けに作られたMetal APIを使用していればこの共有メモリー構造に対応するアプリケーションを開発でき、Appleシリコン向けに最適化したアプリケーションはデスクトップ・モバイルいずれでも使用することが可能となる。

## 性能の違うマルチコアCPU：Asymmetric multiprocessing
![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/apple-silicon/asymmetric-cores.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/apple-silicon/asymmetric-cores.png)
<sup>[https://developer.apple.com/](https://developer.apple.com/documentation/os/workgroups/tuning_your_code_s_performance_for_apple_silicon)より</sup>

従来のMacではマルチコアのCPUは同じ性能のコアを複数所持している。AppleシリコンMacではCPUのコアはすべて同じ性能ではない。高性能コアと低燃費コアの2種類のコアを持っていて、タスクは優先度・重要度によってどちらかのコアに振り分けられる。リソースを効率的に使うようになっている。
アプリのタスクが適切なコアで処理されるようにするにはタスクの重要度（Quality of Service, QoS）を指定すれば、OSが自動的に割り振ってくれる。タスクのQoSはGrand Central Dispatch（GCD）を使う際に指定するので、慣れている開発者も多いだろう。

## Intel x86用バイナリー変換ツール：Rosetta2
![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/apple-silicon/Rosetta_2.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/apple-silicon/rosetta2.png)
<sup>[WWDC2020](https://developer.apple.com/videos/play/wwdc2020/10686/)より</sup>

名前から推測できるようにRosetta2（ロゼッタストーン）は変換ツールだ。Intel x86用のバイナリーをArm用に変換してくれる。語尾についている2から分かるようにPowerPCからIntel x86に移行した時にも同様なツールが提供された。
Intel x86用のアプリのインストール時または実行時にArm用のアプリに変換を行って、ユーザーにシームレスなユーザーエクスペリエンスを提供してくれる。Armアーキテクチャーでネイティブに実行できるアプリをユーザーに提供できるまでの間、Rosetta2を使ってIntel x86用のアプリが実行できるので開発者、ユーザーの負担を減らしてくれる。

## Intel x86とArm両用バイナリー：Universalバイナリー

![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/apple-silicon/universal-binary.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/apple-silicon/universal-binary.png)
<sup>[https://developer.apple.com/](https://developer.apple.com/documentation/xcode/porting_your_macos_apps_to_apple_silicon)より</sup>

2020年末に初代Appleシリコン搭載のMacが販売される予定だが、すぐにすべてのユーザーがAppleシリコンMacに乗り換えるわけではない。PowerPCからの移行を見ると、AppleのOSは約5年間二つのアーキテクチャーをサポートしていたので今回も5年間IntelとArm両方をサポートすると思われる。そのため、開発者も5年間は両アーキテクチャーでアプリケーションを提供する必要がある。しかしIntel用のアプリケーション、Arm用のアプリケーションと分けて用意する必要はない。Universalバイナリーをビルドすれば、Intel用とArm用両方のバイナリーを含んだアプリがビルドできる。Universalバイナリーは実行された環境に合ったバイナリーを実行する。これもまたユーザーと開発者の負担を減らしてくれるのでありがたい。

## カーネル拡張の開発が難しくなる
![https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/apple-silicon/macOS11-SIPenable-blockKext.png](https://raw.githubusercontent.com/gmorimoto-spc/qiita-src/master/apple-silicon/macOS11-SIPenable-blockKext.png)

Appleシリコンのみではなく、今年発表されたmac OS 11でカーネル拡張をインストールして起動させるのが困難になる。去年カーネル拡張に変る新しい機能「システム拡張」が発表され、一部のカーネル拡張機能が非推奨になり、将来的には使用不可能になることが分かった。その将来がmacOS 11だ。システム拡張を使用して実装できる機能と同じ機能を持っているカーネル拡張はmacOS 11ではインストールできない。それに加えAppleシリコンMacではカーネルのセキュリティーが強化され、さらにカーネル拡張のインストールが困難になる。ドライバなど本来カーネル拡張で実装していた機能はできるだけ早くシステム拡張に移行する必要がある。

## 最後に
Appleシリコンについてまとめてみた結果、色々とIntel版とは違いがあるが、移行をできるだけスムーズに行うためのAppleの計らいが目立った。難点はカーネル拡張を使用しているアプリやツールの移行になるだろう。
これから、気になる点をもう少し深堀していく予定なので、興味があればフォローの方をよろしくお願いします。

### 参考資料
https://developer.apple.com/documentation/xcode/porting_your_macos_apps_to_apple_silicon
https://developer.apple.com/documentation/apple_silicon/running_your_ios_apps_on_macos
https://developer.apple.com/documentation/os/workgroups/tuning_your_code_s_performance_for_apple_silicon
https://developer.apple.com/videos/play/wwdc2020/10686/