인텔 P5 마이크로아키텍처
(♥ 0)
1. 개요[편집]
1993년 3월 22일, 인텔 펜티엄 시리즈에 최초로 이용된 마이크로아키텍처로, x86 최초의 슈퍼스칼라 마이크로프로세서이다.
후속 아키텍처는 인텔 P6 마이크로아키텍처.
2. 특징[편집]
대표적인 특징은 486에 비해 개선된 사항들로, 다음과 같다.
- 코어 레벨 (486 대비)
- 프론트 엔드/백 엔드 공통
- 두 개의 정수 파이프라인으로 구성된 슈퍼스칼라 아키텍처
- 프론트 엔드
- 분기 예측 도입 및 분기 대상 버퍼(BTB) 추가
- 2-bit 카운터 기반 local prediction #
- BTB 구성: 256 엔트리, 4-way set associative
- 명령어 인출 대역폭이 사이클당 16 바이트 → 32바이트로 증가 (2배)
- 정렬되지 않은 경우의 명령어 인출 성능 개선 (split fetching 도입)
- 분기 예측 도입 및 분기 대상 버퍼(BTB) 추가
- 백 엔드
- 간단한 명령어를 처리할 수 있는 정수 파이프라인 (V-Pipe) 추가 (총 1개→2개)
- 하드웨어 곱셈 유닛 추가
- 빨라진 부동 소수점 연산 장치(FPU)
- FPU의 파이프라인화
- 명령어 실행 latency, throughput 개선
- 간단한 부동소수점 명령어와 뒤따르는 FXCH 명령어를 병렬로 실행 가능
- 마이크로코드 개선
- 메모리 서브 시스템
- 코드 캐시와 데이터 캐시의 분리
- 캐시 구성이 8 KB, 4-way → (I) 8 KB, 2-way + (D) 8 KB, 2-way 로 변화
- 데이터 캐시를 8개의 뱅크로 나누어 2개의 파이프라인에서 동시에 접근할 수 있도록 함
- 캐시 라인 크기가 16B → 32B로 증가
- 4M 페이지 지원 추가 (Page Size Extension)
- 4M DTLB 추가
- 기타
- 파이프라인은 80486과 동일하게 5단계(PF-D1-D2-EX-WB)로 구성
- CMPXCHG8B, CPUID, RDTSC 등의 명령어 추가
- 프론트 엔드/백 엔드 공통
- 프로세서 레벨 (486 대비)
- 32비트에서 64비트로 넓어진 외부 데이터 버스폭
슈퍼스칼라 구조의 도입 및 부동소수점 유닛의 개선으로 으로 486 대비 클럭당 성능이 크게 향상되었다. 다만 순차적 실행 방식 등의 한계로 인해 P5에 최적화된 컴파일러로 재컴파일하지 않은 경우 최적화된 바이너리 대비 정수 연산에서 30%, 부동소수점 연산에서 50% 가량 낮은 성능을 보였다고 한다. P5와 P54 모델 중, 초기형 저클럭 모델에는 FDIV 버그가 존재한다. 또한 잘못된 CMPXCHG8B 명령어가 LOCK 접두사와 사용된 경우 시스템이 정지하는 F00F 버그도 존재하였으나 해당 버그의 경우 운영체제 차원에서 해결 가능하여 FDIV 버그와 달리 크게 이슈화되지는 않았다.
3. 상세[편집]
P5 마이크로아키텍처는 U-pipe와 V-pipe 2개의 파이프라인을 두어 특정한 명령어 조합에 대해 클럭당 2개의 명령어를 실행할 수 있도록 하였다. (이때 첫번째 명령어는 U-pipe에서, 두번째 명령어는 V-pipe에서 실행된다.) 한 사이클당 하나의 명령어가 실행되는 경우 U-pipe에서 실행되며, U-pipe는 모든 명령어를, V-pipe는 일부 명령어만을 실행할 수 있다.
동시에 실행할 수 있는 명령어의 조합은 다음과 같다:
- 대부분의 ALU 명령어 (mov, add, sub, and, or, xor)
- 비교 명령어 (cmp, test)
- 스택 조작 명령어 (push, pop)
- Carry 및 borrow 명령어(adc, sbb 등)는 U pipe에서만 실행될 수 있다.
- 접두사가 사용된 명령어의 경우 U pipe에서만 실행될 수 있다. 단, Pentium MMX에서는 0Fh, 66h, 67h 접두사가 사용된 명령어가 V pipe에서 실행될 수 있음
- shift imm 명령어는 U pipe에서만 실행될 수 있다.
- fadd, fmul, fld 등 일부 부동소수점 명령어는 U pipe에서만 실행될 수 있다.
- call near, jmp near, jcc 등 단순한 control transfer 명령어 및 fxch 명령어가 U pipe에서 실행되는 경우 V pipe를 사용할 수 없다. (이러한 명령어가 V pipe에서 실행되는 경우 동시에 U pipe를 사용할 수 있다.)
동시에 실행할 수 없는 명령어의 조합은 다음과 같다:
- CL 레지스터를 shift count로 사용하는 shift 및 rotate 명령어
- mul, div 등 여러 사이클에 걸쳐 실행되는 사칙연산 명령어
- ret, enter, pusha, movs, stos, loopnz 등의 확장된 명령어
- fscale, fldcw, fst 등 일부 부동소수점 명령어
- push, sreg, call far 등 inter-segment 명령어
- 레지스터 의존성(RAW, WAW)이 존재하는 경우. 이때 al, ah 등 8비트 및 16비트 레지스터는 해당하는 32비트 레지스터에 대한 참조로 간주되므로 한 명령어가 al에 값을 쓰고 그 다음 명령어가 ah에 값을 쓰는 경우 eax에 대한 WAW hazard 때문에 동시에 실행될 수 없다. (단, EFLAGS에 대한 WAW 의존성 및 스택 포인터, 조건 코드에 대한 의존성은 예외)
- 두 명령어가 동일한 데이터 캐시 뱅크에 접근하는 경우
- (접두사를 제외한) 두 명령어 중 하나가 7바이트를 초과하는 경우. Pentium MMX의 경우 첫 번째 명령어에 대한 제한이 11바이트까지로 완화되었다.
4. 사용 모델[편집]
- 인텔 P5 마이크로아키텍처/사용 모델
- P5
- P54C
- P54CQS
- P54CS
- Pentium OverDrive
- P55C (Tillamook) - Pentium MMX
이 문서의 내용 중 전체 또는 일부는 2024-09-20 06:46:03에 나무위키 인텔 P5 마이크로아키텍처 문서에서 가져왔습니다.