0. 프로세서의 명령어 수준 병렬성, Pipeline
* Pipeline 정의
여러개의 명령어를 처리 단계별로 병렬화, 동시해석, 처리하는 기법
* RISC[reduced instruction set computer] Pipeline 5단계
IF(instructions fetch)
현재 명령어가 실행되는 주소에서 다음 주소로 넘기는 +4를 해주고
I-MEM에서 명령어를 가지고 온다.
ID(instruction decode)
명령어를 해독하여, LW의 기준으로는 lw $1 (0)$2 를 예를 들면, rs 필드 : $2 , 변위 : 0 , rt 필드 : $1로 레지스터를 읽도록 하게하고, 변위에 대해서는 부호와 주소로 변환 32bit로 변환해주는과정을 해준다.
EX(execute) 실행과정
ALU를 통해서 해당 명령어를 수행한다. rs, rt필드를 읽어올 수도 있고(R-type, branch) , lw, sw의 경우에는 변위부분을 두번째 피연산자로해서 계산한다.
또한, 변위 부분을 Shift logical left 2번 해줌으로써 * 4를 해서 주소화 시킨다.
MEM(Data memory)에다가 write하거나, read해서 write back할 준비를 한다.
LW같은 경우에는 base address $2에 + 0을 더한 값으로 해당 주소의 데이터를 read 한 후에, wb할 준비를 한다.
sw같은 경우에는 해당 주소 $2에 +0을 더한 값에 해당하는 주소에 $1값을 write한다.
WB(Write back)
* Pipeline 아키텍처
Super Scalar
Super Pipeline
Superpipelined Superscalar
VLIW (Very Long Instruction Word)
1. 해저드
다음 명령이 지정된 클럭에서 수행하는 것을 방해하는 것
2. 구조적 해저드 (Structural hazards)
하드웨어가 여러 명령 수행을 지원하지 않기 때문에 발생. 자원충돌.
add A, B, B
add C, D, D
▷ 해결방안 : 레지스터 파일 사용, 모든 구조적 해저드 제거는 어렵고 비쌈
3. 데이터 해저드 (Data hazards)
명령이 현재 파이프 라인에서 수행중인 이전 결과에 종속되는 경우 발생.
* Read After Write (RAW) : 명령 instrI가 저장한 오퍼랜드를 다음 명령 instrJ가 읽을 때 발생
A = B + C;
D = A + E;
명령 instrI가 WB스테이지에서 결과값 쓰기를 할 때까지 기다려야한다.
* Write After Read (WAR) : 명령 instrI가 오퍼랜드를 읽기 전에 다음 명령 instrJ가 같은 오퍼랜드 쓰기의 경우 발생
A = B + C;
B = D + E;
단일 파이프 라인에서는 발생하지 않음.
스테이지2에서 오퍼랜드를 읽고, 스테이지 5에서 오퍼랜드를 쓰기 때문.
동시에 수행하는 다중이슈에서 발생
* Write After Write (WAW) : 명령 instrI가 오퍼랜드를 쓰기 전에 명령 instrJ가 같은 오퍼랜드를 쓰는 경우 발생.
A = B + C;
A = D + E;
단일 파이프라인에서는 발생하지 않음.
동시에 수행하는 다중이슈에서 발생.
▷ 해결방안 : 레지스터 리네임 ( stoll )
파이프라인 지연 ( interlock )
컴파일러에 의한 instruction 스케줄링 ( By Pass )
4. 제어 해저드(Control hazards)
분기 명령어에 의해 발생
▷ 해결방안 : 지연분기 - 분기 방향이 결정될 때까지 중지
Branch 예측 - 과거 실행 내역 및 빈도를 이용한 확률적 예측
5. 해저드를 해결하는 가장 단순한 방식은 해저드의 요인이 소멸될 때까지 파이프라인을 중지(stall)하는 것이다.
=============================================
I-MEM : instruction memory
LW : Load Word
ALU : 산술연산, 논리연산 및 시프트(shift)를 수행하는 중앙처리장치 내부의 회로 장치
오퍼랜드 : 연산의 대상이 되는 것. A+B라는 연산에서는 A를 제1오퍼랜드, B를 제2오퍼랜드라고 함
==============================================
예를 들어 lw $s1, 100($s2) 의 경우
IF 스테이지는 명령캐쉬(메모리의 사본)로부터 명령코드자체를 가져오는 단계입니다.
실제 RISC는 메모리를 직접 액세스하는 경우가 없습니다.
거의 캐쉬로부터 PC에 해당하는 코드이미지를 가져옵니다.
명령어 fetch - memory에서 명령어 register로 명령어를 가져옵니다.
ID 스테이지에서 Load/Store는 실상은 거의 하는일이 없습니다.
보통 이 단계에서 레지스터페치가 일어납니다.
즉 $s2를 레지스터 파일에서 읽어오는거죠, 또한 숫자 100이라는 값도 ALU에 로딩합니다.
실상은 RISC파이프에서는 점프명령이 아닌 이상 거의 하는일이 없다고 봐도 됩니다.
EX 스테이지에서 Load/Store는 하는일이 무척많습니다.
$s2 + 100의 값이 실제로 계산되는 단계이며
필요에 따라서는 메모리 관리유닛(MMU)에 의해
가상메모리주소와 물리메모리주소의 변환이 일어납니다.(구조에 따라 아닐 수도 있습니다.)
MEM : $s2 + 100 주소에 있는 data를 read합니다.
대체로 데이터캐쉬로부터 값을 로딩합니다.
WB : 상기의 data를 $s1 register에 write 합니다.
로딩값을 레지스터 파일에 기록합니다.
'CS > Computer' 카테고리의 다른 글
[Network] 토폴로지(Topology) bus형 star형 ring형 (0) | 2017.07.01 |
---|---|
[품질관리] CMM (Capability Maturity Model) (0) | 2017.06.27 |
RAID Level (5,6) (0) | 2017.06.26 |
RAID Level (0,1,2,3,4) (0) | 2017.06.26 |
[Micro Processor] RISC / CISC (0) | 2017.06.26 |