티스토리 뷰
본 포스팅은 "프로그래머가 몰랐던 멀티코어 CPU 이야기" 를 읽고 주인장의 생각을 정리한 게시글 입니다.
책정보, 프로그래머가 몰랐던 멀티코어 CPU 이야기 : 네이버 책 (naver.com)
1. 파이프라인 해저드(hazard)
파이프라인 해저드란 파이프라인을 지원하는 CPU에서 서로다른 명령어 간의 의존성이 발생하는 경우를 말합니다.
이전 포스팅에서 Pipeline의 깊이에 따라 발생한 Pipeline Stall과는 다른 이유로 stall이 발생합니다.
1_1. 데이터 해저드
데이터 해저드는, 다른 명령어의 실행 결과로 Data가 변하는 경우 발생하는 해저드를 의미합니다.
아래 예시를 보시죠
IF = 명령어 인출
ID = 명령어 해독
OF = 피연산자 인출
EX = 명령어 실행
OS = 피연산자 저장
명령어 1 [IF][ID][OF][EX][OS]
|
↓
명령어 2 [IF][ID][ ][ ][OF][EX][OS]
#명령어 2는 명령어 1의 OS가 끝난 뒤 OF를 해야됨
RAW의존성이 위 예시와 매우 유사하다고 볼 수 있습니다. 명령어1의 결과로 특정 메모리가 update되고,
이 update된 메모리를 명령어2가 사용한다고 보면 이해가 편합니다.
이러한 해저드는 감소시키는 방법으로, 바이패스를 추가하는 방법이 있습니다.
OF, EX를 RR(레지스터 읽기), ALU(연산), MEM(메모리 읽기)로 나눠서 표현
기존 : IF -> ID -> OF -> EXE -> OS
요기 : IF -> ID -> RR -> ALU -> MEM -> OS
명령어1 : [IF][ID][RR][AL][ME][OS]
|
↓
명령어2 : [ ][IF][ID][RR][AL][ME][OS]
#by pass가 있는 경우, 이전 AL결과를 임시로 저장 or feedback줄수 있는 회로를 구현
#by pass가 없을 경우(명령어 1의 OS 이후 RR이 가능)
명령어2 : [ ][IF][ID][ ][ ][ ][RR][AL][ME][OS]
명령어 1 이후의 ALU결과를 feedback주기 위해서는 하나의 bypass가 아니라, ALU 이후 에서도 feedback을 줄 수 있어야 합니다.(명령어 2 뿐만 아니라 명령어 3, 4 도 영향을 받는다고 생각하면 됩니다)
1_2. 컨트롤 해저드
컨트롤 해저드는 분기문처럼, 특정 조건에 따라서 다음에 실행될 명령어가 바뀌는 겨우를 의미합니다.
if (z > 0) goto 4;
a = 10;
goto 5;
a = 0;
x = y + z;
//a의 값은 1번 명령어에 의해서 종속됨.
//5번 명령의 경우 다른 명령어들과 관계없음
위 경우에, 1번 줄의 결과에 따라서 1->4->5 또는 1->2->5 순서로 코드가 실행되게 됩니다. 그러면 파이프라인은 아래처럼 구성되게 됩니다.
IF = 명령어 인출
ID = 명령어 해독
OF = 피연산자 인출
EX = 명령어 실행
OS = 피연산자 저장
명령어 1 [IF][ID][OF][EX][OS]
|
↓
명령어 4 or 2 [ ][ ][ ][IF][ID][OF][EX][OS]
명령어 5 [ ][ ][ ][ ][IF][ID][OF][EX][OS]
보는것처럼 명려어 1의 실행 전까지 pipeline stall이 발생합니다.
CPU에서는 이러한 불합리를 막기 위해서 명령어 5를 먼저 실행시키는 방법(명령어 비동기 처리 or 컴파일러 최적화)과
분기예측(branch prediction)을 통해서 2번 또는 4번 중 실행 가능성이 높은 명령어를 투기적으로 실행합니다.
(예측이 틀려서 명령어를 실행하다 버리더라도 실행하는 경우를 의미합니다)
IF = 명령어 인출
ID = 명령어 해독
OF = 피연산자 인출
EX = 명령어 실행
OS = 피연산자 저장
#분기예측 결과 명령어 4가 유력한 경우
명령어 1 [IF][ID][OF][EX][OS]
명령어 4 [ ][IF][ID][OF][EX][OS]
명령어 5 [ ][ ][IF][ID][OF][EX][OS]
#명령어 비동기처리를 하는 경우
명령어 1 [IF][ID][OF][EX][OS]
명령어 5 [ ][IF][ID][OF][EX][OS]
명령어 4 [ ][ ][ ][IF][ID][OF][EX][OS]
'컴퓨터과학 > CPU' 카테고리의 다른 글
비순차 실행(1편) (0) | 2022.07.01 |
---|---|
명령어 파이프라인(1편) (0) | 2022.06.03 |
CPU동작(BackEnd) (0) | 2022.06.02 |
CPU동작(FrontEnd) (0) | 2022.05.12 |
CPU의 성능 지표(CPI, IPC, Clock...) (0) | 2022.05.11 |
- Total
- Today
- Yesterday
- 알고리즘
- Python
- prime number
- heap
- 완전탐색 알고리즘
- 동적계획법
- 프로그래머스
- 컴퓨터그래픽스
- C++
- stack
- SIMD
- git
- 이분탐색
- Search알고리즘
- Greedy알고리즘
- 코딩테스트
- 자료구조
- 사칙연산
- Sort알고리즘
- AVX
- 병렬처리
- hash
- 분할정복
- GDC
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |