"명령어 집합은 계약이야. 코어는 그 계약을 지키는 방법이고."
'Arm'이라 불리는 두 가지
회사 Arm은 아주 다른 두 가지를 팔아. 코어 라이선스는 완성된 프로세서 설계, 그러니까 Cortex 코어야. 칩 벤더가 자기 다이에 올리고 자기 메모리 컨트롤러, GPU, 주변장치로 둘러싸. 대부분의 폰과 노트북 SoC가 이렇게 만들어져. 코어는 Arm 거고 통합은 벤더 거야. 아키텍처 라이선스는 다른 거야. Arm 명령어 집합을 자기가 설계한 마이크로아키텍처로 구현할 권리. 바이너리는 같고, 그 밑의 전부, 코어가 얼마나 넓은지, 분기를 어떻게 예측하는지, 큐가 얼마나 깊은지, 클럭을 어떻게 잡는지는 네가 정해.
애플은 두 번째 종류를 가졌어. 2012년 A6부터 애플 CPU 코어는 Arm 명령어 집합을 구현하는 애플 설계였고(A7부턴 AArch64, 폰에 들어간 첫 64비트 Arm 코어), M 시리즈 코어는 같은 계보가 자란 거야. 'M1은 Arm 칩이야?'에 대한 정확한 답이 이거야. Arm의 명령어 집합을 돌리고, 코어 중 어느 것도 Arm이 설계하지 않았어.
명령어 집합이 뭐고, 왜 빌리기에 딱 맞는 거였는지
명령어 집합 아키텍처(ISA)는 소프트웨어와 하드웨어 사이의 경계야. 컴파일러가 겨냥하고 코어가 지켜야 하는 명령어 목록, 레지스터, 메모리 모델, 특권 레벨. 앞 트랙이 말한 정확히 그 뜻의 인터페이스고, 애플이 소유하지 않기로 고른 유일한 인터페이스야. 이유는 인터페이스가 늘 주는 선물, 반대편에서의 교체야. 이미 컴파일러, 운영체제, 디버거, 10년치 최적화된 라이브러리가 있는 ISA를 채택하면서 애플은 소프트웨어 층 전체를 공짜로 얻었고, 자기한테 중요한 반쪽인 그 밑의 코어에 엔지니어링을 쓸 수 있었어.
라이선스가 애플한테 남기는 건 스펙 시트가 '마이크로아키텍처'라고 부르는 전부야. 사이클당 디코드하고 발행하는 명령어 수, 재정렬 윈도우 크기, 캐시 크기와 계층, 분기 예측기, 클럭, 그리고 다이 위 코어 종류의 조합. 다음 세 레슨이 그 선택들에 대한 거야. 이 레슨의 요점은 그것들이 선택이라는 거야. 애플은 Cortex 코어를 받아 들고 최선을 다하라는 말을 들은 게 아니야.
ISA엔 선택 사항이 있고, 네 맥이 뭘 가졌는지 알려줘
Arm의 ISA는 버전과 선택적 확장으로 자라. 고급 SIMD, 반정밀도 부동소수점, bfloat16, 정수 행렬 곱셈, Scalable Matrix Extension(SME). 각각은 코어가 구현하거나 안 하는 기능 플래그고, macOS는 그 플래그를 sysctl hw.optional.arm.FEAT_*로 보여줘. 코드 블록이 읽어. M3 Ultra에선 FEAT_BF16, FEAT_I8MM, FEAT_FP16이 켜져 있어. CPU 위 머신러닝 산술에 중요한 확장들이야. 그리고 FEAT_SME는 0이야. SME는 M4 세대에 왔거든. 이 마지막 플래그는 기억해 둘 만해. 애플이 M1부터 이름 한 번 안 붙이고 실어 온 행렬 유닛의 공개되고 문서화된 후계자거든. 네 번째 레슨 얘기야.
ISA를 빌린 결과 하나는 코딩 어시스턴트가 거꾸로 알고 있어서 짚어둘게. 애플 실리콘은 x86 코드를 돌리지 않아. Intel 시절 바이너리는 번역기인 Rosetta 2를 거쳐 돌고, 번역기가 그만큼 잘 도는 건 애플이 그걸 위한 하드웨어 지원을 따로 만들었기 때문이야. 이것도 네 번째 레슨. ISA는 Arm한테서 빌렸고, Intel 호환성은 그 위에 공학으로 얹은 거야.