Lec6 - Tomasulo Algorithm

한국어판 강의자료 · 42쪽
1쪽
p.1CSED503 고급 컴퓨터 구조 – 강의 6
2쪽
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 의존성)에 의해 제한된다
3쪽
p.3순서 유지 완료 vs. 순서 무시 완료
  • functional unit(기능 단위)의 다양한 지연과 가능한 값의 빠른 바이패스를 원하는 이유로, 가장 단순한 기계를 제외한 모든 기계는 순서 무시 완료를 가진다
  • 클래식 RISC 5단계 integer pipeline(정수 파이프라인)은 거의 순서 유지 완료만을 가진다
  • 로드가 두 사이클이 걸릴 경우, 다음의 한 사이클 integer operation(정수 연산)은 같은 시점에 완료되며, 더 빨리 완료되지 않는다
  • pipelined FPU(파이프라인화된 FPU)를 추가하면 즉시 순서 무시 완료가 가능해진다
4쪽
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(디스패치) 및 발행될 수 있다
5쪽
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(순서 무시 실행)만으로는 의미 있는 개선을 이끌어내지 못했다!
6쪽
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
7쪽
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)
8쪽
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(추측 실행)을 허용하는 확장 기법으로 해결 가능
9쪽
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(정수 파이프라인)은 이 부분 외부에 있음
10쪽
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)
11쪽
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(브로드캐스트) 수행
12쪽
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(기능 단위)를 나타냄 (존재할 경우). 해당 레지스터를 쓸 보류 중인 명령어가 없으면 빈 상태
13쪽
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 클럭
14쪽
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
15쪽
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
  • 참고: 복수의 로드가 동시에 진행될 수 있음
16쪽
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 완료됨; 무엇이 그것에 의존하고 있나?
17쪽
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 완료됨; 무엇이 그것에 의존하고 있나?
18쪽
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
19쪽
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 의존성 존재)
20쪽
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 = -
21쪽
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) 완료됨. 무엇이 이 결과를 기다리고 있나요?
22쪽
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 = -
23쪽
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 = -
24쪽
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) 완료됨. 무엇이 이 결과를 기다리고 있나요?
25쪽
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!
26쪽
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 = -
27쪽
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 = -
28쪽
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?
29쪽
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
30쪽
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 = -
31쪽
p.31몇 개의 클럭 사이클 후...
32쪽
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(실행) 중
33쪽
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) 완료됨. 이 결과를 기다리는 것은 무엇인가?
34쪽
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)
35쪽
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 명령어와 의존성이 없음
36쪽
p.36Tomasulo algorithm(토마술로 알고리즘)이 왜 루프 반복을 겹칠 수 있는가?
  • • 레지스터 이름 재할당 (register renaming)
  • • reservation station(예약 스테이션)은 아키텍처 레지스터보다 더 많은 물리적 레지스터를 효과적으로 제공함
  • • 여러 루프 반복은 레지스터에 서로 다른 물리적 목적지를 사용함 (동적 루프 전개)
  • • reservation station(예약 스테이션)
  • • 명령어 issue(발행)을 정수 control-flow operation(제어 흐름 연산) 뒤로 진행할 수 있게 함
  • • 또한 레지스터의 오래된 값을 버퍼링함 – 완전히 WAR stall(WAR 스톨)을 방지함
  • • 다른 관점: Tomasulo algorithm(토마술로 알고리즘)이 실시간으로 데이터 흐름 의존성 그래프를 구축함
37쪽
p.37Tomasulo algorithm(토마술로 알고리즘)의 주요 장점
  • hazard detection(해저드 탐지) 논리의 분산
  • reservation station(예약 스테이션)과 공통 데이터 버스(CDB)의 분산
  • 단일 결과를 기다리는 여러 명령어가 각각 다른 operand(피연산자)를 가지고 있다면, CDB를 통한 broadcast(브로드캐스트)로 동시에 해제될 수 있음
  • 중앙 집중식 레지스터 파일을 사용할 경우, 결과는 레지스터 버스가 가용할 때마다 각 단위가 읽어야 함
38쪽
p.38Tomasulo algorithm(토마술로 알고리즘)의 단점
  • 복잡성
  • 360/91, MIPS 10000, Alpha 21264의 지연
  • 고속에서 많은 연관 저장소(CDB) 필요
  • 공통 데이터 버스(CDB)로 인한 성능 제한
  • 각 CDB는 여러 functional unit(기능 단위)로 연결되어야 하므로, 높은 정전용량과 고밀도 배선 발생
  • 한 사이클에 완료할 수 있는 functional unit(기능 단위) 수는 1개로 제한됨!
  • 다중 CDB 사용 시, 병렬 연관 저장소를 위한 더 많은 FU 논리 필요
  • non-precise interrupt(부정확한 인터럽트)! (왜인지 나중에 다룸)
39쪽
p.39순서 무시 처리가 배경으로 물러남
  • 순서 무시 처리는 1960년대에 상용화되었으나, 다시 사라졌음
  • 1990년대까지 두 가지 주요 문제를 해결해야 했기 때문
  • 정확한 트랩(precise traps)
  • imprecise trap(부정확한 트랩)은 디버깅과 OS 코드를 복잡하게 만듦
  • 참고: 정확한 인터럽트는 비교적 쉽게 제공 가능 (왜냐하면?)
  • branch prediction(브랜치 예측)
  • 사용 가능한 명령어 수준 병렬성(ILP)은 control hazard(제어 해저드)으로 제한됨
  • 새로운 기술에서 간단한 머신 설계가 오래된 기술에서 복잡한 머신보다 우세함
  • 프로세서와 캐시를 하나의 칩에 넣는 큰 장점
  • 마이크로프로세서는 주당 1% 성능 향상 시대를 경험함
  • (복잡한 프로세서의 시장 진입 시간이 더 길기 때문에)
40쪽
p.401990년대 이후의 광범위한 채택
  • 프로세서 성능은 메모리 성능보다 훨씬 빠르게 향상됨
  • (즉, 메모리는 상대적으로 훨씬 느려짐)
  • out-of-order execution(순서 무시 실행)은 cache misses(캐시 미스) 완료를 기다리는 동안에도 execute(실행)을 계속할 수 있게 함
  • compilers(컴파일러)의 코드 생성은 다양한 마이크로아키텍처에 동시에 최적화할 수 없음
  • out-of-order execution(순서 무시 실행)은 compilers(컴파일러) 최적화에 대한 의존도를 줄임
  • 프로세서가 더 적극적으로 변화함 – 더 넓은 issue(발행) 폭, 더 깊은 pipelining(파이프라인)
  • out-of-order execution(순서 무시 실행)은 더 많은 명령어 수준 병렬성(ILP)을 활용할 수 있음
41쪽
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 등
42쪽
p.42질문?
  • 추천 독서:
  • Chapter 3.4 – 3.5
단축키
Ctrl K · s자료 검색
[ ]이전·다음 강의
Space영상 재생·정지
j k다음·이전 section
n p다음·이전 slide
b강의 목록 접기·펴기
t맨 위
/강의 검색
Esc닫기