전공/컴퓨터 구조

7. Pipeline에서 데이터 처리

문정훈 2021. 12. 27. 12:23

1. single core 5-stage pipeline MIPS processor에서 Data forwarding 기술이 적용되지 않았을 때, 아래 명령어들이 어떻게 실행되는지 정리

cycle 명령어 1 2 3 4 5 6 7 8
1 add r3, r2, r1 IF ID EX MEM WB


2 sub r4, r3, r5
IF ID EX MEM WB

3 add r6, r3, r5

IF ID EX MEM WB
4 add r7, r3, r5


IF ID EX MEM WB

4가지 명령어를 차례로 명령어1, 명령어2, 명령어3, 명령어4라고 하겠습니다.!

 

Datapath, Control의 개념

프로세서는 datapathcontrol로 구성되어 있습니다. 그 중 datapath는 말 그대로 데이터가 흘러가는 경로를 의미합니다. datapath를 통해 흘러가는 데이터를 dataflow라고 합니다.

dataflow를 제어하는 것이 control의 역할입니다.

 

Register File의 개념

Processor design에서 Register File이라는 개념이 있습니다.

레지스터 파일은 MIPS를 기준으로 32bit이며 32개로 구성되됩니다.

레지스터 파일은 output businput bus가 있습니다..

.

<Two 32bit output bus>

Operand Fetch 단계에서 ALU로 연산을 위해서 두 레지스터의 값을 ALU로 보게 되는데 레지스터 파일은 2개의 32bit output bus를 가집니다.

이를 Read data1, Read data2라고 하겠습니다.

 

<One 32bit input bus>

또한 레지스터 파일은 하나의 input bus를 가지는데 이는 ALU의 연산된 결과를 레지스터 파일에 다시 쓰기 위해서 존재합니다. Write Data로 부를 수 있습니다.

 

<Read register1, Read register2, Write register>

레지스터 파일은 입력 포트 3개를 가지며 각각의 데이터를 출력하고 입력 받는 레지스터를 선택하기 위해서 레지스터의 주소를 지정하기 위한 Read register1, Read register2, Write register 3개의 입력 포트를 가집니다.

 

Reigister File의 동작 원리

<레지스터 파일 -> ALU>

이는 산술 연산을 위한 피연산자가 저장된 레지스터에 값을 ALU로 보내는데 두 피연산자는 Register File의 두 개의 output bus로 나가게 됩니다.

Read register1, Read register2 가 가리키는 레지스터를 ALU연산을 위해서 보내지게 되는 것입니다.

 

<ALU -> 레지스터 파일>

write operation으로 ALU에서 연산이 끝나면 ALU의 결과를 레지스터 파일로 다시 써야합니다. 이 경우 레지스터 파일의 RegWrite라는 control 신호의 통제를 받는데 이 값이 1로 지정돈다면 Write Register가 가리키는 레지스터의 주소에 ALU의 연산 결과를 쓰게 됩니다.

Write Data라는 하나의 input 포트를 통해서 ALU 연산결과가 레지스터로 받아들여지게 됩니다.

 

<Clock input (CLK) >

Processor design에서 Register FileWrite operationclock에 동기화 되어서 동작합니다. 따라서 Read operation 같은 경우는 Read register1, Read register2로 주소가 지정되면 바로 Read operation이 동작해 Clock 신호에 영향을 안받습니다.

 

 

Memory File

Processor 디자인에서 Memory의 동작 원리는 Memory File이라는 추상적 개념을 정의하여 설명합니다

 

<Address 포트>

read, write할 메모리의 주소를 가리키는 포트입니다.

 

<Read Data>

Address 포트가 가리키 주소의 값을 메모리로부터 읽어서 외부로 내보내는데 메모리에서 외부로 내보내는 (CPU로 보내는 load 과정) Read data 포트가 있습니다.

 

<Write Data>

CPU 레지스터의 내용을 다시 메인 메모리에 저자하기 위해서(store) 존재하는 Write Data 포트입니다.

 

<MemRead>

이는 컨트롤 신호로 1로 지정된다면 Memory FIle의 포트로 들어오는 데이터가 메모리에 저장하도록 허락하는 Control 신호입니다.

 

<clock input (CLK)>

Write 동작은은 Clock 신호에 동기화되고 Read 동작은 Clock 신호에 무관합니다.

하지만 메모리 파일은 접근 시간이 느리기 때문에 Read 동작은 약간의 access time이 지연되게 됩니다.

 

 

 

Instruction Execution in 5 states

파이프라인의 각 cycle에서 하나의 명령어가 어ᄄᅠᆫ 작업을 수행하는지 먼저 설명 드리면
하나의 명령어가 처리되는 과정은 아래 다이어그램과 같습니다.

 

 

Datapath, Control의 개념

프로세서는 datapathcontrol로 구성되어 있습니다. 그 중 datapath는 말 그대로 데이터가 흘러가는 경로를 의미합니다. datapath를 통해 흘러가는 데이터를 dataflow라고 합니다.

dataflow를 제어하는 것이 control의 역할입니다.

 

파이프라인이란

파이프라인은 동시에 여려 MIPS 명령어를 overlapped하여 실행하는 방법으로

pipeline은 전체 프로세서를 여러 state로 나누게 되고 동시에 여러 명령어가 서로 다른 stage 상에 위치하며 동시에 명령어들이 처리되는 방식입니다.

이것은 시간당 처리되는 명려어의 수를 높혀 CPU 성능을 증가시키며 결과적으로 throghput을 높힐 수 있습니다.

 

Instruction Execution in 5 states

1)Instructino Fetch, 2) Instruction Decode, 3) Execute, 4) MEM Store, 5) Write Back

 

Pipeline Control Signal

명령어가 한 stage씩 진행되면서 control 신호 역시 따라서 진행되야합니다.

첫 번째 cycle에서 명령어1Instruction decode 단계에서 얻은 control 신호 중 ALUOp, ALUSrcExecute 단계에서 사용이 되고, 또한 MemWrite MemRead같은 신호들은 세 번째 clock cycle에서 사용이 됩니다. 따라서 위 이미지와 같이 각 stage 사이 존재하는 레지스터에 버퍼들을 추가해 Control 신호들을 다음 stage로 계속해서 전달하게 됩니다.

 

Pipeline divisions

파이프 라인에서 명령어가 실행될 때는 각 단계별로 사용되는 하드웨어 장치가 모두 다르기 때문에 최대 5개의 명령어가 overlapped하여 실행될 수 있으며

각 단계는 단계와 단계 사이에 레지스터가 추가 되어 1 clock cycle에 소요되도록 설계됩니다.

첫 번째 clock cycle

첫 번째 clock cycle에서는 명령어 1fetch 단계만 이루어지게 됩니다.

우선 메인 메모리로부터 add r3, r2, r1이라는 명령어 하나가 레지스터로 fetch 되야합니다.

파이프라인의 첫 번째 clock cycle에서 add r3, r2, r1 명령어가 메모리로부터 fetch 됩니다. 메모리의 fetchPC가 가리키는 주소의 명령어를 불러오는 것이며 Memory FileAddress 포트에 할당되어 있는 주소의 메모리의 명령어를 읽고 Memory File에서 데이터를 외부로 보내는 Read data 포트를 통해 명령어가 fetch됩니다.

명령어의 fetch가 끝나면 PC는 다음 명령어를 가져오기 위해 PC = PC+4가 됩니다.

branch 명령어가 아니라면 메모리에서 순차적으로 명령어들이 실행될 것입니다.

첫 번째 clock 주기가 종료되면 파이프라인 데이터페스 이미지에서 보이는 첫 번째 IF/ID(Instruction FetchInstruction Decode 단계 사이에 존재하는 레지스터) 레지스터에 현재 실행될 명령어와 다음에 실행될 명령어의 주소 값이 저장되게 됩니다.

 

두 번째 clock cycle

두 번째 clock 신호에서는 명령어1Instruction decode / operand fetch와 명령어2Instruction Fetch가 동시에 이루어지게 됩니다.

이 둘을 구별하기 위한 레지스터가 추가적으로 필요하게 됩니다.

명령어 1Instruction decode / operand fetch 과정은 MIPS 명령어가 add 명령어라는 것을 판단하고 피연연자의 값을 레지스터 r2, r1으로 fetch 합니다.

이것은 add와 같은 R-format 명령어인 경우이며 I-format의 명령어라면 R-format 다르게 operand fetch를 하여 레지스터에 값을 저장하는 방법이 다릅니다.

I-formatimm의 연산을 지원하며 이에따라서 R-format에서는 필요없던 추가적인 두 개의 MUX(MUX1, MUX2 라고 하면)가 필요하게 됩니다.

MUX가 필요한 이유는 R-format의 명령어는 [op rs rt rd] 구조로 rs, rt, rdResiger Fileread register1, Read register2, Write register 포트로 매피되는데

I-format의 명령어는 [op rs rt imm] 구조로 Register FileWrite data 포트가 rt 레지스터로 연결되야하기 때문입니다.

따라서 R-format, I-format 두 경우를 control 해주는 RegDst 컨트롤 신호와 함께 MUX1이 추가적으로 필요하게 됩니다.

만약 RegDst의 컨트롤 값이 1인 겨우는 R-format에 해당하고 0이면 I-format으로 control 합니다.

그리고 MUX216비트의 imm값이 MUX2ALUSrc 컨트롤 제어로 ALU로 인가도게 됩니다.

정리하면 ALUSrc 의 값이 0이면 R-format으로 1이면 I-format으로 컨트롤하며 16bitimm의 값은 32bit으로 변경해주는 sign extend를 거쳐 ALU로 보내지게 됩니다.

세 번째 clock cicle

세 번째 clock cycle에서는 명령어1execute, 명령어2Instruction decode / operand fetch가 진행되고 명령어3Instruction Fetch(명령어 패치) 가 진행됩니다.

명령어1ID/EX 레지스터(Instructin DecodeExcution 사이에 존재하는 레지스터)

에 저장된 연산자와 피연산자가 ALU 내부로 전달되고 덧셈 연산을 수행하게 됩니다.

 

네 번째 clock cycle

네 번재 clock cycle에서는 명령의 ALU 연산 결과가 메모리로 store 되고 명령어2execute(ALU 연산), 명령어3Instruction decode / operand fetch 작업 그리고 명령어4Instructino fetch가 진행됩니다.

이전 clock cycle에서 ALU 연산이 진행되었고 그 결과가 EX/MEM 레지스터에 저장되었습니다. 그 값을 EX/MEM 레지스터로부터 불러와 Memory FileStore해줘야하는데 Memory FileAddress 포트에 연산 결과 값을 store합니다.

Read data 포트로부터 Address 포트가 가리키는 값을 EX/MEM 레지스터로 가져오며

메모리에 데이터를 store하기 위해서는 MemWrite control signal1로 셋팅되게 됩니다.

네 번째 단계가 되면 모든 stage가 꽉 차게 되며 througput을 최대로 끌어올리게 됩니다.

 

다섯 번째 clock cycle

다 섯번째 clock cycle이 되면 명려어1은 이전 clock cycle에서 메모리로 store되었고 write back이 필요하다면 메모리의 데이터를 저장소에 Write Back하게 됩니다. 연산이 수행된 후 연산의 결과가 레지스터 rd 또는 메모리에 저장되며 PC값이 다음 명령어를 가리키도록 합니다. 그리고 명령어2ALU의 연산 결과를 EX/MEM 레지스터로부터 가져와 메모리로 store하게 됩니다.

명령어3ID/EX 레지스터로부터 연산자와 피연산자를 가져와 ALU에서 연산이 수행되고 명령어4Instruction decode / operand fetch을 진행합니다.

 

여섯 번째 clock cycle

여섯 번째 clock cycle에서는 명령어2write back이 진행되고 명령어3의 메모리 store, 명령어4ALU 연산이 진행됩니다.

 

일곱 번째 clock cycle

일곱 번째 clock cycle에서는 명령어3write back그리고 명령어4ALU 결과를 메모리로 store 합니다.

 

여덟 번째 clock cycle

마지막 8번째 에서는 명령어4write back이 진행됩니다.

Multy cycle 디자인을 위해 추가 된 각 단계 사이에서는 레지스터(RF/ID, ID/EX, EX/MEM, MEM/WB)를 통해 서로 겹치지 않고 명령어들을 동시에 여러개 실행합니다. 하지만 만약 명령어1add가 아닌 lw 명령어라면 문제가 발생하는데

write 데이터와 함께 레지스터 파일의 입력으로 인가되는 Write register의 값이 instruction decode 되고 있는 새로운 명령어들에 대해 이미 overlap이 되어 Write register의 값이 회손된다는 문제점이 발생합니다.

Write register의 값을 write back stage 까지 보존을 해줘야합니다.

따라서 이 문제를 해결하기 위해서는 ALU연산 결 과인 Write register의 값 write back 단계까지 보존해주기 위한 방법이 필요하며 이 값을 유지해주는 datapath가 추가 됩니다.

그러면 load 명령어 write back 단계로 진입하더라도 다른 명령어에 의해서 Write Register의 값이 훼손 되지 않고 공급될 수 있습니다.

'전공 > 컴퓨터 구조' 카테고리의 다른 글

8. Pipeline이란  (0) 2021.12.27
5. CPI 계산과 CPU time 구하기  (0) 2021.12.27
6. Processor Design  (0) 2021.10.29
4. Calling Convention(Caller-save, Callee-save, Hybrid)  (0) 2021.10.07
3. MIPS 문법 정리  (0) 2021.10.07