본문 바로가기
C.W.K.
Stream
Lesson 01 of 06 · published

남의 명령어 집합에 맞춰 코어 설계하기

~14 min · cpu-soc, arm, isa, architecture-license, microarchitecture

Level 0스펙 시트 훑는 사람
0 XP0/91 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"명령어 집합은 계약이야. 코어는 그 계약을 지키는 방법이고."

'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 호환성은 그 위에 공학으로 얹은 거야.

Code

isa_features.py — 이 코어는 Arm ISA의 선택 사항 중 뭘 구현했어?·python
#!/usr/bin/env python3
"""Read the Arm feature flags macOS exposes. 1 = implemented, 0 = not.
The set is the architecture license made visible: Apple chose these."""
import subprocess

out = subprocess.run(["sysctl", "hw.optional.arm"], capture_output=True, text=True).stdout
flags = {}
for line in out.splitlines():
    key, _, val = line.partition(": ")
    flags[key.replace("hw.optional.arm.", "")] = val.strip()

WATCH = ["FEAT_FP16", "FEAT_BF16", "FEAT_I8MM", "FEAT_DotProd", "FEAT_SME", "FEAT_SME2", "FEAT_LSE", "FEAT_SHA512"]
print(f"{len(flags)} feature flags reported\n")
for k in WATCH:
    print(f"{k:14} {flags.get(k, 'not reported')}")

print("\nml-relevant:", ", ".join(k for k in ("FEAT_FP16", "FEAT_BF16", "FEAT_I8MM", "FEAT_SME") if flags.get(k) == "1"))
셸에서 같은 플래그 보기, 그리고 커널이 보고하는 아키텍처·bash
sysctl hw.optional.arm.FEAT_BF16 hw.optional.arm.FEAT_I8MM hw.optional.arm.FEAT_SME
# hw.optional.arm.FEAT_BF16: 1      <- office, M3 Ultra, 2026-09-15
# hw.optional.arm.FEAT_I8MM: 1
# hw.optional.arm.FEAT_SME: 0       <- SME arrived with M4; an M4/M5 Mac reports 1

uname -m          # arm64
arch              # arm64 natively; i386 inside a Rosetta shell (lesson four)

External links

Exercise

닿을 수 있는 모든 맥에서 isa_features.py를 돌리고 카드에 두 칸을 추가해. FEAT_SME(0 또는 1)랑 보고된 플래그 개수. 그다음 네 기계 둘 사이에서 값이 다른 플래그 하나를 찾고, Arm의 기능 목록을 보고 그 플래그가 있는 기계에서 프로그램이 할 수 있는데 없는 기계에선 못 하는 게 뭔지 한 문장으로 써.
Hint
FEAT_SME가 뻔한 분기점이야(M4 이후). 네 맥이 전부 한 세대면 FEAT_SME2를 FEAT_SME랑 비교하거나 암호 플래그를 봐. 요점은 'Arm'이 계약의 가족이고, 네 맥은 그중 특정한 하나에 서명했다는 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.