๋ฐ˜์‘ํ˜•

 

 

๋งค์ผ๋ฉ”์ผ ๋ฐฑ์—”๋“œ ์งˆ๋ฌธ์„ ์ฐธ๊ณ ํ•ด ๊ฐœ์ธ์ ์œผ๋กœ ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ์–ธ์ œ๋“  ํ”ผ๋“œ๋ฐฑ ์ฃผ์‹œ๋ฉด ๋ฐ”๋กœ ๋ฐ˜์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค..!

 

 

์‹œ์ž‘ํ•˜๊ธฐ์ „์—

 

"์–ด๋–ค ์ฝ”๋“œ๊ฐ€ ์™œ CPU์—์„œ ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋Š” ๊ฑธ๊นŒ?" ์— ๋Œ€ํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” ๋ช…๋ น์–ด ํŒŒ์ดํ”„๋ผ์ด๋‹์ด๋ผ๋Š” CPU์˜ ๋™์ž‘ ์›๋ฆฌ ๋•๋ถ„์ž„

 

=> ๋ฐฑ์—”๋“œ๊ด€๋ จ ์—…๋ฌด๋ฅผ ํ•œ๋‹ค๋ฉด ๋†’์€ ์„ฑ๋Šฅ๊ณผ ํšจ์œจ์„ ์œ„ํ•ด ๋กœ์šฐ๋ ˆ๋ฒจ ์‹œ์Šคํ…œ์ด ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ํŠนํžˆ ์ค‘์š”!!

 

 

๋ช…๋ น์–ด ํŒŒ์ดํ”„๋ผ์ด๋‹์ด๋ž€?

 

๋ช…๋ น์–ด ํŒŒ์ดํ”„๋ผ์ด๋‹(instruction pipelining) ์€ CPU๊ฐ€ ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋ฅผ ๋™์‹œ์— ๊ฒน์ณ์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐ ๋ช…๋ น์–ด๋ฅผ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋ถ„ํ• ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ์ˆ ์ž„

 

=> ์ฆ‰, ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ, ๋‹ค์Œ ๋ช…๋ น์–ด์˜ ์ผ๋ถ€๋„ ๋ฏธ๋ฆฌ ์ˆ˜ํ–‰ํ•ด ์ „์ฒด ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๋†’์ด๋Š” ๊ฒƒ์ด ํ•ต์‹ฌ

 

์ „ํ†ต์ ์ธ CPU๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ˜๋ฉด, ํŒŒ์ดํ”„๋ผ์ธ ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” CPU๋Š” ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋ฅผ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋‹จ๊ณ„์—์„œ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Œ

 

์ถœ์ฒ˜ : ์œ„ํ‚ค๋ฐฑ๊ณผ

 

์œ„ ๊ทธ๋ฆผ์„ ์‚ดํŽด๋ณด๋ฉด

 

๋‹ค์„ฏ ๊ฐœ์˜ ๋ช…๋ น์–ด๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š”๋ฐ ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋Š” ๋‹ค์„ฏ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ ์‹คํ–‰๋˜๊ณ , ์ด๋•Œ ํ”„๋กœ์„ธ์„œ์—์„œ๋Š” ์ฒซ ๋ฒˆ์งธ ๋ช…๋ น์–ด์˜ IF๊ฐ€ ์‹คํ–‰๋˜๋ฉด ID๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋™์‹œ์— ๋‹ค์Œ ๋ช…๋ น์–ด์˜ IF๋ฅผ ์‹คํ–‰ํ•จ

๊ทธ ๋‹ค์Œ์—๋Š” ์ฒซ ๋ฒˆ์งธ์˜ EX, ๋‘ ๋ฒˆ์งธ์˜ ID, ์„ธ ๋ฒˆ์งธ์˜ IF๋ฅผ ์‹คํ–‰ํ•˜๋Š”๊ฑธ ๋ณผ ์ˆ˜ ์žˆ์Œ

 

ํŒŒ์ดํ”„๋ผ์ด๋‹์˜ ๊ธฐ๋ณธ ๊ตฌ์กฐ

  • IF(Instruction Fetch) : ๋ช…๋ น์–ด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ฐ€์ ธ์˜ด

  • ID(Instruction Decode) : ๋ช…๋ น์–ด ํ•ด์„ ๋ฐ ํ•„์š”ํ•œ ๋ ˆ์ง€์Šคํ„ฐ ์‹๋ณ„

  • EX(Execute) : ALU ์—ฐ์‚ฐ ์ˆ˜ํ–‰

  • MEM(Memory Access) : ๋ฉ”๋ชจ๋ฆฌ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์ˆ˜ํ–‰

  • WB(Write Back) : ๊ฒฐ๊ณผ๋ฅผ ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅ

 

ํŒŒ์ดํ”„๋ผ์ด๋‹์˜ ํ•œ๊ณ„ : Pipeline Hazard

 

ํŒŒ์ดํ”„๋ผ์ด๋‹์€ ์ด์ƒ์ ์œผ๋กœ๋Š” ๋ชจ๋“  ๋ช…๋ น์–ด๊ฐ€ ๊ฒน์น˜๋ฉด์„œ ๋งค ์‚ฌ์ดํด๋งˆ๋‹ค ๋ช…๋ น์–ด๊ฐ€ ํ•˜๋‚˜์”ฉ ๋๋‚˜์•ผํ•จ


ํ•˜์ง€๋งŒ, ์„œ๋กœ ๋‹ค๋ฅธ ๋ช…๋ น์–ด๊ฐ€ ์ถฉ๋Œํ•˜๊ฑฐ๋‚˜, ์˜ˆ์ธก์ด ๋น—๋‚˜๊ฐ€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ ์œ„ํ—˜(Pipeline Hazard) ์ด๋ผ๊ณ  ํ•จ
(๋Œ€์ฒด๋กœ ํŒŒ์ดํ”„๋ผ์ด๋‹์€ ๋†’์€ ์„ฑ๋Šฅ์„ ๊ฐ€์ ธ์˜ค์ง€๋งŒ, ๋•Œ๋กœ๋Š” ์„ฑ๋Šฅ ํ–ฅ์ƒ์— ์‹คํŒจํ•˜๊ธฐ๋„ํ•จ)

 

Data Hazard (๋ฐ์ดํ„ฐ ์œ„ํ—˜)

 

๋ฐ์ดํ„ฐ ์œ„ํ—˜์€ ๋ฐ์ดํ„ฐ ์˜์กด์ ์ธ ๋‘ ๋ช…๋ น์–ด๋ฅผ ๋™์‹œ์— ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ, ํŒŒ์ดํ”„๋ผ์ธ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

1. ADD R1, R2, R3   ; R1 = R2 + R3
2. SUB R4, R1, R5   ; R4 = R1 - R5 (R1์€ ์œ„ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ)

 

์œ„ ์˜ˆ์ œ์—์„œ 2๋ฒˆ์งธ ๋ช…๋ น์–ด๋Š” R1 ๊ฐ’์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ์•„์ง ์ฒซ ๋ฒˆ์งธ ๋ช…๋ น์–ด์˜ ๊ฒฐ๊ณผ๊ฐ€ R1์— ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜์„ ์ˆ˜ ์žˆ์Œ

=> ํŒŒ์ดํ”„๋ผ์ธ ์ง€์—ฐ์ด ํ•„์š”ํ•จ (Forwarding - ๋ฐ์ดํ„ฐ ์ „๋‹ฌ, Stalling - ํŒŒ์ดํ”„๋ผ์ธ ์ผ์‹œ ์ •์ง€)

 

Control Hazard (์ œ์–ด ์œ„ํ—˜)

 

์ œ์–ด ์œ„ํ—˜์€ ๋ถ„๊ธฐ(branch)๋‚˜ ์กฐ๊ฑด๋ฌธ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋‹ค์Œ์— ์‹คํ–‰ํ•  ๋ช…๋ น์–ด๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ฒฐ์ •๋˜์ง€ ์•Š์•„ ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ฉˆ์ถ”๊ฒŒ ๋˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•จ

 

BEQ R1, R2, label   ; R1 == R2์ผ ๋•Œ label๋กœ ์ ํ”„

 

์œ„์˜ ๊ฒฝ์šฐ, ๋ถ„๊ธฐ ์กฐ๊ฑด์ด ํ‰๊ฐ€๋˜๊ธฐ ์ „๊นŒ์ง€ ๋‹ค์Œ์— ์–ด๋–ค ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ• ์ง€ ์•Œ ์ˆ˜ ์—†์Œ

 

=> ๋ถ„๊ธฐ ์˜ˆ์ธก(branch prediction), delay slot, ํŒŒ์ดํ”„๋ผ์ธ flush ๋“ฑ์˜ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ์žˆ์Œ

 

(ํ•˜์ง€๋งŒ, ์˜ˆ์ธก์— ์‹คํŒจํ•˜๋ฉด ๊ณ„์‚ฐ๋œ ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ชจ๋‘ ๋ฒ„๋ ค์•ผ ํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ ์†์‹ค์ด ํผ)

 

Pipeline Flush : ๋ถ„๊ธฐ ์˜ˆ์ธก ์‹คํŒจ, Exception, ์ธํ„ฐ๋ŸฝํŠธ ๋“ฑ์ด ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ํŒŒ์ดํ”„๋ผ์ธ ์•ˆ์— ๋“ค์–ด๊ฐ„ ๋ช…๋ น์–ด๋“ค์„ ๋ชจ๋‘ ๋ฒ„๋ฆฌ๊ณ  (flush) ์ƒˆ๋กœ์šด ๋ช…๋ น์–ด๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ์žฌ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ

Branch Prediction(๋ถ„๊ธฐ ์˜ˆ์ธก)
: ๋ถ„๊ธฐ ๋ช…๋ น์–ด(if, for, goto, switch ๋“ฑ)๊ฐ€ ๋‚˜์™”์„ ๋•Œ, ์‹ค์ œ๋กœ ๋ถ„๊ธฐํ• ์ง€ ์•„๋‹์ง€๋ฅผ ๋ฏธ๋ฆฌ ์˜ˆ์ธกํ•˜๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ํŒŒ์ดํ”„๋ผ์ธ์— ๋„ฃ๋Š” ๊ธฐ๋ฒ•

=> ์˜ˆ์ธก์ด ๋งž์œผ๋ฉด ํŒŒ์ดํ”„๋ผ์ธ ์ •์ƒ ์ง„ํ–‰์ด์ง€๋งŒ, ํ‹€๋ฆฌ๋ฉด Pipeline Flush

Delay Slot : ๋ถ„๊ธฐ ๋ช…๋ น์–ด ๋‹ค์Œ ๋ช…๋ น์–ด ํ•˜๋‚˜๋Š” ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋˜๊ฒŒ ๊ฐ•์ œ๋กœ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ์‹์ž„
(๋ถ„๊ธฐ๋ฌธ ๋ฐ”๋กœ ๋ฐ‘ ํ•œ ์ค„๋งŒ Delay Slot์ž„)

=> ํŒŒ์ดํ”„๋ผ์ธ flush ์‚ฌ์ด์— ํŒŒ์ดํ”„๋ผ์ธ์ด ๋†€๊ฒŒ๋˜๋ฏ€๋กœ ๋‚ญ๋น„๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š”๋ฐ,
๋ถ„๊ธฐ ๋ช…๋ น์–ด ๋‹ค์Œ์— ์˜ฌ ๋ช…๋ น์–ด ํ•˜๋‚˜๋Š” ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋  ๊ฑธ๋กœ ๊ฐ€์ •ํ•˜๊ณ , ์˜๋ฏธ ์—†๋Š” ๋ช…๋ น์–ด๋ฅผ ๋„ฃ๋Š” ๋Œ€์‹  ์‹ค์ œ๋กœ ์‹คํ–‰ํ•ด๋„ ๋˜๋Š” ๋ช…๋ น์–ด๋ฅผ ๋„ฃ์–ด๋‘๋ฉด ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ๊ฐ€๋Šฅํ•จ

BEQ R1, R2, LABEL     ; ๋ถ„๊ธฐ
ADD R7, R8, R9        ; Delay Slot โ†’ ๋ฌด์กฐ๊ฑด ์‹คํ–‰๋จ โ†’ ์–ด์ฐจํ”ผ ํ•ด์•ผ ๋  ์—ฐ์‚ฐ์„ ๋ฏธ๋ฆฌ ์ˆ˜ํ–‰

์œ„์ฒ˜๋Ÿผ ๋ฌด์กฐ๊ฑด ์‹คํ–‰ํ•ด๋„ ๊ดœ์ฐฎ์€ ๋ช…๋ น์–ด๋ฅผ Delay Slot์— ๋„ฃ์œผ๋ฉด ํŒŒ์ดํ”„๋ผ์ธ ๋‚ญ๋น„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ ํ–ฅ์ƒ!!
(Delay Slot์— ๋„ฃ์„ ๋ช…๋ น์–ด๋Š” ์•ˆ์ „ํ•œ ๋ช…๋ น์–ด์—ฌ์•ผ ํ•จ)

 

Structural Hazard (๊ตฌ์กฐ์  ์œ„ํ—˜)

 

๊ตฌ์กฐ์  ์œ„ํ—˜์€ ํ•œ ๋ช…๋ น์–ด๊ฐ€ ์ž์›์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ•ด๋‹น ์ž์›์ด ํ•„์š”ํ•œ ๋‹ค๋ฅธ ๋ช…๋ น์–ด๋Š” ๋ฉˆ์ถ”๊ฒŒ ๋˜์–ด ํŒŒ์ดํ”„๋ผ์ธ์ด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๊ฑธ ์˜๋ฏธํ•จ

 

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์ด ํ•„์š”ํ•œ ๋‘ ๋ช…๋ น์–ด๊ฐ€ ๋™์‹œ์— MEM ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค ํ•˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒ

 

=> ํ•˜๋“œ์›จ์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณต์ˆ˜๋กœ ๊ตฌ์„ฑํ•˜๊ฑฐ๋‚˜, ๋ช…๋ น์–ด ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์กฐ์ •ํ•ด์„œ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

 

ํŒŒ์ดํ”„๋ผ์ด๋‹์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

 

์žฅ์ 

 

  • CPU ์ฒ˜๋ฆฌ๋Ÿ‰ ์ฆ๊ฐ€ (Throughput ํ–ฅ์ƒ)

  • ๋‹จ์ผ ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ ์‹œ๊ฐ„์€ ๊ทธ๋Œ€๋กœ์ง€๋งŒ, ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ๊ฐ„ ๋‹จ์ถ•

  • ๋ณ‘๋ ฌ์„ฑ๊ณผ ์†๋„ ํ–ฅ์ƒ

 

๋‹จ์ 

 

  • ๋ณต์žกํ•œ ํ•˜๋“œ์›จ์–ด ์ œ์–ด ๋กœ์ง ํ•„์š”

  • ํŒŒ์ดํ”„๋ผ์ธ ์œ„ํ—˜ ์ฒ˜๋ฆฌ ๋น„์šฉ ์กด์žฌ

  • ๋ถ„๊ธฐ ์˜ˆ์ธก ์‹คํŒจ ์‹œ ํŒŒ์ดํ”„๋ผ์ธ flush ๋น„์šฉ
๋ฐ˜์‘ํ˜•