@Vengineerの戯言 : Twitter
SystemVerilogの世界へようこそ、すべては、SystemC v0.9公開から始まった
「Apple M1が何故、速いのか?」の調査をしています。
その一環として、AppleのAシリーズのSoCを眺めてみました。
まずは、ツイートから。
AppleのA7からA14までを眺めていると、
— Vengineer@ (@Vengineer) 2020年11月25日
A7 .. A8 .. A9 .. A10 => A11 .. A12 => A13 .. A14
って、2回、アーキテクチャが変わっているんだけど、
なんでだろうか?
A10 => A11 の時は、GPUが内製GPUになって、NoCをArmから調達しなくてよくなり、L3が無くなった感じ。
もう一つ。
A12 => A13 の時は、L2が big と LITTLE で共用だったのが、bigはコア毎にL2、LITTLEは4コアで共用4MBになった感じ。
— Vengineer@ (@Vengineer) 2020年11月25日
A14 => M1では、big が 2コアから4コアになった感じ。
ANANDTECHの下記の記事にも多少載っています。
基本的には、Wikipedia(日本語と英語)とANANDTECHからの情報です。
上記のANANDTECHの記事には、A7からですが、最初のオリジナルCPUコアを搭載したのは、A6です。この時のコアのnicknameは、Swiftで、Armv7-Aなので32ビットコアです。2コア構成でL1 Cacheは、Instruction/Data ともに32KBでした。L2 Cacheは 1MBの共有です。
A7が最初のArmv8-Aのコアで、Cycloneというnicknameが付いています。
L1 Cache は、それぞれ2倍の 64KB/64KB です。L2は1MBのままですが、L3が付きました
Apple A6 :2コア (Swift x2)、Armv7-A、GPU(PowerVR)
L1I : 32KB, L1D : 32KB、L2 : 1MB(共有)Apple A7 :2コア (Cyclone x2)、Armv8-A:ARM64
L1I : 64KB, L1D : 64KB、L2 : 1MB、L3 : 4MBApple A8 :2コア (Typhoon x2)
L1I : 64KB, L1D : 64KB、L2 : 1MB、L3 : 4MBApple A9 :2コア (Twister x2)
L1I : 64KB, L1D : 64KB、L2 : 3MB、L3 : 4MBApple A10:4コア (Hurricane x2 + Zephyr x2)、GPU(PowerVR)
Hurricane : L1I : 64KB, L1D : 64KB、L2 : 3MB、L3 : 4MBApple A11:6コア (Monsoon x2 + Mistral x4)、GPU/Neural Engine
Monsoon : L1I : 64KB、L1D : 64KB、L2 : 8MB / ShareVortex : Apple A12 : 6コア (Vortex x2 + Tempest x4)
Vortex : L1I : 128 KB、L1D : 128 KB、L2 : 8MB / ShareTempest : L1I : 32 KB、L1D : 32 KB、L2 : 2MB / Share
Apple A13 : 6コア (Lighting x2 + Thunder x4)
Lighting : L1I : 192KB、L1D : 128 KB、L2 : 8MB / Share
Thunder : L1I : 48 KB、L1D : 48 KB、L2 : 4MB / ShareApple A14 : 6コア (Firestorm x2 + Icestrom x4)
Firestorm : L1I : 128 KB、L1D : 64 KB、L2 : 8MB / Share
Icestorm : L1I : 48 KB、L1D : 48 KB / Core、L2 : 4MB / Share
A7からA9までは、2コアです。A9になってL2が3MBに増えました。
A10からは big/LITTLEの構成になり、2+2に。
A11では、2+4コアに。GPUがImaginationのPowerVRから独自GPUになり、Neural Engineも付きました。また、L3 Cacheが無くなり、L2 Cache が 8MBの倍増になりました。
A12では、L1 Cache が ともに128KBになりました。
A13では、bigのLightingのL1 Instructionが192KB、LITTLEのThunderのL1 Cacheが48KB、L2が4MBになりました。
A14では、FirestormのL1 InstructionがA12と同じ128KBに戻り、L1 Data が 64KBと半減しています。
こうしてみると、A11が一つの転換期。何故なら、GPUがオリジナルになり外部IPを使わなくてよくなったということ。その結果、L3 Cacheを無くしています。L3 Cacheがあったのは、Arm の NoC を使っていて、性能を出すためには L3 が必要だったのではと妄想しています。A11ではNoCもApple独自になり、L3 Cacheなくても性能が出せるようになったのだと思います。A11以降のbigは2コアでL2 8MBを共用する感じになっています。
ちなみに、AppleのLLVM(github)の中を覗いてみたら、
// Support some CPU codenames as aliases for apple-aN so we can still LTO old bitcode.
def : ProcessorModel<"cyclone", CycloneModel, [ProcAppleA7]>;
def : ProcessorModel<"vortex", CycloneModel, [ProcAppleA12]>;
def : ProcessorModel<"lightning", CycloneModel, [ProcAppleA13]>;// iPhone and iPad CPUs
def : ProcessorModel<"apple-a7", CycloneModel, [ProcAppleA7]>;
def : ProcessorModel<"apple-a8", CycloneModel, [ProcAppleA7]>;
def : ProcessorModel<"apple-a9", CycloneModel, [ProcAppleA7]>;
def : ProcessorModel<"apple-a10", CycloneModel, [ProcAppleA10]>;
def : ProcessorModel<"apple-a11", CycloneModel, [ProcAppleA11]>;
def : ProcessorModel<"apple-a12", CycloneModel, [ProcAppleA12]>;
def : ProcessorModel<"apple-a13", CycloneModel, [ProcAppleA13]>;
とあるので、CPUのアーキテクチャ的には、A7からA13までは同じで Cycloneということですね、で、A14はなんでないんだろか?
ここで、気になるのは、L1 Cache のサイズです。下記に、MacBook ProにつかれていIntel Core i (第10世代)と (第11世代)の Cache のサイズを示しています。
L1 Instruction Cacheが32KB、L1 Data Cache が48KBです。
Armv8-Aの最初のA7ですら、L1 Cacheは共に 64KB です。
L2 Cacheに関しては、A11からbigは2コアで8MBなので、Intelよりもかなり大きいです。
Intel Core i (第10世代) : Ice Lake (Intel 10nm)
CPU : Ice Lake (L1I:32KB, L1D:48KB)
L2 Cache : 512KB/コア
LLC(全体) : 2MBxコア数Intel Core i (第11世代) : Tiger Lake (Intel 10nm SuperFin)
CPU : Willow Cove (L1I:32KB, L1D:48KB)
L2 Cache : 1.25MB/コア
LLC(全体) : 3MBxコア数
では、Apple M1を振り返ってみましょう。
Apple M1 : https://en.wikipedia.org/wiki/Apple_M1
Firestorm : L1I : 192 KB、L1D : 128 KB、L2 : 12MB / Share
Icestorm : L1I : 128 KB、L1D : 64KB、L2 : 4MB / Share
L1 は、A13と同じ Instruction が192KB、Dataが128KBになっています。L2は4MB増加です。1コア当たりだと、Aシリーズでは4MBでしたが、M1では3MBと少なくなっていまっす。
Intel に比べて、L1とL2が大きいのはなぜでしょうか?