이 자료를 쓰는 강의: 06 complex pipeline, CDC 6600 scoreboard, out-of-order issue 의 한계 · 07 Tomasulo algorithm: reservation station, CDB, register renaming
Lec6 - Tomasulo Algorithm
한국어판 강의자료 · 42쪽

p.1CSED503 고급 컴퓨터 구조 – 강의 6

p.2이전 강의 복습
- pipelining(파이프라인)은 다중 및/또는 variable latency functional units(변동 지연 기능 단위)에 의해 복잡해진다
- compilers(컴파일러)는 static scheduling(정적 스케줄링) 및 코드 최적화(예: 루프 전개)를 통해 pipelining(파이프라인) 위험을 줄일 수 있다
- 하드웨어는 cache misses(캐시 미스) 및 컴파일 시점에 알 수 없는 의존성과 같은 예측 불가능한 지연을 감내하기 위해, 다른 코드를 execute(실행)하면서 이를 해결하는 dynamic scheduling(동적 스케줄링)도 가능하다
- CDC 6600은 RAW dependency(RAW 의존성)을 추적하기 위해 scoreboarding(스코어보딩)을 사용했다
- in-order issue(순서 유지 발행), out-of-order execution(순서 무시 실행) 및 commit(커밋) (imprecise exception(부정확한 예외))
- instruction-level parallelism(명령어 수준 병렬성, ILP)은 WAR, WAW dependency(WAW 의존성)에 의해 제한된다

p.3순서 유지 완료 vs. 순서 무시 완료
- functional unit(기능 단위)의 다양한 지연과 가능한 값의 빠른 바이패스를 원하는 이유로, 가장 단순한 기계를 제외한 모든 기계는 순서 무시 완료를 가진다
- 클래식 RISC 5단계 integer pipeline(정수 파이프라인)은 거의 순서 유지 완료만을 가진다
- 로드가 두 사이클이 걸릴 경우, 다음의 한 사이클 integer operation(정수 연산)은 같은 시점에 완료되며, 더 빨리 완료되지 않는다
- pipelined FPU(파이프라인화된 FPU)를 추가하면 즉시 순서 무시 완료가 가능해진다

p.4in-order issue(순서 유지 발행) vs. 순서 무시 issue(발행)
- in-order issue(순서 유지 발행):
- - RAW dependency(RAW 의존성) 또는 structural hazard(구조적 해저드) 또는 가능성이 있는 WAR/WAW hazard(WAR/WAW 해저드)으로 인해 issue(발행)이 정지된다
- - 모든 이전 명령어가 functional unit(기능 단위)에 issue(발행)된 후에야 명령어가 execute(실행) 단위에 발행될 수 있다
- 순서 무시 issue(발행):
- - 명령어는 프로그램 순서대로 예약 스테이션(또는 다른 형태의 명령어 버퍼)으로 dispatch(디스패치)되어 operand(피연산자) 도착 또는 다른 hazard(해저드)이 해소될 때까지 대기한다
- - 이전 명령어가 issue(발행) 버퍼에서 대기 중일 때, 다음 명령어는 순서를 무시하고 dispatch(디스패치) 및 발행될 수 있다

p.5issue(발행) 제한: 순서 유지 및 순서 무시
- 지연
- 1
- FLD f2, 34(x2)
- 1
- 2
- FLD f4, 45(x3)
- long
- 3
- FMULT.D f6, f4, f2
- 3
- 4
- FSUB.D f8, f2, f2
- 1
- 5
- FDIV.D f4, f2, f8
- 4
- 6
- FADD.D f10, f6, f4
- 1
- 1
- 2
- 3
- 4
- 5
- 6
- 순서 유지 execute(실행):
- 1 (2,1) . . . . . . 2 3 4 4 3 5 . . . 5 6 6
- out-of-order execution(순서 무시 실행):
- 1 (2,1) 4 4 . . . . 2 3 . . 3 5 . . . 5 6 6
- out-of-order execution(순서 무시 실행)만으로는 의미 있는 개선을 이끌어내지 못했다!

p.6issue(발행) 제한: 순서 유지 및 순서 무시
- 지연
- 1
- FLD f2, 34(x2)
- 1
- 2
- FLD f4, 45(x3)
- long
- 3
- FMULT.D f6, f4, f2
- 3
- 4
- FSUB.D f8, f2, f2
- 1
- 5
- FDIV.D f4', f2, f8
- 4
- 6
- FADD.D f10, f6, f4'
- 1
- 어떤 반의존성도 이름 재할당으로 제거할 수 있다(이름 재할당 → 추가 저장소 필요)
- 하드웨어에서 가능할까? 네!
- X
- 순서 유지 execute(실행):
- 1 (2,1) . . . . . . 2 3 4 4 3 5 . . . 5 6 6
- out-of-order execution(순서 무시 실행):
- 1 (2,1) 4 4 . . . . 2 3 . . 3 5 . . . 5 6 6
- 순서 무시 + register renaming(레지스터 이름 재할당): 1 (2,1) 4 4 5 . . . 2 (3,5) 3 6 6
- 1
- 2
- 3
- 4
- 5
- 6

p.7동적 알고리즘: Tomasulo algorithm(토마술로 알고리즘)
- IBM 360/91에 적용 (CDC 6600 이후 약 3년 후, 1966년)
- 캐시 없음! → 긴 memory latency(메모리 지연)
- 목표: 특수 compilers(컴파일러) 없이 높은 부동소수점 성능 달성
- IBM 360과 CDC 6600의 명령어 세트 아키텍처(ISA) 차이
- IBM: 명령어당 레지스터 지정자 2개 vs. CDC 6600의 3개
- IBM: 부동소수점 레지스터 4개 vs. CDC 6600의 8개
- IBM: 메모리-레지스터 연산 존재
- 왜 1966년 컴퓨터를 공부할까? 이 기술의 후손들이 번성했다!
- Alpha 21264, Pentium 4, AMD Opteron, Power 5 등
- Robert Tomasulo (1934 – 2008)

p.8Tomasulo algorithm(토마술로 알고리즘)
- 제어 및 버퍼를 기능 단위(FU)와 함께 분산 배치
- FU 버퍼는 'reservation station(예약 스테이션)'(RS)이라 불리며, pending operand(대기 중인 피연산자) 보유
- 명령어 내 레지스터는 값 또는 reservation station(예약 스테이션)에 대한 포인터로 대체됨; register renaming(레지스터 이름 재할당)이라 함
- 이름 재할당은 WAR, WAW hazard(해저드)을 방지
- 레지스터보다 reservation station(예약 스테이션) 수가 더 많아 compilers(컴파일러)가 할 수 없는 최적화 가능
- 기능 단위(FU)의 결과는 레지스터가 아닌 공통 데이터 버스(CDB)를 통해 broadcast(브로드캐스트)됨
- operand availability(피연산자 가용성) 확인 후에만 명령어 execute(실행) → RAW hazard(해저드) 회피
- 로드 및 스토어도 reservation station(예약 스테이션)을 갖는 functional unit(기능 단위)로 취급
- 정수 명령어는 브랜치를 예측하여 통과할 수 있음 (예측: 취해짐), FP 연산은 기본 블록을 넘어서 FP operation queue(FP 연산 큐)에 배치 가능
- 모든 이전 branch prediction(브랜치 예측)이 올바르다고 확인된 이후에야 FP 연산이 execute(실행) 시작 가능
- 이 문제는 다음 강의에서 speculative execution(추측 실행)을 허용하는 확장 기법으로 해결 가능

p.9토마술로 아키텍처
- FP adder(FP 가산기): Add1, Add2, Add3
- FP multiplier(FP 승산기): Mult1, Mult2
- 메모리에서 입력
- FP 레지스터
- reservation station(예약 스테이션)
- 공통 데이터 버스(CDB)
- 메모리로 출력
- FP operation queue(FP 연산 큐)
- load buffer(로드 버퍼): Load1 ~ Load6
- store buffer(스토어 버퍼)
- * 참고: integer pipeline(정수 파이프라인)은 이 부분 외부에 있음

p.10토마술로 아키텍처
- FP adder(FP 가산기): Add1, Add2, Add3
- FP multiplier(FP 승산기): Mult1, Mult2
- 메모리에서 입력
- FP 레지스터
- reservation station(예약 스테이션)
- 공통 데이터 버스(CDB)
- 메모리로 출력
- FP operation queue(FP 연산 큐)
- load buffer(로드 버퍼): Load1 ~ Load6
- store buffer(스토어 버퍼)
- * 참고: integer pipeline(정수 파이프라인)은 이 부분 외부에 있음
- 발행(Issue)
- 디스패치(Dispatch)
- 실행(Execute)
- 결과 쓰기(Write result)

p.11Tomasulo algorithm(토마술로 알고리즘)의 세 단계
- 1. dispatch(디스패치): FP operation queue(FP 연산 큐)에서 명령어를 예약 스테이션(RS)으로 가져옴
- - reservation station(예약 스테이션) 비어 있음 (structural hazard(구조적 해저드) 없음) → 명령어 및 (가용한) operand(피연산자)를 예약 스테이션 항목에 전달 (레지스터 이름 재할당)
- 2. issue(발행) 및 execute(실행): operand(피연산자)로 작업 수행
- - 두 operand(피연산자)가 모두 가용하면 execute(실행); 가용하지 않으면 공통 데이터 버스(CDB)에서 결과 감시
- 3. write result(결과 쓰기): execute(실행) 완료
- - 결과를 공통 데이터 버스(CDB)에 쓰고, 결과를 기다리는 모든 단위에 broadcast(브로드캐스트); reservation station(예약 스테이션) 가용 상태로 표시
- • common data bus (CDB)(공통 데이터 버스): 데이터 + 소스 ('어디서 왔는지' 정보)
- • 일반 데이터 버스: 데이터 + 목적지 ('어디로 가는지' 정보)
- • 64비트 데이터 + 4비트 태그 (기능 단위 소스 주소 또는 reservation station(예약 스테이션) 번호)
- • 예상되는 functional unit(기능 단위)와 일치할 경우에만 쓰기 수행
- • broadcast(브로드캐스트) 수행

p.12reservation station(예약 스테이션) 구성 요소
- Op: functional unit(기능 단위)에서 수행할 연산 (예: ADD/SUB/…)
- Vj, Vk: source operand(소스 피연산자) 값
- - store buffer(스토어 버퍼)는 저장할 결과를 위한 V 필드 보유
- Qj, Qk: 소스 레지스터를 생성하는 예약 스테이션 (쓰여질 값)
- - 참고: Qj, Qk = 0 → 준비됨 (즉, Vj 또는 Vk가 유효함)
- - store buffer(스토어 버퍼)는 결과를 생성하는 reservation station(예약 스테이션)을 위한 Qi만 보유
- Busy: reservation station(예약 스테이션) 또는 functional unit(기능 단위)가 바쁘다는 표시
- register result status(레지스터 결과 상태): 각 레지스터를 쓸 functional unit(기능 단위)를 나타냄 (존재할 경우). 해당 레지스터를 쓸 보류 중인 명령어가 없으면 빈 상태

p.13토마술로 예제
- 명령어 상태:
- execute(실행)
- write result(결과 쓰기)
- 명령어
- j
- k
- issue(발행)
- 완료
- 결과
- FLD F6 34+R2
- FLD F2 45+R3
- FMUL.D F0 F2 F4
- FSUB.D F8 F6 F2
- FDIV.D F10 F0 F6
- FADD.D F6 F8 F2
- busy flag(사용 중 플래그)
- 주소
- Load1
- No
- Load2
- No
- Load3
- No
- reservation station(예약 스테이션):
- S1
- S2
- RS
- RS
- 시간
- 이름
- busy flag(사용 중 플래그)
- 연산
- Vj
- Vk
- Qj
- Qk
- Add1
- No
- Add2
- No
- Add3
- No
- Mult1
- No
- Mult2
- No
- register result status(레지스터 결과 상태):
- 클럭
- F0
- F2
- F4
- F6
- F8
- F10
- F12
- ...
- F30
- 0
- Qi
- 예제 명령어 스트림
- functional unit(기능 단위) 수 카운터
- (기능 단위 execute(실행)을 pipelining(파이프라인)을 통해 표현)
- 클럭 사이클 카운터
- 3개의 로드 버퍼 (스토어 버퍼도 존재하지만 이 예제에서는 표시되지 않음)
- operand(피연산자) 값 (가용한 경우)
- 소스 예약 스테이션 (발행 시 operand(피연산자)가 가용하지 않았을 경우)
- 각 레지스터를 functional unit(기능 단위)가 어떤 것에 의해 쓸 것인가
- 3개의 FP adder(FP 가산기) reservation station(예약 스테이션)
- 2개의 FP multiplier(FP 승산기) reservation station(예약 스테이션)
- 예상 속도: ADD/SUB 3 클럭; LD 3 클럭; MUL 10 클럭; DIV 40 클럭

p.14토마술로 예제 사이클 1
- 명령어 상태:
- execute(실행)
- write result(결과 쓰기)
- 명령어
- j
- k
- issue(발행)
- 완료
- 결과
- FLD F6 34+R2
- 1
- FLD F2 45+R3
- FMUL.D F0 F2 F4
- FSUB.D F8 F6 F2
- FDIV.D F10 F0 F6
- FADD.D F6 F8 F2
- busy flag(사용 중 플래그)
- 주소
- Load1
- Yes
- 34+R2
- Load2
- No
- Load3
- No
- reservation station(예약 스테이션):
- S1
- S2
- RS
- RS
- 시간
- 이름
- busy flag(사용 중 플래그)
- 연산
- Vj
- Vk
- Qj
- Qk
- Add1
- No
- Add2
- No
- Add3
- No
- Mult1
- No
- Mult2
- No
- register result status(레지스터 결과 상태):
- 클럭
- F0
- F2
- F4
- F6
- F8
- F10
- F12
- ...
- F30
- 1
- Qi
- Load1

p.15토마술로 예제 사이클 2
- 명령어 상태:
- execute(실행)
- write result(결과 쓰기)
- 명령어
- j
- k
- issue(발행)
- 완료
- 결과
- FLD F6 34+R2
- 1
- FLD F2 45+R3
- 2
- FMUL.D F0 F2 F4
- FSUB.D F8 F6 F2
- FDIV.D F10 F0 F6
- FADD.D F6 F8 F2
- busy flag(사용 중 플래그)
- 주소
- Load1
- Yes
- 34+R2
- Load2
- Yes
- 45+R3
- Load3
- No
- reservation station(예약 스테이션):
- S1
- S2
- RS
- RS
- 시간
- 이름
- busy flag(사용 중 플래그)
- 연산
- Vj
- Vk
- Qj
- Qk
- Add1
- No
- Add2
- No
- Add3
- No
- Mult1
- No
- Mult2
- No
- register result status(레지스터 결과 상태):
- 클럭
- F0
- F2
- F4
- F6
- F8
- F10
- F12
- ...
- F30
- 2
- Qi
- Load2
- Load1
- 참고: 복수의 로드가 동시에 진행될 수 있음

p.16토마술로 예제 사이클 3
- 명령어 상태:
- execute(실행)
- write result(결과 쓰기)
- 명령어
- j
- k
- issue(발행)
- 완료
- 결과
- FLD F6 34+R2
- 1
- 3
- FLD F2 45+R3
- 2
- FMUL.D F0 F2 F4
- 3
- FSUB.D F8 F6 F2
- FDIV.D F10 F0 F6
- FADD.D F6 F8 F2
- busy flag(사용 중 플래그)
- 주소
- Load1
- Yes
- 34+R2
- Load2
- Yes
- 45+R3
- Load3
- No
- reservation station(예약 스테이션):
- S1
- S2
- RS
- RS
- 시간
- 이름
- busy flag(사용 중 플래그)
- 연산
- Vj
- Vk
- Qj
- Qk
- Add1
- No
- Add2
- No
- Add3
- No
- Mult1
- Yes
- FMUL.D
- R(F4)
- Load2
- Mult2
- No
- register result status(레지스터 결과 상태):
- 클럭
- F0
- F2
- F4
- F6
- F8
- F10
- F12
- ...
- F30
- 3
- Qi
- Mult1
- Load2
- Load1
- 참고: reservation station(예약 스테이션)에서 레지스터 이름이 제거됨 (이름 재할당됨) (Mult1 참조)
- Load 1 완료됨; 무엇이 그것에 의존하고 있나?

p.17토마술로 예제 사이클 4
- 명령어 상태:
- execute(실행)
- write result(결과 쓰기)
- 명령어
- j
- k
- issue(발행)
- 완료
- 결과
- FLD F6 34+R2
- 1
- 3
- 4
- FLD F2 45+R3
- 2
- 4
- FMUL.D F0 F2 F4
- 3
- FSUB.D F8 F6 F2
- 4
- FDIV.D F10 F0 F6
- FADD.D F6 F8 F2
- busy flag(사용 중 플래그)
- 주소
- Load1
- No
- Load2
- Yes
- 45+R3
- Load3
- No
- reservation station(예약 스테이션):
- S1
- S2
- RS
- RS
- 시간
- 이름
- busy flag(사용 중 플래그)
- 연산
- Vj
- Vk
- Qj
- Qk
- Add1
- Yes
- FSUB.D
- M(A1)
- Load2
- Add2
- No
- Add3
- No
- Mult1
- Yes
- FMUL.D
- R(F4)
- Load2
- Mult2
- No
- register result status(레지스터 결과 상태):
- 클럭
- F0
- F2
- F4
- F6
- F8
- F10
- F12
- ...
- F30
- 4
- Qi
- Mult1
- Load2
- M(A1)
- Add1
- Load 2 완료됨; 무엇이 그것에 의존하고 있나?

p.18토마술로 예제 사이클 5
- 명령어 상태:
- execute(실행)
- write result(결과 쓰기)
- 명령어
- j
- k
- issue(발행)
- 완료
- 결과
- FLD F6 34+R2
- 1
- 3
- 4
- FLD F2 45+R3
- 2
- 4
- 5
- FMUL.D F0 F2 F4
- 3
- FSUB.D F8 F6 F2
- 4
- FDIV.D F10 F0 F6
- 5
- FADD.D F6 F8 F2
- Busy
- Address
- Load1
- No
- Load2
- No
- Load3
- No
- reservation station(예약 스테이션):
- S1
- S2
- RS
- RS
- 시간
- 이름
- busy flag(사용 중 플래그)
- 연산
- Vj
- Vk
- Qj
- Qk
- Add1
- Yes
- FSUB.D
- M(A1)
- M(A2)
- Add2
- No
- Add3
- No
- Mult1
- Yes
- FMUL.D
- M(A2)
- R(F4)
- Mult2
- Yes
- FDIV.D
- M(A1)
- Mult1
- register result status(레지스터 결과 상태):
- 클럭
- F0
- F2
- F4
- F6
- F8
- F10
- F12
- ...
- F30
- 5
- Qi
- Mult1
- M(A2)
- M(A1)
- Add1
- Mult2

p.19토마술로 예제 사이클 6
- 명령어 상태:
- execute(실행): 실행 중
- write result(결과 쓰기): 완료됨
- 명령어:
- FLD F6 34+(R2) 1 3 4
- FLD F2 45+(R3) 2 4 5
- FMUL.D F0 F2 F4 3
- FSUB.D F8 F6 F2 4
- FDIV.D F10 F0 F6 5
- FADD.D F6 F8 F2 6
- load buffer(로드 버퍼):
- Load1: 비활성, 주소: 없음
- Load2: 비활성, 주소: 없음
- Load3: 비활성, 주소: 없음
- reservation station(예약 스테이션):
- S1: Add1, busy flag(사용 중 플래그): Yes, 연산: FSUB.D, Vj: M(A1), Vk: M(A2), Qj: -, Qk: -
- S2: Add2, busy flag(사용 중 플래그): Yes, 연산: FADD.D, Vj: M(A2), Vk: -, Qj: -, Qk: Add1
- S3: Add3, busy flag(사용 중 플래그): No, 연산: -, Vj: -, Vk: -, Qj: -, Qk: -
- S4: Mult1, busy flag(사용 중 플래그): Yes, 연산: FMUL.D, Vj: M(A2), Vk: R(F4), Qj: -, Qk: -
- S5: Mult2, busy flag(사용 중 플래그): Yes, 연산: FDIV.D, Vj: M(A1), Vk: -, Qj: -, Qk: Mult1
- register result status(레지스터 결과 상태):
- clock(클럭): 6
- F0: Qi = Mult1
- F2: Qi = M(A2)
- F4: Qi = Add2
- F6: Qi = Add1
- F8: Qi = Mult2
- F10: Qi = -
- F12: Qi = -
- ...
- F30: Qi = -
- FADD.D 명령어를 issue(발행)할 수 있나요? (WAR 의존성 존재)

p.20토마술로 예제 사이클 7
- 명령어 상태:
- execute(실행): 실행 중
- write result(결과 쓰기): 완료됨
- 명령어:
- FLD F6 34+(R2) 1 3 4
- FLD F2 45+(R3) 2 4 5
- FMUL.D F0 F2 F4 3
- FSUB.D F8 F6 F2 4
- FDIV.D F10 F0 F6 5
- FADD.D F6 F8 F2 6
- load buffer(로드 버퍼):
- Load1: 비활성, 주소: 없음
- Load2: 비활성, 주소: 없음
- Load3: 비활성, 주소: 없음
- reservation station(예약 스테이션):
- S1: Add1, busy flag(사용 중 플래그): Yes, 연산: FSUB.D, Vj: M(A1), Vk: M(A2), Qj: -, Qk: -
- S2: Add2, busy flag(사용 중 플래그): Yes, 연산: FADD.D, Vj: M(A2), Vk: -, Qj: -, Qk: Add1
- S3: Add3, busy flag(사용 중 플래그): No, 연산: -, Vj: -, Vk: -, Qj: -, Qk: -
- S4: Mult1, busy flag(사용 중 플래그): Yes, 연산: FMUL.D, Vj: M(A2), Vk: R(F4), Qj: -, Qk: -
- S5: Mult2, busy flag(사용 중 플래그): Yes, 연산: FDIV.D, Vj: M(A1), Vk: -, Qj: -, Qk: Mult1
- register result status(레지스터 결과 상태):
- clock(클럭): 7
- F0: Qi = Mult1
- F2: Qi = M(A2)
- F4: Qi = Add2
- F6: Qi = Add1
- F8: Qi = Mult2
- F10: Qi = -
- F12: Qi = -
- ...
- F30: Qi = -

p.21토마술로 예제 사이클 8
- 명령어 상태:
- execute(실행): 실행 중
- write result(결과 쓰기): 완료됨
- 명령어:
- FLD F6 34+(R2) 1 3 4
- FLD F2 45+(R3) 2 4 5
- FMUL.D F0 F2 F4 3
- FSUB.D F8 F6 F2 4
- FDIV.D F10 F0 F6 5
- FADD.D F6 F8 F2 6
- load buffer(로드 버퍼):
- Load1: 비활성, 주소: 없음
- Load2: 비활성, 주소: 없음
- Load3: 비활성, 주소: 없음
- reservation station(예약 스테이션):
- S1: Add1, busy flag(사용 중 플래그): Yes, 연산: FSUB.D, Vj: M(A1), Vk: M(A2), Qj: -, Qk: -
- S2: Add2, busy flag(사용 중 플래그): Yes, 연산: FADD.D, Vj: M(A2), Vk: -, Qj: -, Qk: Add1
- S3: Add3, busy flag(사용 중 플래그): No, 연산: -, Vj: -, Vk: -, Qj: -, Qk: -
- S4: Mult1, busy flag(사용 중 플래그): Yes, 연산: FMUL.D, Vj: M(A2), Vk: R(F4), Qj: -, Qk: -
- S5: Mult2, busy flag(사용 중 플래그): Yes, 연산: FDIV.D, Vj: M(A1), Vk: -, Qj: -, Qk: Mult1
- register result status(레지스터 결과 상태):
- clock(클럭): 8
- F0: Qi = Mult1
- F2: Qi = M(A2)
- F4: Qi = Add2
- F6: Qi = Add1
- F8: Qi = Mult2
- F10: Qi = -
- F12: Qi = -
- ...
- F30: Qi = -
- Add1 (FSUB.D) 완료됨. 무엇이 이 결과를 기다리고 있나요?

p.22토마술로 예제 사이클 9
- 명령어 상태:
- execute(실행): 실행 중
- write result(결과 쓰기): 완료됨
- 명령어:
- FLD F6 34+(R2) 1 3 4
- FLD F2 45+(R3) 2 4 5
- FMUL.D F0 F2 F4 3
- FSUB.D F8 F6 F2 4
- FDIV.D F10 F0 F6 5
- FADD.D F6 F8 F2 6
- load buffer(로드 버퍼):
- Load1: 비활성, 주소: 없음
- Load2: 비활성, 주소: 없음
- Load3: 비활성, 주소: 없음
- reservation station(예약 스테이션):
- S1: Add1, busy flag(사용 중 플래그): No, 연산: -, Vj: -, Vk: -, Qj: -, Qk: -
- S2: Add2, busy flag(사용 중 플래그): Yes, 연산: FADD.D, Vj: (M-M), Vk: M(A2), Qj: -, Qk: Add1
- S3: Add3, busy flag(사용 중 플래그): No, 연산: -, Vj: -, Vk: -, Qj: -, Qk: -
- S4: Mult1, busy flag(사용 중 플래그): Yes, 연산: FMUL.D, Vj: M(A2), Vk: R(F4), Qj: -, Qk: -
- S5: Mult2, busy flag(사용 중 플래그): Yes, 연산: FDIV.D, Vj: M(A1), Vk: -, Qj: -, Qk: Mult1
- register result status(레지스터 결과 상태):
- clock(클럭): 9
- F0: Qi = Mult1
- F2: Qi = M(A2)
- F4: Qi = Add2
- F6: Qi = (M-M)
- F8: Qi = Mult2
- F10: Qi = -
- F12: Qi = -
- ...
- F30: Qi = -

p.23토마술로 예제 사이클 10
- 명령어 상태:
- execute(실행): 실행 중
- write result(결과 쓰기): 완료됨
- 명령어:
- FLD F6 34+(R2) 1 3 4
- FLD F2 45+(R3) 2 4 5
- FMUL.D F0 F2 F4 3
- FSUB.D F8 F6 F2 4
- FDIV.D F10 F0 F6 5
- FADD.D F6 F8 F2 6
- load buffer(로드 버퍼):
- Load1: 비활성, 주소: 없음
- Load2: 비활성, 주소: 없음
- Load3: 비활성, 주소: 없음
- reservation station(예약 스테이션):
- S1: Add1, busy flag(사용 중 플래그): No, 연산: -, Vj: -, Vk: -, Qj: -, Qk: -
- S2: Add2, busy flag(사용 중 플래그): Yes, 연산: FADD.D, Vj: (M-M), Vk: M(A2), Qj: -, Qk: Add1
- S3: Add3, busy flag(사용 중 플래그): No, 연산: -, Vj: -, Vk: -, Qj: -, Qk: -
- S4: Mult1, busy flag(사용 중 플래그): Yes, 연산: FMUL.D, Vj: M(A2), Vk: R(F4), Qj: -, Qk: -
- S5: Mult2, busy flag(사용 중 플래그): Yes, 연산: FDIV.D, Vj: M(A1), Vk: -, Qj: -, Qk: Mult1
- register result status(레지스터 결과 상태):
- clock(클럭): 10
- F0: Qi = Mult1
- F2: Qi = M(A2)
- F4: Qi = Add2
- F6: Qi = (M-M)
- F8: Qi = Mult2
- F10: Qi = -
- F12: Qi = -
- ...
- F30: Qi = -

p.24토마술로 예제 사이클 11
- 명령어 상태:
- execute(실행): 실행 중
- write result(결과 쓰기): 완료됨
- 명령어:
- FLD F6 34+(R2) 1 3 4
- FLD F2 45+(R3) 2 4 5
- FMUL.D F0 F2 F4 3
- FSUB.D F8 F6 F2 4
- FDIV.D F10 F0 F6 5
- FADD.D F6 F8 F2 6
- load buffer(로드 버퍼):
- Load1: 비활성, 주소: 없음
- Load2: 비활성, 주소: 없음
- Load3: 비활성, 주소: 없음
- reservation station(예약 스테이션):
- S1: Add1, busy flag(사용 중 플래그): No, 연산: -, Vj: -, Vk: -, Qj: -, Qk: -
- S2: Add2, busy flag(사용 중 플래그): Yes, 연산: FADD.D, Vj: (M-M), Vk: M(A2), Qj: -, Qk: Add1
- S3: Add3, busy flag(사용 중 플래그): No, 연산: -, Vj: -, Vk: -, Qj: -, Qk: -
- S4: Mult1, busy flag(사용 중 플래그): Yes, 연산: FMUL.D, Vj: M(A2), Vk: R(F4), Qj: -, Qk: -
- S5: Mult2, busy flag(사용 중 플래그): Yes, 연산: FDIV.D, Vj: M(A1), Vk: -, Qj: -, Qk: Mult1
- register result status(레지스터 결과 상태):
- clock(클럭): 11
- F0: Qi = Mult1
- F2: Qi = M(A2)
- F4: Qi = Add2
- F6: Qi = (M-M)
- F8: Qi = Mult2
- F10: Qi = -
- F12: Qi = -
- ...
- F30: Qi = -
- Add2 (FADD.D) 완료됨. 무엇이 이 결과를 기다리고 있나요?

p.25토마술로 예제: 사이클 12
- Instruction status:
- - Execution: 12
- - Write: 12
- - Instruction: FLD F6 34+R2 (j=1, k=3, Issue=4, Completed=12, Results=12)
- - Instruction: FLD F2 45+R3 (j=2, k=4, Issue=5, Completed=12, Results=12)
- - Instruction: FMUL.D F0 F2 F4 (j=3, Issue=3, Completed=12, Results=12)
- - Instruction: FSUB.D F8 F6 F2 (j=4, Issue=4, Completed=12, Results=12)
- - Instruction: FDIV.D F10 F0 F6 (j=5, Issue=5, Completed=12, Results=12)
- - Instruction: FADD.D F6 F8 F2 (j=6, Issue=6, Completed=12, Results=12)
- Busy:
- - Load1: No
- - Load2: No
- - Load3: No
- Reservation Stations:
- - S1: Add1 (No, Add, -, -, -, -)
- - S2: Add2 (No, Add, -, -, -, -)
- - RS: Add3 (No, Add, -, -, -, -)
- - Mult1: (Yes, FMUL.D, M(A2), R(F4), Mult1, -)
- - Mult2: (Yes, FDIV.D, M(A1), Mult1, -, -)
- Register result status:
- - Clock 12:
- - F0: Qi = Mult1
- - F2: Qi = M(A2)
- - F4: Qi = (M-M+M)
- - F6: Qi = (M-M)
- - F8: Qi = (M-M)
- - F10: Qi = Mult2
- - F12: Qi = -
- - ...
- - F30: Qi = -
- All quick instructions complete in this cycle!

p.26토마술로 예제: 사이클 13
- Instruction status:
- - Execution: 13
- - Write: 13
- - Instruction: FLD F6 34+R2 (j=1, k=3, Issue=4, Completed=13, Results=13)
- - Instruction: FLD F2 45+R3 (j=2, k=4, Issue=5, Completed=13, Results=13)
- - Instruction: FMUL.D F0 F2 F4 (j=3, Issue=3, Completed=13, Results=13)
- - Instruction: FSUB.D F8 F6 F2 (j=4, Issue=4, Completed=13, Results=13)
- - Instruction: FDIV.D F10 F0 F6 (j=5, Issue=5, Completed=13, Results=13)
- - Instruction: FADD.D F6 F8 F2 (j=6, Issue=6, Completed=13, Results=13)
- Busy:
- - Load1: No
- - Load2: No
- - Load3: No
- Reservation Stations:
- - S1: Add1 (No, Add, -, -, -, -)
- - S2: Add2 (No, Add, -, -, -, -)
- - RS: Add3 (No, Add, -, -, -, -)
- - Mult1: (Yes, FMUL.D, M(A2), R(F4), Mult1, -)
- - Mult2: (Yes, FDIV.D, M(A1), Mult1, -, -)
- Register result status:
- - Clock 13:
- - F0: Qi = Mult1
- - F2: Qi = M(A2)
- - F4: Qi = (M-M+M)
- - F6: Qi = (M-M)
- - F8: Qi = (M-M)
- - F10: Qi = Mult2
- - F12: Qi = -
- - ...
- - F30: Qi = -

p.27토마술로 예제: 사이클 14
- Instruction status:
- - Execution: 14
- - Write: 14
- - Instruction: FLD F6 34+R2 (j=1, k=3, Issue=4, Completed=14, Results=14)
- - Instruction: FLD F2 45+R3 (j=2, k=4, Issue=5, Completed=14, Results=14)
- - Instruction: FMUL.D F0 F2 F4 (j=3, Issue=3, Completed=14, Results=14)
- - Instruction: FSUB.D F8 F6 F2 (j=4, Issue=4, Completed=14, Results=14)
- - Instruction: FDIV.D F10 F0 F6 (j=5, Issue=5, Completed=14, Results=14)
- - Instruction: FADD.D F6 F8 F2 (j=6, Issue=6, Completed=14, Results=14)
- Busy:
- - Load1: No
- - Load2: No
- - Load3: No
- Reservation Stations:
- - S1: Add1 (No, Add, -, -, -, -)
- - S2: Add2 (No, Add, -, -, -, -)
- - RS: Add3 (No, Add, -, -, -, -)
- - Mult1: (Yes, FMUL.D, M(A2), R(F4), Mult1, -)
- - Mult2: (Yes, FDIV.D, M(A1), Mult1, -, -)
- Register result status:
- - Clock 14:
- - F0: Qi = Mult1
- - F2: Qi = M(A2)
- - F4: Qi = (M-M+M)
- - F6: Qi = (M-M)
- - F8: Qi = (M-M)
- - F10: Qi = Mult2
- - F12: Qi = -
- - ...
- - F30: Qi = -

p.28토마술로 예제: 사이클 15
- Instruction status:
- - Execution: 15
- - Write: 15
- - Instruction: FLD F6 34+R2 (j=1, k=3, Issue=4, Completed=15, Results=15)
- - Instruction: FLD F2 45+R3 (j=2, k=4, Issue=5, Completed=15, Results=15)
- - Instruction: FMUL.D F0 F2 F4 (j=3, Issue=3, Completed=15, Results=15)
- - Instruction: FSUB.D F8 F6 F2 (j=4, Issue=4, Completed=15, Results=15)
- - Instruction: FDIV.D F10 F0 F6 (j=5, Issue=5, Completed=15, Results=15)
- - Instruction: FADD.D F6 F8 F2 (j=6, Issue=6, Completed=15, Results=15)
- Busy:
- - Load1: No
- - Load2: No
- - Load3: No
- Reservation Stations:
- - S1: Add1 (No, Add, -, -, -, -)
- - S2: Add2 (No, Add, -, -, -, -)
- - RS: Add3 (No, Add, -, -, -, -)
- - Mult1: (Yes, FMUL.D, M(A2), R(F4), Mult1, -)
- - Mult2: (Yes, FDIV.D, M(A1), Mult1, -, -)
- Register result status:
- - Clock 15:
- - F0: Qi = Mult1
- - F2: Qi = M(A2)
- - F4: Qi = (M-M+M)
- - F6: Qi = (M-M)
- - F8: Qi = (M-M)
- - F10: Qi = Mult2
- - F12: Qi = -
- - ...
- - F30: Qi = -
- Mult1 (FMUL.D) completing; what is waiting for it?

p.29토마술로 예제: 사이클 16
- Instruction status:
- - Execution: 16
- - Write: 16
- - Instruction: FLD F6 34+R2 (j=1, k=3, Issue=4, Completed=16, Results=16)
- - Instruction: FLD F2 45+R3 (j=2, k=4, Issue=5, Completed=16, Results=16)
- - Instruction: FMUL.D F0 F2 F4 (j=3, Issue=3, Completed=16, Results=16)
- - Instruction: FSUB.D F8 F6 F2 (j=4, Issue=4, Completed=16, Results=16)
- - Instruction: FDIV.D F10 F0 F6 (j=5, Issue=5, Completed=16, Results=16)
- - Instruction: FADD.D F6 F8 F2 (j=6, Issue=6, Completed=16, Results=16)
- Busy:
- - Load1: No
- - Load2: No
- - Load3: No
- Reservation Stations:
- - S1: Add1 (No, Add, -, -, -, -)
- - S2: Add2 (No, Add, -, -, -, -)
- - RS: Add3 (No, Add, -, -, -, -)
- - Mult1: (No, -, -, -, -, -)
- - Mult2: (Yes, FDIV.D, M*F4, M(A1), -, -)
- Register result status:
- - Clock 16:
- - F0: Qi = M*F4
- - F2: Qi = M(A2)
- - F4: Qi = (M-M+M)
- - F6: Qi = (M-M)
- - F8: Qi = (M-M)
- - F10: Qi = Mult2
- - F12: Qi = -
- - ...
- - F30: Qi = -
- Just waiting for Mult2 (FDIV.D) to complete

p.30토마술로 예제: 사이클 17
- Instruction status:
- - Execution: 17
- - Write: 17
- - Instruction: FLD F6 34+R2 (j=1, k=3, Issue=4, Completed=17, Results=17)
- - Instruction: FLD F2 45+R3 (j=2, k=4, Issue=5, Completed=17, Results=17)
- - Instruction: FMUL.D F0 F2 F4 (j=3, Issue=3, Completed=17, Results=17)
- - Instruction: FSUB.D F8 F6 F2 (j=4, Issue=4, Completed=17, Results=17)
- - Instruction: FDIV.D F10 F0 F6 (j=5, Issue=5, Completed=17, Results=17)
- - Instruction: FADD.D F6 F8 F2 (j=6, Issue=6, Completed=17, Results=17)
- Busy:
- - Load1: No
- - Load2: No
- - Load3: No
- Reservation Stations:
- - S1: Add1 (No, Add, -, -, -, -)
- - S2: Add2 (No, Add, -, -, -, -)
- - RS: Add3 (No, Add, -, -, -, -)
- - Mult1: (No, -, -, -, -, -)
- - Mult2: (Yes, FDIV.D, M*F4, M(A1), -, -)
- Register result status:
- - Clock 16:
- - F0: Qi = M*F4
- - F2: Qi = M(A2)
- - F4: Qi = (M-M+M)
- - F6: Qi = (M-M)
- - F8: Qi = (M-M)
- - F10: Qi = Mult2
- - F12: Qi = -
- - ...
- - F30: Qi = -

p.31몇 개의 클럭 사이클 후...

p.32토마술로 예제: 사이클 55
- 명령어 상태:
- • execute(실행) 중: FLD F6, 34+R2, FLD F2, 45+R3, FMUL.D F0, F2, F4, FSUB.D F8, F6, F2, FDIV.D F10, F0, F6, FADD.D F6, F8, F2
- • 완료됨: FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10
- • 결과: FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10, FADD.D F6
- • issue(발행): FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10, FADD.D F6
- • load buffer(로드 버퍼):
- • Load1: 비활성, 주소 없음
- • Load2: 비활성, 주소 없음
- • Load3: 비활성, 주소 없음
- • reservation station(예약 스테이션):
- • S1: 비활성, 연산 없음
- • S2: 비활성, 연산 없음
- • RS: 비활성, 연산 없음
- • Add1: 비활성
- • Add2: 비활성
- • Add3: 비활성
- • Mult1: 비활성
- • Mult2: 활성, FDIV.D, M*F4, M(A1)
- • register result status(레지스터 결과 상태):
- • F0: tag(태그) M*F4
- • F2: tag(태그) M(A2)
- • F4: 태그 (M-M+M)
- • F6: 태그 (M-M)
- • F8: tag(태그) 없음
- • F10: tag(태그) 없음
- • F12: tag(태그) 없음
- • ...
- • F30: tag(태그) 없음
- • 현재 클럭: 55
- • Mult2 (FDIV.D) execute(실행) 중

p.33토마술로 예제: 사이클 56
- 명령어 상태:
- • execute(실행) 중: FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10, FADD.D F6
- • 완료됨: FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10
- • 결과: FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10, FADD.D F6
- • issue(발행): FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10, FADD.D F6
- • load buffer(로드 버퍼):
- • Load1: 비활성, 주소 없음
- • Load2: 비활성, 주소 없음
- • Load3: 비활성, 주소 없음
- • reservation station(예약 스테이션):
- • S1: 비활성, 연산 없음
- • S2: 비활성, 연산 없음
- • RS: 비활성, 연산 없음
- • Add1: 비활성
- • Add2: 비활성
- • Add3: 비활성
- • Mult1: 비활성
- • Mult2: 활성, FDIV.D, M*F4, M(A1)
- • register result status(레지스터 결과 상태):
- • F0: tag(태그) M*F4
- • F2: tag(태그) M(A2)
- • F4: 태그 (M-M+M)
- • F6: 태그 (M-M)
- • F8: tag(태그) 없음
- • F10: tag(태그) 없음
- • F12: tag(태그) 없음
- • ...
- • F30: tag(태그) 없음
- • 현재 클럭: 56
- • Mult2 (FDIV.D) 완료됨. 이 결과를 기다리는 것은 무엇인가?

p.34토마술로 예제: 사이클 57
- 명령어 상태:
- • execute(실행) 중: FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10, FADD.D F6
- • 완료됨: FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10
- • 결과: FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10, FADD.D F6
- • issue(발행): FLD F6, FLD F2, FMUL.D F0, FSUB.D F8, FDIV.D F10, FADD.D F6
- • load buffer(로드 버퍼):
- • Load1: 비활성, 주소 없음
- • Load2: 비활성, 주소 없음
- • Load3: 비활성, 주소 없음
- • reservation station(예약 스테이션):
- • S1: 비활성, 연산 없음
- • S2: 비활성, 연산 없음
- • RS: 비활성, 연산 없음
- • Add1: 비활성
- • Add2: 비활성
- • Add3: 비활성
- • Mult1: 비활성
- • Mult2: 비활성
- • register result status(레지스터 결과 상태):
- • F0: tag(태그) M*F4
- • F2: tag(태그) M(A2)
- • F4: 태그 (M-M+M)
- • F6: 태그 (M-M)
- • F8: tag(태그) 없음
- • F10: tag(태그) 없음
- • F12: tag(태그) 없음
- • ...
- • F30: tag(태그) 없음
- • 현재 클럭: 57
- • F0/F6 결과가 가용함
- • 순서 유지 발행 (in-order issue)
- • 순서 무시 execute(실행) 및 완료 (out-of-order execution & completion)

p.35동적 loop unrolling(루프 전개) 예제
- • 두 반복에서 명령어가 issue(발행)된 후 프로세서 상태:
- • Loop: FLD F0, 0(X1)
- • FMUL.D F4, F0, F2
- • FSD F4, 0(X1)
- • ADDI X1, X1, 8
- • BNE X1, X2, Loop
- • reservation station(예약 스테이션):
- • Add1: 비활성
- • Add2: 비활성
- • Add3: 비활성
- • Mult1: 활성, FMUL.D, R(F2), (source operand(소스 피연산자) 값 없음), (source operand(소스 피연산자) 생성 reservation station(예약 스테이션) 없음)
- • Mult2: 활성, FMUL.D, R(F2), (source operand(소스 피연산자) 값 없음), (source operand(소스 피연산자) 생성 reservation station(예약 스테이션) 없음)
- • load buffer(로드 버퍼):
- • Load1: 활성, 주소 R(X1)+0
- • Load2: 활성, 주소 R(X1)-8
- • Load3: 비활성
- • store buffer(스토어 버퍼):
- • Store1: 활성, 주소 R(X1)+0
- • Store2: 활성, 주소 R(X1)-8
- • Store3: 비활성
- • 여러 루프 반복의 FP 명령어는 Tomasulo algorithm(토마술로 알고리즘)으로 issue(발행) 가능 (브랜치는 taken(취함)으로 예측됨)
- • 모든 이전 브랜치가 해결될 때까지 FP 명령어는 execute(실행)을 시작하지 않음
- • 그렇지 않으면 어떤 일이 발생할까?
- • 이 시점에서 MULT 단위 중 어느 것이 execute(실행)을 시작했는가?
- • 이 예제의 정수 명령어는 FP 명령어와 의존성이 없음

p.36Tomasulo algorithm(토마술로 알고리즘)이 왜 루프 반복을 겹칠 수 있는가?
- • 레지스터 이름 재할당 (register renaming)
- • reservation station(예약 스테이션)은 아키텍처 레지스터보다 더 많은 물리적 레지스터를 효과적으로 제공함
- • 여러 루프 반복은 레지스터에 서로 다른 물리적 목적지를 사용함 (동적 루프 전개)
- • reservation station(예약 스테이션)
- • 명령어 issue(발행)을 정수 control-flow operation(제어 흐름 연산) 뒤로 진행할 수 있게 함
- • 또한 레지스터의 오래된 값을 버퍼링함 – 완전히 WAR stall(WAR 스톨)을 방지함
- • 다른 관점: Tomasulo algorithm(토마술로 알고리즘)이 실시간으로 데이터 흐름 의존성 그래프를 구축함

p.37Tomasulo algorithm(토마술로 알고리즘)의 주요 장점
- hazard detection(해저드 탐지) 논리의 분산
- reservation station(예약 스테이션)과 공통 데이터 버스(CDB)의 분산
- 단일 결과를 기다리는 여러 명령어가 각각 다른 operand(피연산자)를 가지고 있다면, CDB를 통한 broadcast(브로드캐스트)로 동시에 해제될 수 있음
- 중앙 집중식 레지스터 파일을 사용할 경우, 결과는 레지스터 버스가 가용할 때마다 각 단위가 읽어야 함

p.38Tomasulo algorithm(토마술로 알고리즘)의 단점
- 복잡성
- 360/91, MIPS 10000, Alpha 21264의 지연
- 고속에서 많은 연관 저장소(CDB) 필요
- 공통 데이터 버스(CDB)로 인한 성능 제한
- 각 CDB는 여러 functional unit(기능 단위)로 연결되어야 하므로, 높은 정전용량과 고밀도 배선 발생
- 한 사이클에 완료할 수 있는 functional unit(기능 단위) 수는 1개로 제한됨!
- 다중 CDB 사용 시, 병렬 연관 저장소를 위한 더 많은 FU 논리 필요
- non-precise interrupt(부정확한 인터럽트)! (왜인지 나중에 다룸)

p.39순서 무시 처리가 배경으로 물러남
- 순서 무시 처리는 1960년대에 상용화되었으나, 다시 사라졌음
- 1990년대까지 두 가지 주요 문제를 해결해야 했기 때문
- 정확한 트랩(precise traps)
- imprecise trap(부정확한 트랩)은 디버깅과 OS 코드를 복잡하게 만듦
- 참고: 정확한 인터럽트는 비교적 쉽게 제공 가능 (왜냐하면?)
- branch prediction(브랜치 예측)
- 사용 가능한 명령어 수준 병렬성(ILP)은 control hazard(제어 해저드)으로 제한됨
- 새로운 기술에서 간단한 머신 설계가 오래된 기술에서 복잡한 머신보다 우세함
- 프로세서와 캐시를 하나의 칩에 넣는 큰 장점
- 마이크로프로세서는 주당 1% 성능 향상 시대를 경험함
- (복잡한 프로세서의 시장 진입 시간이 더 길기 때문에)

p.401990년대 이후의 광범위한 채택
- 프로세서 성능은 메모리 성능보다 훨씬 빠르게 향상됨
- (즉, 메모리는 상대적으로 훨씬 느려짐)
- out-of-order execution(순서 무시 실행)은 cache misses(캐시 미스) 완료를 기다리는 동안에도 execute(실행)을 계속할 수 있게 함
- compilers(컴파일러)의 코드 생성은 다양한 마이크로아키텍처에 동시에 최적화할 수 없음
- out-of-order execution(순서 무시 실행)은 compilers(컴파일러) 최적화에 대한 의존도를 줄임
- 프로세서가 더 적극적으로 변화함 – 더 넓은 issue(발행) 폭, 더 깊은 pipelining(파이프라인)
- out-of-order execution(순서 무시 실행)은 더 많은 명령어 수준 병렬성(ILP)을 활용할 수 있음

p.41요약
- reservation station(예약 스테이션): 더 큰 레지스터 집합으로의 이름 재할당 + source operand(소스 피연산자) 버퍼링
- 레지스터를 버퍼로 사용하여 레지스터가 병목 현상이 되는 것을 방지
- WAR, WAW hazard(해저드) 회피
- 하드웨어에서 loop unrolling(루프 전개) 가능
- 기본 블록에 국한되지 않음
- (정수 단위는 브랜치를 넘어 앞서 나갈 수 있음)
- cache misses(캐시 미스) 해결에도 도움
- 지속적인 기여
- dynamic scheduling(동적 스케줄링)
- register renaming(레지스터 이름 재할당)
- load/store disambiguation(로드/스토어 모호성 해소)
- 360/91의 후손은 Intel Pentium 4, IBM Power 5, AMD Athlon/Opteron 등

p.42질문?
- 추천 독서:
- Chapter 3.4 – 3.5