명령어 집합 아키텍처(Instruction Set Architecture, ISA)는 소프트웨어가 보는 CPU의 약속이다. 어떤 명령을 쓸 수 있고 레지스터가 몇 개인지, 데이터 형식과 예외, 메모리 순서, 권한 수준이 어떻게 되는지를 정한다. x86-64와 Arm A-profile, RISC-V가 서로 다른 ISA 계열인 이유가 여기에 있다. ISA는 기계 명령의 호환 기반이므로, 컴파일러와 운영체제는 이 약속에 기대어 코드를 만든다.
ISA와 마이크로아키텍처
- ISA
- 소프트웨어가 보는 약속 — 명령어, 레지스터, 데이터 형식, 예외, 권한
- 마이크로아키텍처
- 그 약속을 실제 회로로 구현하는 방식
- 대표 계열
- x86-64, Arm A-profile, RISC-V
- 호환성 확인
- SIMD·암호·가상화 확장, 32/64비트 모드, 운영체제가 요구하는 최소 기능
마이크로아키텍처는 그 약속을 실제 회로로 구현하는 방식이다. 프런트엔드가 한 번에 몇 개의 명령을 가져오는지, 실행 유닛이 몇 개인지, 파이프라인이 얼마나 깊고 캐시와 분기 예측기가 어떤 구조인지는 ISA가 정해 주지 않는다. 그래서 같은 x86-64 프로그램을 돌리는 두 CPU가 같은 클럭에서도 다른 성능과 전력을 보인다.
CISC와 RISC라는 구분
x86은 복잡하고 길이가 가변적인 명령을 포함하고, Arm과 RISC-V는 비교적 규칙적인 형식을 쓴다. 하지만 현대 고성능 CPU는 들어온 명령을 내부 동작으로 변환한 뒤 비순차로 실행한다. 그래서 “CISC는 복잡해서 느리고 RISC는 단순해서 빠르다”는 결론은 실제 구현을 설명하지 못한다. 명령 형식보다 내부 실행 구조가 성능을 좌우한다.
ISA 호환성도 이름 하나로 끝나지 않는다. SIMD와 암호, 가상화 확장 명령을 지원하는지, 32비트와 64비트 실행 모드가 어떻게 되는지, 운영체제와 컴파일러가 요구하는 최소 기능을 채우는지를 확인해야 한다. 프로그램이 특정 확장 명령을 요구하면 같은 ISA 계열이라도 구형 CPU에서는 실행되지 않는다.
모바일 SoC와 서버 CPU는 ISA만 보면 부족하다. 메모리 일관성 모델과 인터커넥트 구조, 가속기와 I/O를 어떻게 통합했는지가 실제 성능과 전력에 크게 작용한다. 제품을 비교할 때는 명령어 이름보다 해당 제품의 마이크로아키텍처와 시스템 구성을 기준으로 삼는다.
바이너리 호환성에는 운영체제도 포함된다
ISA가 맞아도 실행 파일 형식, 시스템 호출, 호출 규약과 라이브러리가 맞지 않으면 같은 바이너리를 그대로 실행할 수 없다. 예를 들어 같은 x86-64 CPU에서 쓰는 Windows 프로그램과 Linux 프로그램은 운영체제 인터페이스가 다르다. ISA는 기계 명령을 해석할 수 있는 조건이고, 응용 프로그램의 호환성에는 운영체제와 ABI(Application Binary Interface)가 추가된다.
확장 명령 지원도 실행 시점의 조건이다. 프로그램이 CPU 기능을 조회해 지원 경로를 고르는 방식과, 특정 확장을 필수로 넣어 빌드한 방식은 다르다. 후자는 필요한 명령이 없는 CPU에서 불법 명령 예외로 중단될 수 있으며, 단순히 더 느리게 실행되는 것으로 해결되지 않는다.
함께 읽기: CPU의 구조와 명령 실행, 파이프라인과 비순차 실행
참고 링크
- Intel, Intel 64 and IA-32 Architectures Software Developer Manuals
- Arm, A-Profile Architecture
- RISC-V International, Technical Specifications