요약
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().
관련 노트
- 32비트 아키텍쳐, 64비트 아키텍쳐
- Docker Buildx provenance는 이미지를 OCI Index로 만들어 SageMaker와 Lambda에서 깨진다
- 하이퍼스케일러가 ARM으로 간 이유는 성능이 아니라 x86에 라이선스 창구가 없어서다