Zettelkasten

amd64·x86_64·x64는 같은 ISA의 다른 이름이고 arm64만 다른 계열이다

·수정 1회

요약

  • amd64, x86_64, x64는 전부 같은 것을 가리키는 다른 표기다. x86의 64비트 확장을 AMD가 먼저 내놓아서(AMD64, 2003) 인텔 CPU에서도 아키텍처 이름이 amd64로 나온다.
  • arm64(=aarch64)만 계열이 다르다. 바이너리 호환이 없어서 컨테이너 이미지와 C 확장 wheel이 아키텍처별로 갈린다.

본문

이름 대응표

표기 실제 의미
x86, i386 인텔 명령어 집합 계열, 보통 32비트를 가리킴
x86_64, amd64, x64 같은 것의 다른 이름. x86의 64비트 확장
arm64, aarch64 ARM의 64비트 규격. 별개 계열

왜 하필 amd64인가

x86의 64비트 확장은 인텔이 아니라 AMD가 먼저 설계했고(AMD64, 2003) 인텔이 그것을 채택했다. 그래서 인텔 CPU에서도 아키텍처 이름은 amd64다. 배포판마다 표기 관습만 다르다 — Debian·Docker는 amd64, RHEL과 파이썬 platform.machine()은 x86_64.

"AMD 칩 대 인텔 칩" 얘기가 아니다. AMD 라이젠도 인텔 코어도 전부 amd64/x86_64다. 제조사가 아니라 명령어 집합 이름이다.

arm은 다른 집안

x86_64용으로 컴파일된 실행 파일은 arm64에서 그냥 돌지 않는다. 에뮬레이션(Rosetta 2, QEMU)을 거치면 돌지만 느려진다. CISC 대 RISC라는 구분이 흔히 따라붙지만, 현대 x86도 내부에서 마이크로옵으로 쪼개 실행하므로 실행 방식 차이는 예전만큼 크지 않다. 실무에서 중요한 건 바이너리가 호환되지 않는다는 사실 하나다.

실무에서 터지는 지점

  • Apple Silicon 로컬(arm64)에서 빌드한 이미지를 amd64 런타임에 올리면 exec format error. 명시적으로 docker build --platform linux/amd64를 걸어야 한다.
  • C 확장이 있는 파이썬 패키지는 아키텍처별로 wheel이 따로 배포된다. 해당 조합의 wheel이 없으면 소스 빌드로 떨어지고, 컴파일 에러는 거기서 터진다. 순수 파이썬 패키지는 이 문제가 없다.
  • 현재 아키텍처 확인은 uname -m 또는 platform.machine().

관련 노트

참고