Vengineerの戯言

人生は短いけど、長いです。人生を楽しみましょう!

Apple M1機のSSDについて

@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそすべては、SystemC v0.9公開から始まった 

はじめに

Apple M1機の内蔵SSDの性能については、下記の記事がありました。

iphone-mania.jp

Write(2190.1 MB/s), Read(2676.4 MB/s)

また、Apple M1機の外部SSDの性能について、下記の記事がありました。

www.itmedia.co.jp

対象機種は、以下の2機

テスト対象とした SSD は、以下の2点。

  • MIWAKURAのUSB 3.2 Gen 2接続M.2 NVMe SSD「MPC-DCM2U3C」
  • Samsung製Thunderbolt 3接続ポータブルSSDSamsung Portable SSD X5」

USB 3.2 Gen 2 接続ということは、10Gbps です。ということはざっくり最大 1.25 GB/s です。
Thunderbolt 3接続ということは、40Gbps です。ということはざっくり最大 5 GB/s です。

測定結果

  • M1 内蔵SSD : Write(2190.1 MB/s), Read(2676.4 MB/s)
  • M1 + USB 3.2 Gen2 : Write(546. 8MB/s), Read(523.2 MB/s)
  • Intel + USB 3.2 Gen2 : Write(891.1 MB/s), Read(948.9 MB/s)
  • M1 + Thunderbolt 3 : Write(2009.3 MB/s), Read(2573.1 MB/s)
  • Intel + Thnderbolt 3 : Write(1891.5 MB/s), Read(2576.3 MB/s)

M1のUSB 3.2 Gen2だと、Intelよりもかなり遅いですね。Macbook Pro (2019)だと第9世代Intel Core i7とすると、

(下図は、Intel,計25製品のデスクトップPC向け第9世代Coreプロセッサを発表。低消費電力版や100ドル未満の低価格CPUを拡充からの引用です)

Thunderbolt 3は、ICHから出ていますね。CPU側との接続が DMI 3.0 なので、実質 PCIe Gen3 x4 = 8Gbps x 4 = 32 Gbps = 4 GB/s が最大転送レートです。

この結果から、M1の内臓SSDは、外付けのThunderbolt 3 の転送性能 を超えていることがわかります。

f:id:Vengineer:20210222084704p:plain

Apple M1 でのSSDはどうなっているのか?

下記の記事によると、SSDの接続は、「Apple Fabric」なるあたらしいプロトコルというもので接続されているとあります。
ディスクユーティリティの接続の部分が、Apple Fabric になっている。一般的には、SSDは NVMe M.2 にて接続されています。M.2 は、信号的には PCIe Gen 3 x4 またPCIe Gen 4 x4 になっています。

news.mynavi.jp

2月1日のブログ、Apple M1 で SSD(NVMe)から Linux がブートできるようになったので、NVMe関連を眺めてみたにも書きましたが、Apple M機には SSDが2個載っています。仮に、2つのSSDが NVMe M.2 で接続されているとなると、PCIe x4 が2組必要になってきます。

ちなみに、Wikipediaには、下記のように、iPhone6S, 6S Plusでは、NVMe over PCIe を採用していて、その後の iPad ProとiPhone SEでも採用とありますので、NVMe over PCIe を使っていたことは確かなようです。

iPhone 6Sと6S Plusの発売でAppleスマートフォンにNVMe over PCIeを採用した初のモバイル展開を発表した。Appleはこれらの発売に続いて、同じくNVMe over PCIeを使用するiPad ProとiPhone SE を発売した。

iPhone の NVMe を探る

2月21日のブログ、Apple SoC AシリーズのPCIe ControlleriPhone 7(A10)から iPhone 12(A14)までの device tree を探りました。このブログでは、PCIe Controller についてみてみましたが、NVMe についても書きました。

A10では、pcie-bridge0 のところに、s3e というデバイスが付いていて、これが NVMe のようです。A11からは s3eではなく、ans(s4e)というデバイスになっています。この ansは PCIeに接続しているのではなく、別のデバイス(モジュール)になっています。つまり、iPhone 7 (A10)までは NVMe over PCIe を使っていたけど、iPhone X (A11)からは NVMe over PCIe ではなく、ansという NVMeモジュールを使っているということになります。

appleinsider.commashable.com


によると、下記のようにあるので変更はされたようですね。

There are also other specialized features of the A11 Bionic, including its super speedy SSD storage controller with custom ECC (error-correcting code) algorithms, as Johny Srouji, Apple's senior vice president of Hardware Technologies, detailed in an interview with Mashable.

Apple M1には、ans があるか?

Apple M1 で SSD(NVMe)から Linux がブートできるようになったので、NVMe関連を眺めてみた に戻ります。

dtsファイルに、ans なるモジュールがありますね。device_type は "pci"になっていますね。

あれ、となると、NVMe over PCIe なのか?

        ans: ans@27bcc0000 {
            compatible = "apple,nvme-m1";
            reg = <0x2 0x7bcc0000 0x0 0x40000  /* NVMe + Apple regs */
                   0x2 0x7bc50000 0x0 0x4000>; /* SART regs */
            interrupts = <0 590 4>;
            clocks = <&pcie_st_clk>;
            mboxes = <&ans_mbox 32>;

            #address-cells = <3>;
            #size-cells = <2>;
            #interrupt-cells = <1>;
            device_type = "pci";
            msi-controller;
            msi-parent = <&ans>;
            ranges = <0x02000000   0x0 0x7bc00000   0x2 0x7bc00000 0x0 0x00100000>;
            bus-range = <0x00 0x01>;
        };

そうです。Apple M1 で SSD(NVMe)から Linux がブートできるようになったので、NVMe関連を眺めてみたを書いたときは、NVMe over PCIe だとばっかり思っていました。ちょっと変だな?と思ったのは、pcie-apple-m1-nvme.c の PCIe Configuration Space へアクセス関数 (apple_m1_ans_config_read, apple_m1_ans_config_write)では、実デバイスにアクセスしているのではなく、デバイスドライバ内の構造体にあるメンバーにアクセスしているところです。

この commit のタイトルが、

Virtual PCI controller for Apple M1 NVMe storage.

というのも気になっていました。

dtsファイルには、ans_mbox というモジュールがあります。compatible に "apple,iop-mailbox-m1”とあります。

        ans_mbox: ans_mbox@277400000 {
            compatible = "apple,iop-mailbox-m1";
            reg = <0x2 0x77400000 0x0 0x20000>;
            interrupts = <0 583 4   0 586 4>;
            clocks = <&pcie_st_clk>;

            #mbox-cells = <1>;
            endpoints = <32>;
            wait-init;
        };

Documentによると、

Apple SoCs contain numerous IOPs (I/O Processors) that talk to the cores running Linux (AP) over a common mailbox protocol.

とあります。ということは、NVMe の制御にこのI/O Processorsを使っていることになるということです。

Thunderbolt 4

Apple M1機のSSDは、NVMe Over PCIe ではない違うインターフェースで接続されることまではわかりました。では、実際にどのようなインターフェースで接続しているのでしょうか?

Apple M1機には、Thunderbolt 4 が 2ポート搭載されています。Thunderbolt 4 は ここによると、PCデータ最低要件が

PCIe 32Gbps、USB 3.2 - 10Gbps

とあります。

SSDの測定結果の振り返ってみると、

  • M1 内蔵SSD : Write(2190.1 MB/s), Read(2676.4 MB/s)
  • M1 + Thunderbolt 3 : Write(2009.3 MB/s), Read(2573.1 MB/s)

となっていました。ということは、M1 内蔵SSDは、Thunderbolt3 ぐらいの性能は出るようになっている。Thunderbolt3 の PCデータ最低要件は、PCIe 16Gbps、USB 3.2 - 10Gbps です。Thunderbolt 4の半分です。
Apple M1機にはSSDが2個付いているので、Thunderbolt 3 相当が2個になり、これは Thunderbolt 4 相当になるということです。Wikipedia によると、Thunderbolt 3 および 4 では、PCIeのLane数が2となります。Thunderbolt 3 は 16 Gbps x2 = 32 Gbps = 4GB/s、Thunderbolt 4 は、32 Gbps x2 = 64 Gbps = 8 GB/s です。

ここからは妄想です。

Thunderbolt 4 を半分にしても4 GB/s になるの、SSDとは 1Laneで接続すればいいわけです。そうすることで、M1とSSDの接続が PCIe Gen4 x1 が 2組あればいいことになります。
SSD側は NVMe M.2 PCIe Gen4 x4 として開発しても、PCIe であれば x4 を x1 で接続しても問題無いはずです。

iPad Pro 用の A12X/A12Zを振り返ってみた

下の写真は、A12X搭載の iPad Pro 2018 の Teardown からの引用です。
1個しか実装されていませんが、SSDが2個載るようになっています。
https://d3nevzfk7ii3be.cloudfront.net/igi/SgrarV1BiJOVqPIl.huge

下の写真は、iPad Pro 12.9インチ(第4世代)の分解のビデオでも同様に、1個しか実装されていませんが、SSDが2個載るようになっています。

Apple M1機の開発用マシン(Developer Transition Kit)で使われた A12Z でも同じようにSSDが2個接続できるようになっていました。Developer Transition KitにはSSDが512GB搭載されているようですが、2個SSDが載っているかまでは確認とれていません。

おわりに

Apple M1機のSSDについていろいろと調べてみました。iPhone 7 (A10)までは、NVMe over PCIe を使っていたようですが、A11からは独自の方法(ansというもの)を使ってSSDと接続していたようです。M1でも同じ方法でSSDと接続していますが、iPhone用のAシリーズとはちょっと違って2つのSSDと接続しています。iPad 用の A12X/A12Zでも2つのSSDを接続していました。

Apple は A10 から A11 で大きな変更をしました。

  • CPU:pCoreとeCoreが同時に動くように変更
  • GPU を Imagination から 独自開発GPUに変更
  • L3 の削除
  • Neural Engine を投入、ただし、A12 Bionicに搭載されたものとは違うもの
  • SSDの接続をNVMe over PCIe から ans (なんの略語なんでしょうか?) に変更

最後の SSDの接続が今回の調査でわかったのは大きな収穫でした。

追記)、2021.02.26
IntelTiger Lake では、Thunderbolt 4 を ICHではなく、CPU側に置いている。


おまけに、Rocket Lakeでは、DMI 3.0 は x4 ではなく、x8 に。

もひとつおまけ、
Intel Thunderbolt 4 Update: Controllers and Tiger Lake in 2020 によると、
Data, PCIe at 32 Gbps (storage up to 3 GB/s)
とある、PCIe Gen4 だと、32 Gbpsなので 4GB/s になる。

関連ブログ:
vengineer.hatenablog.com
vengineer.hatenablog.com