leehyeon-dv 님의 블로그
4.9 Exceptions 본문
🔑Table of Contents
- Exceptions and interrunpts ( 예외와 인터럽트)
- Handing Exception (MIPS에서의 예외처리)
- Exceptions in a Pipeline (파이프라인에서 예외처리)
- Pipeline with Exceptions
- Exception Properties(예외의 특성)
- Exception 예제
- Exception Example
- Multiple Exceptions
- Imprecise Exceptions (부정확한 예외처리)
📌 Exceptions and interrunpts ( 예외와 인터럽트)
- 제어의 흐름 중에 예상치 못한 상황 발생했을때 이를 처리하기 위한 메커니즘, ISA에 따라 처리 방식다름
- Exception(예외 ) = CPU내부에서 발생하는 비정상적인 상황
- 0으로 나누기, 메모리 접근오류, 부적절한 명령어 실행
- interrupt(중단) = 외부 I/O로부터 발생하는 이벤트
- 키보드입력, 마우스클릭, 네트워크 데이터 수신
- Trap = 명령어실행 중 특정 조건에의해 발생하는 소프트웨어적인 인터럽트
- 입출제어기 없이 이 문제를 다루는 것은 어렵다
📌 Handing Exception (MIPS에서의 예외처리)
✨
- MIPS에서 예외가 발생하면 CP0에 의해 예외처리가 수행됨
- 문제가 생긴 명령어 주소저장
- 예외 발생 명령어의 주소(PC)가 EPC에 저장됨
- 문제의 종류를 저장
- 예외의 원인은 Cause Register에 저장
- 1비트로 가정한다면 (undefined opcode : 0, overflow : 1)
- 예외 처리기로 이동
- 예외가 발생하면 8000 0180에 위치한 예외처리기로 점프한다
- handler는 EPC와 Cause Register를 이용해 예외를 분석하고 적절히 처리한다
📌An Alternate Mechanism
다른 발전된 방식
- 벡터 인터럽트(특정 핸들러 주소로 직접 점프하는 메커니즘)
- 원인에 따른 handler 주소가 다르게 정해져있음
- 예 :
- underfined opcode : C000 0000
- overflow : C000 0020
- ✨문제가 발생한 명령어는 다음 중 하나로 진행
- 해당 handler에서 처리
- real handler(문제를 처리할 수 있는)로 jump
📌 Handler Actions (예외 핸들러 동작)
- 원인을 읽고, 관련된 handler로 넘겨준다(handler로 jump).
- 필요한 동작을 결정 (복구 가능/불가능)
- 복구 가능하다면 ,
- 적절한 동작으로 시정하여 동작시킨다.
- 수정작업 수행 EPC를 사용해 프로그램 복기
- 그렇지 않다면
- 프로그램을 중단한다(terminate).
- EPC, cause Register, ... 등을 이용하여 error를 보고(Report error).
📌 Exceptions in a Pipeline (파이프라인에서 예외처리)
- control hazard의 또 다른 형태로 볼 수 있다
- control hazard = 프로그램 흐름이 바뀔 가능성 때문에, 직후 명령어를 바로 실행할 수 없는 상태
- exception도 발생하면, 다음의 명령어들이 실행되지 못하고 exception을 처리해야 함.
✨
- 예 ) add명령어의 EX 단계에서 overflow가 발생
- add $1, $2, $1
- EX단계에서 오버플로우 발생
- $1에 잘못된 값이 쓰여지는 것 방지 (MEM,WB로 진행하는 것 막기)
- 이전 명령들 정상적으로 완료되도록 보장
- add 명령어와 이후 명령어들을 비운다(flush).
- EPC와 Cause Register의 값을 세팅한다. (주소저장, 예외원인 : 오버플로우 저장)
- handler로 제어권을 넘긴다(handler가 처리할 수 있도록 jump)
- 예측실패한 branch와 유사하다.
- 동일한 하드웨어 자원을 많은 부분 함께 사용한다.
📌 Pipeline with Exceptions
추가된 부분 외에도 기존 장치를 많은 부분 함께 활용해 exception을 처리한다
📌 Exception Properties(예외의 특성)
- 예외 발생시 명령어 처리
- 해당명령어와 그 이후 명령어가 파이프라인에서 제거
- handler에서 예외 처리 후 , 원래의 instruction로 복귀해 실행 재개.
- 이번엔 시정된 instruction을 실행한다.
- EPC 레지스터에 PC가 저장됨
- 문제가 발생한 instruction을 식별가능.
- 예외 발생 명령어의 주소 PC+4가 저장됨
- 따라서 원래 명령어로 복귀하려면 PC = EPC -4
📌 Exception 예제
*add 명령어에서 exception 발생
40 sub $11, $2, $4
44 and $12, $2, $5
48 or $13, $2, $6
4C add $1, $2, $1
50 slt $15, $6, $7
54 lw $16, 50($7)
...
*Handler
8000 0180 sw $25, 1000($0)
8000 0184 sw $26, 1004($0)
...
- add이후의 명령어(50,54)를 파이프라인에서 제거
- EPC= 4C +4 = 50저장
- Cause Register = 오버플로우 저장
- 8000 0810에 위치한 예외처리기로 점
📌 Exception Example
EX에서 exception발생
핸재 명령어와 이후 명령어 모두 flush
📌 Multiple Exceptions
다중(동시) 예외
- 파이프라인의 병렬실행으로 여러 명령어가 동시 실행중일때 여러 예외가 발생할 수 있음
- 간단한 접근법 (precise exceptions)
- 파이프라인 가장 후반의 명령어 부터 예외를 처리한다
- 이후 모든 명령어를 Flush해 제거
- 복잡한 파이프라인의 특징
- 비순차 진행 ( 명령어의 실행 순서가 프로그래밍 순서와 다르게 실행될 수 있음)
- 다중 예외 발생 ( 여러 명령어에서 동시에 예외가 발생하면 명령어 순서를 고려하지 않을 경우 비정확한 예외처리가 발생할 수 있다)
- Precise Exceptions의 중요성
- 프로그램 상태 정확히 복구가능
- 예외처리 이후에도 명령어 순서를 유지해 안정적인 실행보장
- 그러나, 복잡한 파이프라인으로 순서대로 처리되지 않을 수 있음
📌 Imprecise Exceptions (부정확한 예외처리)
- 예외발생시 정확한 명령어 순서를 유지하지 않고 파이프라인 상태와 예외 정보를 저장해 핸들러가 분석 후 처리
- 예외 발생시 파이프라인 동작을 멈추고, 현 상태를 저장한다.
- 예외의 원인(하나 혹은 여럿)도 함께 저장한다.
- 핸들러로 제어이동
- 어떤 명령어(혹은 여러 명령어)가 예외를 발생시켰는지 파악.
- 처리해야 할 명령어와 Flush해야 할 명령어를 결정.
- 필요한 경우, 예외가 발생한 명령어를 수동으로 완료(manual completion)하거나 복구.
- 하드웨어 간소화 , 소프트웨어 복잡성 증가
비순차 파이프라인에서의 한계
- 최신 CPU의 비순차 파이프라인에서는 Imprecise Exceptions 방식을 사용할 수 없습니다.
- 이유: 비순차 실행은 명령어 순서가 복잡하게 얽혀 있어 명령어 순서를 정확히 복구하는 것이 매우 어렵기 때문입니다.
- Precise Exceptions 방식이 필요.
복습
데이터 위험
-전방전달(계산결과를 다음명령어에 전달해 데이터 해자드 해결)
-load use 데이터 해자드(stall하나를 더 만들어서 해결)
-code scheduling (코드의 위치를 바꿔서 해결)
제어 위험
- 분기명령어 실행중인데 결과가 확정안남
stall on branch로 해결 (분기 결과 나올때 까지 stall
분기 예측 (미리 예측)
정적 분기예측 - beq가 아니라면을 가정해 연속된 명령어 가져옴
동적 분기 예측 - 실제로 사용하는 것에 더 가까운 방식
'컴퓨터구조 및 설계 > 4장. The Processor' 카테고리의 다른 글
4.8 Control Hazards (0) | 2024.12.11 |
---|---|
4.6 Pipelined Datapath and Control (0) | 2024.12.11 |
4.5 An Overview of Pipelining (0) | 2024.12.11 |
4.4 A Simple Implementation Scheme (0) | 2024.12.10 |
4.3 Building a Datapath (0) | 2024.11.21 |