ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

Day 3) CPU ์‹คํ–‰ ๊ธฐ์ดˆ: ํŒŒ์ดํ”„๋ผ์ธ๊ณผ ์Šคํ†จ

  • ํŒŒ์ดํ”„๋ผ์ธ: ๋ช…๋ น์–ด๋ฅผ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ  ๊ฒน์ณ ์ฒ˜๋ฆฌํ•ด ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋†’์ž„
  • ์Šคํ†จ/๋ฒ„๋ธ”: ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ/์ž์› ๋ถ€์กฑ/๋ถ„๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ
  • IPC/CPI: ์ •ํ™•ํ•œ ๊ณ„์‚ฐ๋ณด๋‹ค ์™œ ๋‚ฎ์•„์ง€๋Š”์ง€ ์ดํ•ด

์ •๋ฆฌ ์งˆ๋ฌธ

  • CPU๊ฐ€ “๋ฐ”์˜๊ฒŒ” ๋„๋Š”๋ฐ๋„ ์‹ค์ œ ์ง„ํ–‰์ด ๋А๋ฆฐ ์ด์œ ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

Intro

์•ฑ์„ ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด “์™œ ์ด๋ ‡๊ฒŒ ๋А๋ฆฌ์ง€?”๋ผ๋Š” ์ˆœ๊ฐ„์„ ํ”ผํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ์ด ํ˜„์ƒ์„ ๋‹จ์ˆœํžˆ “CPU๊ฐ€ ๋А๋ฆฌ๋‹ค”๋ผ๊ณ ๋งŒ ์ดํ•ดํ•˜๋ฉด, ์‹ค์ œ๋กœ ๋ฌด์—‡์„ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต๋‹ค.

์ด ๊ธ€์˜ ๋ชฉํ‘œ๋Š” CPU ์„ฑ๋Šฅ์„ ํด๋Ÿญ์ด๋‚˜ ์ฝ”์–ด ๊ฐœ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ,

๋” ์‹ค์ „์ ์ธ ๊ด€์ ์ธ ‘๋ช…๋ น์–ด๊ฐ€ CPU ์•ˆ์—์„œ ์–ผ๋งˆ๋‚˜ ๋ง‰ํžˆ์ง€ ์•Š๊ณ  ํ˜๋Ÿฌ๊ฐ€๋А๋ƒ(Instruction flow)’๋กœ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ด๋ฅผ ์œ„ํ•ด ์•„๋ž˜ ์งˆ๋ฌธ์— ๋‹ตํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •๋ฆฌํ•œ๋‹ค.

  • ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ฌด์—‡์ด๊ณ , ์™œ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š”๊ฐ€?
  • ๊ทธ๋Ÿฐ๋ฐ๋„ ์™œ ์Šคํ†จ(stall)๊ณผ ๋ฒ„๋ธ”(bubble)์ด ์ƒ๊ธฐ๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ IPC/CPI๊ฐ€ ์–ด๋–ป๊ฒŒ ๋‚˜๋น ์ง€๋Š”๊ฐ€?
  • ํ˜„๋Œ€ CPU์˜ ์บ์‹œ(cache), Out-of-Order(OOO), ์ถ”์ธก ์‹คํ–‰(speculation), ์Šˆํผ์Šค์นผ๋ผ(superscalar)๋Š” ๊ฐ๊ฐ ์–ด๋–ค ๋ณ‘๋ชฉ์„ ์ค„์ด๋ ค ํ–ˆ๊ณ , ์™œ ์—ฌ์ „ํžˆ ํ•œ๊ณ„๊ฐ€ ๋‚จ๋Š”๊ฐ€?

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” ์ด ๋‚ด์šฉ์„ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ์‹ค์ œ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๋กœ ๋‚ด๋ ค์„œ,

Apple์ด ๊ถŒ์žฅํ•˜๋Š” “CPU ๋ณ‘๋ชฉ์„ ํ”ผํ•˜๋Š” ์„ค๊ณ„ ์›์น™(ํ”„๋ ˆ์ž„์›Œํฌ ํ™œ์šฉ, QoS, ๋™์  ์Šค์ผ€์ค„๋ง, ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ)”๊ณผ ์—ฐ๊ฒฐํ•ด ์ •๋ฆฌํ•œ๋‹ค.


1) Problem: ํŒŒ์ดํ”„๋ผ์ธ์€ ๋น ๋ฅด์ง€๋งŒ, ํ˜„์‹ค์—์„œ๋Š” ์ž์ฃผ ๋ฉˆ์ถ˜๋‹ค

CPU๋Š” ๋ช…๋ น์–ด(instruction)๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋ณดํ†ต ๋‹ค์Œ์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆˆ๋‹ค.

  • Fetch(๊ฐ€์ ธ์˜ค๊ธฐ) → Decode(ํ•ด์„) → Execute(์‹คํ–‰) → Write-back(๊ฒฐ๊ณผ ๋ฐ˜์˜)

์—ฌ๊ธฐ์„œ ํŒŒ์ดํ”„๋ผ์ธ(pipelining)์€ “ํ•œ ๋ช…๋ น์–ด๋ฅผ ๋‹ค ๋๋‚ด๊ณ  ๋‹ค์Œ ๋ช…๋ น์–ด๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋ฐฉ์‹”์ด ์•„๋‹ˆ๋ผ,
์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋ฅผ ์„œ๋กœ ๋‹ค๋ฅธ ๋‹จ๊ณ„์—์„œ ๊ฒน์ณ์„œ ์ง„ํ–‰ํ•ด ์ฒ˜๋ฆฌ๋Ÿ‰์„ ์˜ฌ๋ฆฌ๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด CPU๋Š” ํ•œ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰(execute)ํ•˜๋ฉด์„œ, ๋‹ค์Œ ๋ช…๋ น์–ด๋ฅผ ๋””์ฝ”๋“œ(decode)ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฌธ์ œ๋Š” ํŒŒ์ดํ”„๋ผ์ธ์ด ํ•ญ์ƒ ๋งค๋ˆํ•˜๊ฒŒ ํ๋ฅด์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์ด๋‹ค.

  • Stall(์Šคํ†จ): ์–ด๋–ค ์ด์œ ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์ด ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋ฉˆ์ถ”๋Š” ํ˜„์ƒ
  • Bubble(๋ฒ„๋ธ”): ๊ทธ ๋ฉˆ์ถค ๋™์•ˆ ์ƒ๊ธฐ๋Š” “์œ ํšจ ์ž‘์—…์ด ์—†๋Š” ๋นˆ ์‚ฌ์ดํด(ํ—›๋ฐ”ํ€ด)”

๊ทธ๋ž˜์„œ “CPU๊ฐ€ ๋ฐ”์˜๊ฒŒ ๋Œ๊ณ  ์žˆ๋Š”๋ฐ๋„” ์‹ค์ œ ์ง„ํ–‰์ด ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.
CPU๊ฐ€ ๊ณ„์‚ฐ์„ ๋ชป ํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๊ธฐ๋‹ค๋ฆฌ๋А๋ผ ์‹œ๊ฐ„์ด ์ƒˆ๋Š” ๊ฒƒ์ด๋‹ค.

์ด๊ฑธ ์„ฑ๋Šฅ ์ง€ํ‘œ๋กœ ๋ฒˆ์—ญํ•˜๋ฉด ๊ฐ๊ฐ์ด ๋” ๋ช…ํ™•ํ•ด์ง„๋‹ค.

  • CPI(Cycles Per Instruction): ๋ช…๋ น์–ด 1๊ฐœ๋ฅผ ๋๋‚ด๋Š” ๋ฐ ๋“œ๋Š” ํ‰๊ท  ์‚ฌ์ดํด
    → ๋ฒ„๋ธ”์ด ๋Š˜๋ฉด CPI๋Š” ์ปค์ง„๋‹ค.
  • IPC(Instructions Per Cycle): ์‚ฌ์ดํด 1๋ฒˆ์— ์™„๋ฃŒ๋˜๋Š” ๋ช…๋ น์–ด ์ˆ˜
    → ๋ฒ„๋ธ”์ด ๋Š˜๋ฉด IPC๋Š” ๋–จ์–ด์ง„๋‹ค.

์ฆ‰, “CPU ์‚ฌ์šฉ๋ฅ ์ด ๋†’๋‹ค”๋Š” ์‚ฌ์‹ค๋งŒ์œผ๋กœ๋Š” ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜์ง€ ๋ชปํ•œ๋‹ค.
์œ ํšจํ•œ ์ง„ํ–‰(์‹ค์ œ ์ปค๋ฐ‹๋˜๋Š” ๋ช…๋ น์–ด)์ด ์–ผ๋งˆ๋‚˜ ๋˜๋Š”์ง€๊ฐ€ ํ•ต์‹ฌ์ด๋‹ค.


2) ์›์ธ: ์Šคํ†จ์„ ๋งŒ๋“œ๋Š” 3๋Œ€ ๋ณ‘๋ชฉ(๋ฐ์ดํ„ฐ / ๋ถ„๊ธฐ / ์ž์›)

ํŒŒ์ดํ”„๋ผ์ธ์ด ๋ฉˆ์ถ”๋Š” ์›์ธ์€ ํฌ๊ฒŒ ์„ธ ๊ฐ€์ง€๋กœ ๋ฌถ์ด๋‹ค.

(1) ๋ฐ์ดํ„ฐ ๋ณ‘๋ชฉ: Load(๋ฉ”๋ชจ๋ฆฌ ์ฝ๊ธฐ) ์ง€์—ฐ (Data Hazard)

CPU ์—ฐ์‚ฐ์€ ๋น ๋ฅด์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ(RAM) ์ ‘๊ทผ์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆฌ๋‹ค.
ํ•„์š”ํ•œ ๊ฐ’์ด ์•„์ง ๋„์ฐฉํ•˜์ง€ ์•Š์•˜๋Š”๋ฐ ๊ทธ ๊ฐ’์œผ๋กœ ์—ฐ์‚ฐ์„ ํ•ด์•ผ ํ•˜๋ฉด, ํŒŒ์ดํ”„๋ผ์ธ์€ ๋ฉˆ์ถœ ์ˆ˜๋ฐ–์— ์—†๋‹ค.

  • ํŠนํžˆ Load → ๋ฐ”๋กœ ์‚ฌ์šฉ(load-use) ํŒจํ„ด์€ ์Šคํ†จ์„ ๋งŒ๋“ค๊ธฐ ์‰ฌ์šด ๋Œ€ํ‘œ ์ผ€์ด์Šค์ด๋‹ค.
  • ์บ์‹œ ๋ฏธ์Šค๊ฐ€ ๋‚˜์„œ DRAM๊นŒ์ง€ ๊ฐ”๋‹ค ์˜ค๋ฉด ์ง€์—ฐ์ด ํฌ๊ฒŒ ํŠ€๊ณ , ๊ทธ๋งŒํผ ๋ฒ„๋ธ”์ด ์ปค์ง„๋‹ค.

(2) ๋ถ„๊ธฐ ๋ณ‘๋ชฉ: if ๊ฐ™์€ ์กฐ๊ฑด ๋ถ„๊ธฐ (Control Hazard)

๋ถ„๊ธฐ(if)๊ฐ€ ๋‚˜์˜ค๋ฉด “๋‹ค์Œ์— ์–ด๋А ์ชฝ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ• ์ง€(๋‹ค์Œ PC)”๊ฐ€ ํ™•์ •๋  ๋•Œ๊นŒ์ง€ ํ๋ฆ„์ด ํ”๋“ค๋ฆฐ๋‹ค.

์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋А๋ผ๊ธฐ ์‰ฌ์šด ํฌ์ธํŠธ๊ฐ€ ํ•˜๋‚˜ ์žˆ๋‹ค.

  • ๋ถ„๊ธฐ ์กฐ๊ฑด์„ ํŒ๋‹จํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์•„์ง ์—†์–ด์„œ ๊ธฐ๋‹ค๋ฆฐ๋‹ค → ๋ณธ์งˆ์ ์œผ๋กœ “๋ฐ์ดํ„ฐ ๋Œ€๊ธฐ” ์„ฑ๊ฒฉ์ด ๊ฐ•ํ•จ.
  • ์กฐ๊ฑด์€ ์•Œ๊ฒ ๋Š”๋ฐ, ์–ด๋А ์ชฝ์œผ๋กœ ๊ฐˆ์ง€ ์˜ˆ์ธกํ–ˆ๋‹ค๊ฐ€ ํ‹€๋ฆฐ๋‹ค → ์ด๊ฒŒ ์ปจํŠธ๋กค ํ•ด์ €๋“œ์˜ ๊ณ ์œ  ์†์‹ค(ํ”Œ๋Ÿฌ์‹œ๋กœ ์ธํ•ด ์ด๋ฏธ ํ•œ ์ผ์„ ๋ฒ„๋ฆผ).

(3) ์ž์› ๋ณ‘๋ชฉ: ์œ ๋‹›/ํฌํŠธ/ํญ ํ•œ๊ณ„ (Structure Hazard)

๋™์‹œ์— ์ฒ˜๋ฆฌํ•˜๊ณ  ์‹ถ์–ด๋„ ์‹คํ–‰ ์œ ๋‹›์ด๋‚˜ ํฌํŠธ๊ฐ€ ๋ถ€์กฑํ•˜๋ฉด ์ค„์„ ์„œ์•ผ ํ•œ๋‹ค.
์ด๊ฑด “๊ตฌ์กฐ์  ์ž์› ๊ฒฝํ•ฉ”์œผ๋กœ ์ƒ๊ธฐ๋Š” ๋ณ‘๋ชฉ์ด๋‹ค.


3) CPU์˜ ๋Œ€์‘: ๊ทธ๋ž˜์„œ ํ˜„๋Œ€ CPU๋Š” “ํ๋ฆ„์„ ์‚ด๋ฆฌ๋Š” ์žฅ์น˜”๋ฅผ ์Œ“์•„์™”๋‹ค 

ํ˜„๋Œ€ CPU๋Š” ์ด ๋ณ‘๋ชฉ์„ ์—†์• ๊ธฐ๋ณด๋‹ค๋Š” ๋ณ‘๋ชฉ์ด ์ƒ๊ฒผ์„ ๋•Œ ์†์‹ค์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ์žฅ์น˜๋ฅผ ๊ฒน๊ฒน์ด ์Œ“์•„์™”๋‹ค.

Apple๋„ ํ˜„๋Œ€ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋ช…๋ น์–ด ํ๋ฆ„์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๊ฐ™์€ ์žฅ์น˜๋“ค์„ ๊ฐ–์ถ˜๋‹ค๊ณ  ์„ค๋ช…ํ•œ๋‹ค.

  • Pipelining
  • Out-of-order execution
  • Speculative execution
  • Superscalar architecture
  • Memory caches

์ด์ œ ์ด๊ฑธ “๊ฐ ๋ฐœ์ „์ด ๋ฌด์—‡์„ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๋Š”๊ฐ€?”๋กœ ๋งคํ•‘ํ•ด๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์ •๋ฆฌ๋œ๋‹ค.

Article: Addressing CPU bottlenecks


4) ๊ฐ ๋ฐœ์ „์€ “๋ฌด์Šจ ๋ณ‘๋ชฉ”์„ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ–ˆ๋‚˜?

(1) Cache = “๋ฉ”๋ชจ๋ฆฌ ์ง€์—ฐ์„ ์ค„์—ฌ ๋ฐ์ดํ„ฐ ์Šคํ†จ์„ ์ค„์ด๊ธฐ”

ํƒ€๊นƒ: Load ์ง€์—ฐ์œผ๋กœ ์ƒ๊ธฐ๋Š” ๋ฐ์ดํ„ฐ ์Šคํ†จ

 

์บ์‹œ(cache)๋Š” CPU ๊ฐ€๊นŒ์šด ๊ณณ์— ๋ช…๋ น์–ด/๋ฐ์ดํ„ฐ๋ฅผ ๋ณต์ œํ•ด ๋‘๊ณ  ๋ฐ˜๋ณต ์ ‘๊ทผ์„ ๋น ๋ฅด๊ฒŒ ํ•œ๋‹ค.
ํ•ต์‹ฌ์€ “ํ•ด์ €๋“œ๋ฅผ ์ œ๊ฑฐ”๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋” ๋นจ๋ฆฌ ๋„์ฐฉํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์Šคํ†จ ์‹œ๊ฐ„์„ ์ค„์ด๋Š” ๊ฒƒ์ด๋‹ค.

  • ํžˆํŠธ(hit)๋ฉด ๋น ๋ฅด๊ณ 
  • ๋ฏธ์Šค(miss)๋ฉด ๋А๋ฆฌ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์ด ์ฐจ์ด๊ฐ€ ์Šคํ†จ์„ ๋งŒ๋“ ๋‹ค)

(2) Out-of-Order(OoO) = “๋ฐ์ดํ„ฐ ๊ธฐ๋‹ค๋ฆผ ์Šคํ†จ์„ ์ˆจ๊ธฐ๊ธฐ”

ํƒ€๊นƒ: ๋ฐ์ดํ„ฐ(ํŠนํžˆ Load) ๋Œ€๊ธฐ๋กœ ์ƒ๊ธฐ๋Š” ์Šคํ†จ

 

OoO๋Š” ์Šคํ†จ์„ “์—†์• ๋Š”” ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋‹ค.
์•ž ๋ช…๋ น์–ด๊ฐ€ ๋ฐ์ดํ„ฐ๊ฐ€ ์˜ฌ ๋•Œ๊นŒ์ง€ ๋ฉˆ์ถฐ ์žˆ์œผ๋ฉด, ๊ทธ ์‚ฌ์ด์— ์˜์กด์„ฑ ์—†๋Š”(๋…๋ฆฝ์ ์ธ) ๋’ค ๋ช…๋ น์–ด๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•ด์„œ CPU๊ฐ€ ๋†€์ง€ ์•Š๊ฒŒ ๋งŒ๋“ ๋‹ค.

์ฆ‰, OoO๋Š” ์Šคํ†จ์„ ์ œ๊ฑฐํ•˜๊ธฐ๋ณด๋‹ค ์Šคํ†จ ์‹œ๊ฐ„์„ ๊ฐ€๋ ค๋ฒ„๋ฆฌ๋Š”(hide) ์ ‘๊ทผ์ด๋‹ค.

(3) Speculative execution(์ถ”์ธก ์‹คํ–‰) = “๋ถ„๊ธฐ(์ปจํŠธ๋กค) ์Šคํ†จ/๋ฒ„๋ธ”์„ ์ค„์ด๊ธฐ”

ํƒ€๊นƒ: ๋ถ„๊ธฐ(if)๋กœ ์ƒ๊ธฐ๋Š” ์ปจํŠธ๋กค ํ•ด์ €๋“œ

 

๋ถ„๊ธฐ์—์„œ๋Š” ๋‹ค์Œ PC(Program Counter)๊ฐ€ ํ™•์ •๋  ๋•Œ๊นŒ์ง€ ํŒŒ์ดํ”„๋ผ์ธ์ด ํ”๋“ค๋ฆฐ๋‹ค.
๊ทธ๋ž˜์„œ CPU๋Š” ์˜ˆ์ธก์„ ํ•˜๊ณ , ๊ทธ ๊ฒฝ๋กœ์˜ ๋ช…๋ น์–ด๋ฅผ ๋ฏธ๋ฆฌ ์‹คํ–‰ํ•ด ๋‘”๋‹ค.

์—ฌ๊ธฐ์„œ ํฌ์ธํŠธ๋Š” ์ด๊ฒƒ์ด๋‹ค.

  • ์ถ”์ธก ์‹คํ–‰์€ “ํ•  ์ผ์ด ์—†์–ด์„œ”๊ฐ€ ์•„๋‹ˆ๋ผ
  • ์›๋ž˜๋ผ๋ฉด ๋ถ„๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋А๋ผ ๋ฉˆ์ถœ ์ƒํ™ฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฏธ๋ฆฌ ๊ฐ€๋Š” ๊ฒƒ

๋Œ€๊ฐ€(์‹คํŒจ ๋น„์šฉ)
์˜ˆ์ธก์ด ํ‹€๋ฆฌ๋ฉด ๋ฏธ๋ฆฌ ์‹คํ–‰ํ•œ ๊ฑธ ๋ฒ„๋ฆฌ๊ณ (ํ”Œ๋Ÿฌ์‹œ) ๋‹ค์‹œ ํ•ด์•ผ ํ•œ๋‹ค.
๊ทธ๋ž˜์„œ ๋ถ„๊ธฐ ์˜ˆ์ธก ์‹คํŒจ๊ฐ€ ์žฆ์œผ๋ฉด IPC(Instructions Per Cycle)๊ฐ€ ํฌ๊ฒŒ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

(4) Superscalar = “ํ•œ ์‚ฌ์ดํด ์ฒ˜๋ฆฌ ํญ(width)์„ ํ‚ค์›Œ ์ฒ˜๋ฆฌ๋Ÿ‰/๊ฒฝํ•ฉ์„ ์™„ํ™””

ํƒ€๊นƒ: ์ฒ˜๋ฆฌ๋Ÿ‰ ํ•œ๊ณ„ + ์ผ๋ถ€ ๊ตฌ์กฐ์  ๊ฒฝํ•ฉ

 

์Šˆํผ์Šค์นผ๋ผ๋Š” CPU ๋‚ด๋ถ€์— ๋ณ‘๋ ฌ ๊ตฌ์„ฑ์š”์†Œ๋ฅผ ๋‘ฌ์„œ ํ•œ ์‚ฌ์ดํด์— ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋ฅผ ์ฒ˜๋ฆฌํ•  ๊ธฐํšŒ๋ฅผ ๋Š˜๋ฆฐ๋‹ค.
(์˜ˆ: ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋ฅผ ๋™์‹œ์— fetch ํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ์‹คํ–‰ ์œ ๋‹›์„ ๋‘ฌ์„œ ๋ณ‘๋ ฌ ์‹คํ–‰)

์—ฌ๊ธฐ์„œ ํ‘œํ˜„์„ ์ •ํ™•ํžˆ ํ•˜๋ฉด:

  • ๊ตฌ์กฐ ํ•ด์ €๋“œ๋ฅผ “์—†์•ค๋‹ค”๊ฐ€ ์•„๋‹ˆ๋ผ
  • ์ž์› ๊ฒฝํ•ฉ์„ ์™„ํ™”ํ•˜๊ณ  ์ฒ˜๋ฆฌ๋Ÿ‰ ํ•œ๊ณ„๋ฅผ ๋†’์ด๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

๋‹จ, ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด ๊ฐ•ํ•˜๊ฑฐ๋‚˜ ํŠน์ • ์œ ๋‹›/ํฌํŠธ/๋ฉ”๋ชจ๋ฆฌ ๊ฒฝ๋กœ๊ฐ€ ๋ณ‘๋ชฉ์ด๋ฉด, ํญ์ด ๋„“์–ด๋„ ์‹ค์ œ ํ™œ์šฉ์€ ์ œํ•œ๋œ๋‹ค.

 


(+) CPU ๋‚ด๋ถ€ ๊ตฌ์กฐ(Deep Dive): register / queue / ROB๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

์œ„์˜ ์žฅ์น˜๋“ค(OoO/์ถ”์ธก ์‹คํ–‰/์Šˆํผ์Šค์นผ๋ผ)์€ ๊ณตํ†ต์ ์œผ๋กœ “๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด๋ฅผ ์ง„ํ–‰”์‹œํ‚ค๋ ค ํ•œ๋‹ค.
๊ทธ๋Ÿฌ๋ ค๋ฉด CPU๋Š” ์ง„ํ–‰ ์ค‘์ธ ๋ช…๋ น์–ด์™€ ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ์ž˜ ๋ณด๊ด€ํ•˜๊ณ  ์ •๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‹ค์Œ ๊ตฌ์กฐ๋“ค์ด ๋“ฑ์žฅํ•œ๋‹ค.

(1) Register(๋ ˆ์ง€์Šคํ„ฐ): “CPU ์•ˆ์˜ ์ดˆ๊ณ ์† ๋ฉ”๋ชจ์žฅ”

๋ ˆ์ง€์Šคํ„ฐ๋Š” ์—ฐ์‚ฐ ์ž…๋ ฅ/์ถœ๋ ฅ, ์ฃผ์†Œ ๊ณ„์‚ฐ, ์ค‘๊ฐ„ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด๋Š” ์ดˆ๊ณ ์† ์ €์žฅ์†Œ์ด๋‹ค.

์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ์˜๋ฏธ๋Š” ์ด๊ฒƒ์ด๋‹ค.

  • ์•„ํ‚คํ…์ฒ˜ ๋ ˆ์ง€์Šคํ„ฐ: ISA(Instruction Set Architecture)๊ฐ€ “์žˆ๋‹ค๊ณ  ์•ฝ์†ํ•œ” ๋ ˆ์ง€์Šคํ„ฐ(์ปดํŒŒ์ผ๋Ÿฌ/์ฝ”๋“œ๊ฐ€ ๊ธฐ์ค€์œผ๋กœ ์‚ผ๋Š” ์ง‘ํ•ฉ)
  • ๋ฌผ๋ฆฌ ๋ ˆ์ง€์Šคํ„ฐ: CPU ๊ตฌํ˜„์ด ์‹ค์ œ๋กœ ๊ฐ€์ง„ ๋” ๋งŽ์€ ๋ ˆ์ง€์Šคํ„ฐ(๋™์‹œ์— ์—ฌ๋Ÿฌ ๋ช…๋ น์„ ์ง„ํ–‰ํ•˜๋ ค๋ฉด ์ €์žฅ ๊ณต๊ฐ„์ด ๋” ํ•„์š”)

์ฆ‰, ์ฝ”๋“œ๊ฐ€ ๋ณด๋Š” ๋ ˆ์ง€์Šคํ„ฐ ์ˆ˜๋ณด๋‹ค CPU ๋‚ด๋ถ€๋Š” ๋” ๋งŽ์€ ์ €์žฅ ๊ณต๊ฐ„์„ ๋‘๊ณ  “๋™์‹œ ์ง„ํ–‰”์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.

(2) Queue(ํ): “๋‹จ๊ณ„ ์‚ฌ์ด ์™„์ถฉ์ง€๋Œ€(์ค„)”

ํŒŒ์ดํ”„๋ผ์ธ ๋‹จ๊ณ„๋Š” ์†๋„๊ฐ€ ํ•ญ์ƒ ๊ฐ™์ง€ ์•Š๋‹ค. ํŠนํžˆ ๋ฉ”๋ชจ๋ฆฌ ์ชฝ์€ ๋ณ€๋™์ด ํฌ๋‹ค.
๊ทธ๋ž˜์„œ CPU๋Š” ๋‹จ๊ณ„ ์‚ฌ์ด์— “์ค„(ํ)”์„ ๋‘๊ณ  ์™„์ถฉํ•œ๋‹ค.

  • ๋””์ฝ”๋“œ ๋Œ€๊ธฐ์—ด
  • ์‹คํ–‰ ๋Œ€๊ธฐ์—ด
  • ๋กœ๋“œ/์Šคํ† ์–ด ๋Œ€๊ธฐ ๊ตฌ์กฐ ๋“ฑ

ํ๊ฐ€ ๊ธธ์–ด์ง„๋‹ค๋Š” ๊ฑด ๊ทธ ์ง€์ ์ด ๋ณ‘๋ชฉ์ด๋ผ๋Š” ์‹ ํ˜ธ๊ฐ€ ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

(3) ROB(Reorder Buffer): “OoO/์ถ”์ธก ์‹คํ–‰์˜ ์ •๋ฆฌ ๋‹ด๋‹น”

OoO์™€ ์ถ”์ธก ์‹คํ–‰์„ ํ•˜๋ฉด ์‹คํ–‰ ์ˆœ์„œ๋Š” ๋’ค์ฃฝ๋ฐ•์ฃฝ์ด ๋  ์ˆ˜ ์žˆ๋‹ค.
๊ทธ๋Ÿฐ๋ฐ ํ”„๋กœ๊ทธ๋žจ์€ ๊ฒ‰๋ณด๊ธฐ๋กœ “์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋œ ๊ฒƒ์ฒ˜๋Ÿผ” ์ผ๊ด€๋œ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€์•ผ ์•ˆ์ „ํ•˜๋‹ค.

ROB์˜ ํ•ต์‹ฌ ์—ญํ• ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  1. ์™„๋ฃŒ(์ปค๋ฐ‹/retire)๋ฅผ ํ”„๋กœ๊ทธ๋žจ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฆฌ
  2. ๋ถ„๊ธฐ ์˜ˆ์ธก ์‹คํŒจ ์‹œ, ์ž˜๋ชป๋œ ๊ฒฝ๋กœ์—์„œ ๋งŒ๋“  ๊ฒฐ๊ณผ๋ฅผ ํ•œ ๋ฒˆ์— ํ๊ธฐ(๋กค๋ฐฑ)
  3. ์˜ˆ์™ธ/์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ด๋„ “์ •ํ™•ํ•œ ์ง€์ ์—์„œ ๋ฉˆ์ถ˜ ๊ฒƒ์ฒ˜๋Ÿผ” ๋ณด์ด๊ฒŒ ์ •๋ฆฌ

6) ๊ทธ๋Ÿฐ๋ฐ ์™œ ์•„์ง๋„ ๋А๋ฆฌ๋‚˜? (ํ•ด๊ฒฐ์ฑ…์ด ์žˆ์–ด๋„ ๋ณ‘๋ชฉ์ด ๋‚จ๋Š” ์ด์œ )

์—ฌ๊ธฐ์„œ ๊ฒฐ๋ก ์ด ํ•œ ๋‹จ๊ณ„ ๋” ์ •๊ตํ•ด์ง„๋‹ค.

ํ˜„๋Œ€ CPU๋Š” ๋ณ‘๋ชฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ์žฅ์น˜๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€๋งŒ,
๊ทธ ์žฅ์น˜๋“ค์ด ํ•ญ์ƒ ์žฅ์ ๋งŒ ์žˆ๋Š” ๊ฑด ์•„๋‹ˆ๋‹ค. (Trade-Off)

 

๊ฐ ์žฅ์น˜์—๋Š” ์ „์ œ์กฐ๊ฑด๊ณผ ์‹คํŒจ ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • Cache: ์ ‘๊ทผ ํŒจํ„ด์ด ๋‚˜์˜๋ฉด ์บ์‹œ ๋ฏธ์Šค๊ฐ€ ๋นˆ๋ฒˆํ•ด์ง€๊ณ , RAM ์ง€์—ฐ์€ ์—ฌ์ „ํžˆ ํฌ๋‹ค.
  • OoO: ๋…๋ฆฝ ์ž‘์—…(ILP)์ด ๋ถ€์กฑํ•˜๋ฉด ์ˆจ๊ธธ ์Šคํ†จ์ด ๊ทธ๋Œ€๋กœ ๋“œ๋Ÿฌ๋‚œ๋‹ค.
  • Speculation: ๋ถ„๊ธฐ ์˜ˆ์ธก ์‹คํŒจ๊ฐ€ ์žฆ์œผ๋ฉด ํ”Œ๋Ÿฌ์‹œ ๋น„์šฉ์œผ๋กœ IPC๊ฐ€ ํฌ๊ฒŒ ๋–จ์–ด์ง„๋‹ค.
  • Superscalar: ํญ์„ ๋Š˜๋ ค๋„ ์˜์กด์„ฑ/ํŠน์ • ํฌํŠธ ๋ณ‘๋ชฉ ๋•Œ๋ฌธ์— ์‹ค์ œ ํ™œ์šฉ์ด ์ œํ•œ๋œ๋‹ค.

๊ทธ๋ž˜์„œ “CPU๊ฐ€ ๋ฐœ์ „ํ–ˆ๋Š”๋ฐ๋„ ๋А๋ฆฌ๋‹ค”๋Š” ๋ง์€ ๋ชจ์ˆœ์ด ์•„๋‹ˆ๋‹ค.
CPU๋Š” ์†์‹ค์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ตœ์„ ์„ ๋‹คํ•˜์ง€๋งŒ, ์ž…๋ ฅ ํŒจํ„ด(๋ฉ”๋ชจ๋ฆฌ/๋ถ„๊ธฐ/์˜์กด์„ฑ)์ด ๋‚˜์˜๋ฉด ๋ฒ„๋ธ”์€ ๋‹ค์‹œ ์ปค์ง„๋‹ค.


7) ์—”์ง€๋‹ˆ์–ด๋Š” ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋‚˜?

CPU ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์•ฑ์—์„œ ์ง์ ‘ ๋ฐ”๊ฟ€ ์ˆ˜๋Š” ์—†๋‹ค.
ํ•˜์ง€๋งŒ “CPU ๋ณ‘๋ชฉ์„ ํ”ผํ•˜๋„๋ก ์•ฑ์„ ์„ค๊ณ„”ํ•˜๋Š” ๊ฒƒ์€ ์—”์ง€๋‹ˆ์–ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๊ณ , Apple๋„ ์ด๋ฅผ ๋ช…ํ™•ํžˆ ๊ถŒ์žฅํ•œ๋‹ค.

Design your app to avoid CPU bottlenecks

(1) ์‹œ์Šคํ…œ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์šฐ์„  ์‚ฌ์šฉํ•˜๋ผ

์‹œ์Šคํ…œ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋””๋ฐ”์ด์Šค ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์“ฐ๋„๋ก ์ตœ์ ํ™”๋ผ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
๊ฐ™์€ ์ผ์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ๋ณด๋‹ค ํ”„๋ ˆ์ž„์›Œํฌ ๊ฒฝ๋กœ๋ฅผ ํƒ€๋Š” ๊ฒŒ CPU ๋ณ‘๋ชฉ์„ ์ค„์ด๋Š” ๋น ๋ฅธ ๊ธธ์ด ๋œ๋‹ค.

(2) ์ •์  ์Šค๋ ˆ๋“œ ํ’€๋ณด๋‹ค ๋™์  ํ• ๋‹น์„ ์„ ํ˜ธํ•˜๋ผ

๊ธฐ๊ธฐ๋Š” ์ฝ”์–ด ๊ตฌ์„ฑ๊ณผ ํ˜„์žฌ ๋ถ€ํ•˜์— ๋”ฐ๋ผ ์ž‘์—… ์ฒ˜๋ฆฌ์œจ์ด ๋‹ฌ๋ผ์ง„๋‹ค.
๊ณ ์ • ํ’€์€ ์–ด๋–ค ์Šค๋ ˆ๋“œ๋Š” ๋†€๊ณ  ์–ด๋–ค ์Šค๋ ˆ๋“œ๋Š” ๋ฐ€๋ฆฌ๋Š” ์‹์˜ ๋น„ํšจ์œจ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

(3) QoS(Quality-of-Service)๋ฅผ ์ •ํ™•ํžˆ ํ‘œ์‹œํ•˜๋ผ

๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…์˜ ์ค‘์š”๋„๋ฅผ QoS๋กœ ์•Œ๋ ค์ฃผ๋ฉด ์‹œ์Šคํ…œ์ด ํšจ์œจ์ ์œผ๋กœ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํŠนํžˆ Apple silicon์ฒ˜๋Ÿผ ์„ฑ๋Šฅ ์ฝ”์–ด(P-core, Performance core)์™€ ํšจ์œจ ์ฝ”์–ด(E-core, Efficiency core)๊ฐ€ ํ•จ๊ป˜ ์žˆ๋Š” ํ™˜๊ฒฝ์—์„œ๋Š”,

QoS๊ฐ€ ์ž‘์—…์ด ์–ด๋А ์ฝ”์–ด์—์„œ ์‹คํ–‰๋ ์ง€์—๋„ ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ QoS๋ฅผ ๋น„์›Œ๋‘๊ฑฐ๋‚˜ ์ž˜๋ชป ์ง€์ •ํ•˜๋ฉด ์ฒด๊ฐ ์„ฑ๋Šฅ(์‘๋‹ต์„ฑ)๊ณผ ์ „๋ ฅ ํšจ์œจ์ด ๋™์‹œ์— ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค.

Tuning your code’s performance for Apple silicon

(4) ๊ฐ€๋Šฅํ•˜๋ฉด BGTasks๋กœ ์‹œ์Šคํ…œ์ด ์Šค์ผ€์ค„ํ•˜๊ฒŒ ํ•˜๋ผ

๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ “์–ธ์  ๊ฐ€ ํ•ด๋„ ๋˜๋Š” ์ž‘์—…”์€ ์‹œ์Šคํ…œ์ด ์ž์› ์—ฌ์œ ์— ๋งž์ถฐ ์‹คํ–‰ํ•˜๋„๋ก ๋งก๊ธฐ๋Š” ์ „๋žต์ด ์œ ๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

(5) ๋ชฉํ‘œ๋ฅผ ์„ธ์šฐ๊ณ , ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋กœ ํšŒ๊ท€๋ฅผ ๋ง‰์•„๋ผ

Apple์€ ์„ฑ๋Šฅ ๋ชฉํ‘œ ์ˆ˜๋ฆฝ๊ณผ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ๊ถŒ์žฅํ•˜๋ฉฐ, CPU ํ™œ๋™๊ณผ ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ์ธก์ •ํ•  ๋ฉ”ํŠธ๋ฆญ๋„ ์ œ๊ณตํ•œ๋‹ค.

 

WWDC25: Optimize CPU performance with Instruments

Analyzing CPU usage with the Processor Trace instrument


๋งˆ๋ฌด๋ฆฌ

์—ฌ๊ธฐ๊นŒ์ง€ CPU๊ฐ€ ๋ช…๋ น์–ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ˜๋ ค๋ณด๋‚ด๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๊ทธ ํ๋ฆ„์ด ์Šคํ†จ/๋ฒ„๋ธ” ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ ๋ฌด๋„ˆ์งˆ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์‚ดํŽด๋ดค๋‹ค.

 

์บ์‹œ, Out-of-Order, ์ถ”์ธก ์‹คํ–‰, ์Šˆํผ์Šค์นผ๋ผ ๊ฐ™์€ ์žฅ์น˜๋“ค๋„ ๊ฒฐ๊ตญ์€ ํ•œ ๊ฐ€์ง€ ๋ชฉ์ ์„ ํ–ฅํ•œ๋‹ค.
CPU๊ฐ€ ๋†€์ง€ ์•Š๊ฒŒ ํ•˜๊ณ , ๋ง‰ํžˆ๋Š” ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๋ ค๋Š” ๊ฒƒ.

 

์ง€๊ธˆ๊นŒ์ง€ “์–ด๋–ป๊ฒŒ ํ•˜๋ฉด CPU๋ฅผ ๋” ์ž˜ ์“ธ๊นŒ?”๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ •๋ฆฌํ–ˆ์ง€๋งŒ, ์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ์ฃผ์˜ํ•  ์ ์ด ์žˆ๋‹ค.


Apple์ด ๋งํ•˜๋“ฏ ํ˜„๋Œ€ CPU๋Š” ์ด๋ฏธ ๋ช…๋ น์–ด ํ๋ฆ„์„ ๊ทน๋Œ€ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ์ตœ์ ํ™”๋ฅผ ๋‚ด๋ถ€์—์„œ ์ˆ˜ํ–‰ํ•œ๋‹ค.
๊ทธ๋Ÿผ์—๋„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์šฐ๋ฆฌ๋Š” CPU๊ฐ€ ์–ด๋–ป๊ฒŒ ๋Œ์•„๊ฐ€๊ณ  ์–ด๋””์—์„œ ๋ณ‘๋ชฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฏธ๋ฆฌ ์•Œ๊ณ  ํ•™์Šตํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

๋‹ค๋งŒ ์‹ค์ „์—์„œ ๋” ์ž์ฃผ, ๋” ํฌ๊ฒŒ ๋ฐœ๋ชฉ์„ ์žก๋Š” ๊ฑด CPU “๋‚ด๋ถ€”๊ฐ€ ์•„๋‹ˆ๋ผ ์šฐ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋งŒ๋“  ์˜ค๋ฒ„ํ—ค๋“œ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.
๋น„ํšจ์œจ์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์ค‘๋ณต ์—ฐ์‚ฐ, ๋ถˆํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๊ณผ ๋ณต์‚ฌ ๊ฐ™์€ ๊ฒƒ๋“ค์€ CPU๊ฐ€ ์•„๋ฌด๋ฆฌ ๋˜‘๋˜‘ํ•ด๋„ ๋Œ€์‹  ํ•ด๊ฒฐํ•ด์ฃผ์ง€ ๋ชปํ•œ๋‹ค.
๊ทธ๋ž˜์„œ CPU ๋ณ‘๋ชฉ์„ ๊นŠ๊ฒŒ ํŒŒ๊ณ ๋“œ๋Š” ๊ฑด, ์ด๋Ÿฐ ๋‚ญ๋น„๋ฅผ ๋จผ์ € ์ œ๊ฑฐํ•œ ๋’ค์— ํ•ด๋„ ๋Šฆ์ง€ ์•Š๋‹ค.

 

๊ฒฐ๊ตญ ๊ฐ€์žฅ ํ™•์‹คํ•œ ์ตœ์ ํ™”๋Š” ์ด ํ•œ ์ค„๋กœ ์ •๋ฆฌ๋œ๋‹ค.
“๋‚ด ์ฝ”๋“œ๊ฐ€ CPU์—๊ฒŒ ์“ธ๋ฐ์—†๋Š” ์ผ์„ ์‹œํ‚ค๊ณ  ์žˆ์ง€ ์•Š์€์ง€”๋ถ€ํ„ฐ ์ •๋ฆฌํ•˜์ž.



์•„๋ž˜๋Š” ๋‚ด๊ฐ€ ํ•ด๋‹น ๋‚ด์šฉ์„ ํ•™์Šตํ•˜๊ธฐ ์œ„ํ•ด GPT์™€ ์—ด์‹ฌํžˆ ์”จ๋ฆ„ํ•œ ๋‚ด์šฉ์ด๋‹ค. 

Chat GPT