티스토리 뷰

728x90
반응형

본 포스팅은 "프로그래머가 몰랐던 멀티코어 CPU 이야기" 를 읽고 주인장의 생각을 정리한 게시글 입니다.

책정보, 프로그래머가 몰랐던 멀티코어 CPU 이야기 : 네이버 책 (naver.com)

 

프로그래머가 몰랐던 멀티코어 CPU 이야기

CPU는 그저 복잡한 하드웨어가 아니다!블로그에서 바로 읽는 듯한 생생한 개발 노하우「BOLG2BOOK」시리즈 제 9권 『프로그래머가 몰랐던 멀티코어 CPU 이야기』. 이 책은 기본적인 CPU 구조에 대한

book.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]
728x90
반응형

'컴퓨터과학 > 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
링크
«   2024/12   »
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
글 보관함