πŸͺœ Computer System : 5. ν”„λ‘œμ„Έμ„œ ꡬ쑰_part2

A Yeon JangΒ·2025λ…„ 8μ›” 12일

⁉️ μ§€λ‚œλ²ˆμ—λŠ”

λ‹¨μˆœν•œ 좔상 μžλ£Œν˜• 기반 κ΅¬ν˜„μ—μ„œλ„,
μž‘μ€ 섀계 선택듀이 ν•¨μˆ˜ 호좜 μ˜€λ²„ν—€λ“œμ™€ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ 접근을 λ§Œλ“€ 수 있기 λ•Œλ¬Έμ—
μ΅œμ ν™”κ°€ ν•„μš”ν•˜λ‹€λŠ” 사싀을 μ•Œκ²Œλ˜μ—ˆκ³ ,
μ΄λ²ˆμ—λŠ” κ·ΈλŸ¬ν•œ μ΅œμ ν™” ν•˜λŠ” 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄λ €κ³  ν•œλ‹€.

πŸ› οΈ ν”„λ‘œκ·Έλž¨ μ„±λŠ₯ μ΅œμ ν™”

πŸ”„ 루프 λΉ„νš¨μœ¨μ„± μ œκ±°ν•˜κΈ°

πŸ“Œ 루프 λΉ„νš¨μœ¨μ„±μ΄λž€?

루프 μ•ˆμ—μ„œ λΆˆν•„μš”ν•˜κ²Œ λ°˜λ³΅λ˜λŠ” μ—°μ‚°, λ©”λͺ¨λ¦¬ μ ‘κ·Ό, ν•¨μˆ˜ 호좜둜 μΈν•˜μ—¬
ν”„λ‘œκ·Έλž¨μ˜ μ„±λŠ₯이 λ–¨μ–΄μ§€λŠ” ν˜•μƒμ„ λ§ν•œλ‹€.
λ‹¨κ³„λ³„λ‘œ μ΅œμ ν™”λ₯Ό μ§„ν–‰ν•΄λ³΄μž.


πŸ’‘ process 1

for (i = 0; i < vec_length(v); i++) {
    data_t val;
    get_vec_element(v, i, &val);
    *dest = *dest OP val;
}

🚨 problem

for (i = 0; i < **vec_length(v)**; i++)
ν…ŒμŠ€νŠΈ 쑰건이 λ£¨ν”„μ˜ λ§€ μ‹€ν–‰λ§ˆλ‹€ ν‰κ°€λ˜μ–΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ—
ν•¨μˆ˜ 호좜 μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•  κ°€λŠ₯성이 μžˆλ‹€.

πŸ’¬ solution

long length = vec_length(v)
for (i = 0; i < length; i++) {
    data_t val;
    get_vec_element(v, i, &val);
    *dest = *dest OP val;
}

long length = vec_length(v)
λ²‘ν„°μ˜ κΈΈμ΄λŠ” λ³€ν•˜μ§€ μ•ŠμœΌλ―€λ‘œ 루프 λ°–μ—μ„œ ν•œλ²ˆλ§Œ κ³„μ‚°ν•˜κ³  이λ₯Ό μ΄μš©ν•œλ‹€.
μ—¬λŸ¬ 번 μˆ˜ν–‰ν•˜μ§€λ§Œ 계산 κ²°κ³Όκ°€ λ³€ν•˜μ§€ μ•ŠλŠ” μ½”λ“œλ₯Ό μ°Ύμ•„λ‚΄μ„œ
루프 λ°–μœΌλ‘œ λΉΌλŠ” μ΅œμ ν™” 방법을
'μ½”λ“œ 이동(Code Motion)' 이라고 ν•œλ‹€.

βœ… result


πŸ’‘ process 1-2

λ‹€μŒμ€ 또 λ‹€λ₯Έ 루프 λΉ„νš¨μœ¨μ„± 문제의 μ˜ˆμ‹œμ΄λ‹€.

void lower1(char *s){
   long i;
   for (i = 0; i < strlen(s); i++)
     if (s[i] >= ’A’ && s[i] <= ’Z’)
   s[i] -= (’A’ - ’a’);}
}

🚨 problem

for (i = 0; i < **strlen(s)**; i++)
strlen(s)λŠ” 널 문자('\0')λ₯Ό λ§Œλ‚  λ•ŒκΉŒμ§€ μ „λΆ€ μŠ€μΊ” β†’ O(n)
λ£¨ν”„λŠ” n번 λ°˜λ³΅λ˜λ―€λ‘œ, 전체 μ‹œκ°„μ€ O(nΒ²) 둜 증가
즉, λ¬Έμžμ—΄μ˜ 길이가 2λ°°κ°€ 되면 전체 μ‹œκ°„μ€ 4배둜 증가

πŸ’¬ solution

long i;
  long len = vec_length(v);

  *dest = IDENT;
  for (i = 0; i < length; i++) ...
  • μ΅œμ ν™” μ»΄νŒŒμΌλŸ¬λ„ λΆ€μž‘μš©(side effect) κ°€λŠ₯성을 μ™„μ „νžˆ 배제 λͺ» ν•˜λ©΄
    이런 ν˜ΈμΆœμ„ μžλ™ μ΄λ™ν•˜μ§€ λͺ»ν•  수 있음 β†’ ν”„λ‘œκ·Έλž˜λ¨Έκ°€ 직접 μ½”λ“œ 이동 ν•„μš”
  • 루프 λΆˆλ³€μ‹ 이동(Code Motion): vec_length(v) κ²°κ³Όλ₯Ό ν•œ 번만 계산해 len에 μ €μž₯
  • λ£¨ν”„λŠ” 더 이상 O(nΒ²)κ°€ μ•„λ‹ˆλΌ O(n)

βœ… result

πŸ’­ λ†“μΉ˜κΈ° μ‰¬μš΄ λΆ€λΆ„

이 μ˜ˆμ‹œλŠ” ν”„λ‘œκ·Έλž¨ μž‘μ„±μ—μ„œ ν”νžˆ λ°œμƒν•˜λŠ” 문제λ₯Ό λ³΄μ—¬μ£ΌλŠ”λ° 겉보기엔 μ‚¬μ†Œν•œ μ½”λ“œ ν•œ 쀄이
μˆ¨κ²¨μ§„ 점근적 λΉ„νš¨μœ¨μ„±(asymptotic inefficiency) 을 κ°€μ§ˆ 수 μžˆλ‹€λŠ” 것이닀.
예λ₯Ό λ“€μ–΄, μ†Œλ¬Έμž λ³€ν™˜(lowercase) ν•¨μˆ˜κ°€ ν”„λ‘œκ·Έλž¨ μ„±λŠ₯의 병λͺ©μ΄ 될 κ±°λΌκ³ λŠ” 보톡 μƒκ°ν•˜μ§€ μ•ŠλŠ”λ‹€.
ν•˜μ§€λ§Œ μ‹€μ œ 배포 ν›„μ—λŠ” 이 ν•¨μˆ˜κ°€ 백만 κΈ€μž μ΄μƒμ˜ λ¬Έμžμ—΄μ—λ„ 적용될 수 μžˆλ‹€.
그러면 이 β€œλ¬΄ν•΄ν•΄ λ³΄μ΄λ˜β€ μ½”λ“œκ°€ μˆœμ‹κ°„μ— μ‹¬κ°ν•œ μ„±λŠ₯ 병λͺ©μ΄ λœλ‹€.

μˆ™λ ¨λœ ν”„λ‘œκ·Έλž˜λ¨Έμ˜ μ—­ν•  쀑 ν•˜λ‚˜λŠ” 이런 점근적 λΉ„νš¨μœ¨μ„±μ„ μ•„μ˜ˆ μ½”λ“œμ— λ„£μ§€ μ•ŠλŠ” 것이닀.


πŸ“ž ν”„λ‘œμ‹œμ € 호좜 쀄이기

πŸ“Œ ν”„λ‘œμ‹œμ € 호좜 λΉ„μš©μ΄λž€?

루프 μ•ˆμ—μ„œ 맀번 ν•¨μˆ˜ 호좜이 μΌμ–΄λ‚˜λ©΄,
ν•¨μˆ˜ 호좜 μ€€λΉ„(인자 전달, λ ˆμ§€μŠ€ν„° μ €μž₯), 호좜 ν›„ 볡귀 μ‹œ λ ˆμ§€μŠ€ν„° 볡원 및 정리 와 같은 μ˜€λ²„ν—€λ“œκ°€ λˆ„μ λœλ‹€.
특히 짧은 μ—°μ‚°μ΄μ§€λ§Œ 호좜이 λΉˆλ²ˆν•˜λ©΄ 전체 μ„±λŠ₯을 크게 μ €ν•˜μ‹œν‚¬ 수 μžˆλ‹€.

πŸ’‘ process 2

void combine2(vec_ptr v, data_t *dest)
{
  long i;
  long length = vec_length(v);

  *dest = IDENT;
  for (i = 0; i < length; i++) {
    data_t val;
    get_vec_element(v, i, &val);
    *dest = *dest OP val;
    }
   }

🚨 problem

get_vec_element(v, i, &val)
get_vec_element λŠ” 맀번 λ‹€μŒ 벑터 μ›μ†Œλ₯Ό κ°€μ Έμ˜€κΈ° μœ„ν•΄ λ§€ 루프 μ‹€ν–‰λ§ˆλ‹€ ν•¨μˆ˜ 호좜
λ˜ν•œ, 맀번 벑터λ₯Ό μ°Έμ‘°ν•  λ•Œλ§ˆλ‹€ 경계값을 μ²΄ν¬ν•˜λŠ” λΉ„νš¨μœ¨μ μΈ λ™μž‘

πŸ’¬ solution

  • λ‚΄λΆ€ λ£¨ν”„μ—μ„œ ν•¨μˆ˜ 호좜 μ‚¬μš©ν•˜μ§€ μ•Šκ³  μ‹œμž‘ μ£Όμ†Œλ₯Ό ν•œλ²ˆλ§Œ μ‘°μ‚¬ν•˜μž
  • ν”„λ‘œμ‹œμ € 호좜 쀄이기: μ‹œμž‘ μ£Όμ†Œ 계산을 ν•œ 번만 계산해 *data에 μ €μž₯

βœ… result

πŸ€” μ„±λŠ₯ κ°œμ„ 

λ†€λžκ²Œλ„ μ„±λŠ₯ κ°œμ„ μ€ 거의 이루어지지 μ•Šμ•˜λ‹€.

μ‹€μ œλ‘œλŠ” μ •μˆ˜ 연산에 λŒ€ν•œ 클럭 사이클은 더 κΈΈμ–΄μ‘Œλ‹€.
μ΄λŠ” μš°λ¦¬κ°€ μ΅œμ ν™”ν•œ λΆ€λΆ„ μ΄μ™Έμ—μ„œ μ„±λŠ₯을 μ œμ•½ν•˜λŠ” 병λͺ©μ„ ν˜•μ„±ν•˜κ³  μžˆλ‹€λŠ” 말이닀.
이외에도 원인은 바뀐 ꡬ쑰둜 μΈν•œ νŒŒμ΄ν”„λΌμΈ λ³€κ²½, λ˜λŠ” 컴파일러의 보수적인 ν•΄κ²° 방식 등도 μžˆμ„ 수 μžˆλ‹€.


πŸ—‘οΈ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ μ°Έμ‘° 제거

πŸ“Œ λ©”λͺ¨λ¦¬ μ°Έμ‘° λΉ„μš©μ΄λž€?

λ©”λͺ¨λ¦¬ 접근은 CPU λ ˆμ§€μŠ€ν„° 연산에 λΉ„ν•΄ 배우 느리고, 같은 값을 μ—¬λŸ¬ 번 μ°Έμ‘°ν•˜λŠ” 경우,
λ©”λͺ¨λ¦¬μ—μ„œ μ½μ—ˆμ„λ•Œ μ €μž₯ν•΄ 두지 μ•ŠλŠ”λ‹€λ©΄ κ³„μ†ν•΄μ„œ 읽어야 ν•œλ‹€.
특히 μ΄λŸ¬ν•œ 연산이 아무리 짧은 연산일지라도 호좜이 λΉˆλ²ˆν•˜λ©΄ 전체 μ„±λŠ₯을 크게 μ €ν•˜μ‹œν‚¬ 수 μžˆλ‹€.

πŸ’‘ process 3

πŸ”„ λͺ…λ Ήμ–΄ 해석

  1. λ©”λͺ¨λ¦¬ (%rbx)에 μ €μž₯λ˜μ–΄ μžˆλŠ” dest μ£Όμ†Œλ₯Ό %xmm0 λ ˆμ§€μŠ€ν„°μ— μ €μž₯ (μ΄ˆκΈ°ν™”)
  2. λ©”λͺ¨λ¦¬ (%rdx)에 μ €μž₯λ˜μ–΄ μžˆλŠ” λ‹€μŒ data값을 %xmm0와 λˆ„μ  μ—°μ‚°ν•˜κ³  %xmmo에 κ°±μ‹ 
  3. %xmm0값을 λ©”λͺ¨λ¦¬ (%rbx)에 μ €μž₯
  4. 포인터 μ΄λ™μœΌλ‘œ rdx μ£Όμ†Œκ°€ λ‹€μŒ data 값을 κ°€λ₯΄ν‚¬ 수 μžˆλ„λ‘ 계산
  5. μ’…λ£Œ 쑰건 확인

🚨 problem

λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ μ ‘κ·Ό

πŸ’¬ solution

  • μ»΄νŒŒμΌλŸ¬κ°€ 루프 μ „κ°œ(Loop Unrolling)와 λ ˆμ§€μŠ€ν„° ν™œμš© μ΅œμ ν™”λ₯Ό μ μš©ν•  수 있게 μ½”λ“œ ꡬ쑰 λ‹¨μˆœν™”
  • λ©”λͺ¨λ¦¬ 접근을 μ΅œμ†Œν™”ν•˜κ³ , CPU λ ˆμ§€μŠ€ν„°μ—μ„œ μ—°μ‚° 처리.

πŸ”„ λͺ…λ Ήμ–΄ 해석

  1. λ©”λͺ¨λ¦¬μ˜ %rdx (= data[i])λ₯Ό μ½μ–΄μ„œ %xmm0(acc)와 κ³±ν•˜κ³  κ²°κ³Όλ₯Ό %xmm0에 μ €μž₯.
  2. 포인터 μ΄λ™μœΌλ‘œ rdx μ£Όμ†Œκ°€ λ‹€μŒ data 값을 κ°€λ₯΄ν‚¬ 수 μžˆλ„λ‘ 계산
  3. μ’…λ£Œ 쑰건 확인

βœ… result

  • λ©”λͺ¨λ¦¬ 왕볡 μ΅œμ†Œν™”

πŸ“ κ²°λ‘ 

μ§€κΈˆκΉŒμ§€λŠ” μ½”λ“œ ꡬ쑰 κ°œμ„ κ³Ό λΆˆν•„μš”ν•œ μ—°μ‚° 제거λ₯Ό 톡해 루프 νš¨μœ¨μ„±μ„ λ†’μ΄λŠ” 방법을 μ‚΄νŽ΄λ³΄μ•˜λ‹€.
ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ μ΅œμ ν™”λŠ” 주둜 언어와 컴파일러 μˆ˜μ€€μ—μ„œ κ°€λŠ₯ν•œ λ²”μœ„μ— κ΅­ν•œλœλ‹€.
더 높은 μ„±λŠ₯ ν–₯상을 μœ„ν•΄μ„œλŠ” ν”„λ‘œμ„Έμ„œ λ‚΄λΆ€ ꡬ쑰(microarchitecture)λ₯Ό κ³ λ €ν•œ μ΅œμ ν™”κ°€ ν•„μš”ν•˜λ‹€.


πŸ”„ ν”„λ‘œμ„Έμ„œ λ‚΄λΆ€ μ΅œμ ν™”

이제 μš°λ¦¬λŠ” μ½”λ“œ 자체의 λ‹¨μˆœν•œ κ°œμ„ μ„ λ„˜μ–΄, ν˜„λŒ€ ν”„λ‘œμ„Έμ„œμ˜ λ™μž‘ 방식을 μ΄ν•΄ν•˜κ³ 
ν”„λ‘œμ„Έμ„œμ˜ 마이크둜ꡬ쑰 즉, ν•˜λΆ€ μ‹œμŠ€ν…œ 섀계λ₯Ό ν™œμš©ν•˜λŠ” μ΅œμ ν™” μ „λž΅μ„ μ‚΄νŽ΄λ³΄λ €κ³  ν•œλ‹€.

ν•˜μ§€λ§Œ 더 높은 μ„±λŠ₯을 μœ„ν•΄μ„œλŠ” λ§ˆμ΄ν¬λ‘œμ•„ν‚€ν…μ²˜(microarchitecture),
즉 ν”„λ‘œμ„Έμ„œκ°€ λͺ…령을 μ‹€ν–‰ν•˜λŠ” ν•˜λΆ€ μ‹œμŠ€ν…œ 섀계λ₯Ό ν™œμš©ν•œ μ΅œμ ν™”κ°€ ν•„μš”ν•˜λ‹€.

λͺ¨λ“  μ„±λŠ₯을 λŒμ–΄λ‚΄κΈ° μœ„ν•΄μ„œλŠ” ν”„λ‘œκ·Έλž¨ 뢄석 + ν•΄λ‹Ή ν”„λ‘œμ„Έμ„œμ— 맞좘 μ½”λ“œ 생성이 ν•„μš”ν•˜λ‹€.
λ‹€λ§Œ, λ²”μš©μ μΈ μ΅œμ ν™” 원칙은 λŒ€λΆ€λΆ„μ˜ 머신에 적용 κ°€λŠ₯ν•˜λ‹€.

πŸ” ν˜„λŒ€ λ§ˆμ΄ν¬λ‘œν”„λ‘œμ„Έμ„œμ˜ νŠΉμ§•

  • μˆ˜λ§Žμ€ νŠΈλžœμ§€μŠ€ν„°λ₯Ό ν•˜λ‚˜μ˜ 칩에 집적 κ°€λŠ₯
  • ν”„λ‘œκ·Έλž¨ μ„±λŠ₯ κ·ΉλŒ€ν™”λ₯Ό μœ„ν•œ λ³΅μž‘ν•œ ν•˜λ“œμ›¨μ–΄ 섀계
  • μ½”λ“œ λ ˆλ²¨μ—μ„œλŠ” λͺ…령이 순차적으둜 μ‹€ν–‰λ˜λŠ” κ²ƒμ²˜λŸΌ λ³΄μž„
  • μ‹€μ œ ν•˜λ“œμ›¨μ–΄μ—μ„œλŠ” μ—¬λŸ¬ λͺ…령이 λ™μ‹œμ— 싀행됨
    β†’ λͺ…λ Ή μˆ˜μ€€ 병렬성(Instruction-Level Parallelism, ILP)

πŸ’‘ 일뢀 μ„€κ³„μ—μ„œλŠ” ν•œ λ²ˆμ— 100개 μ΄μƒμ˜ λͺ…령이 "λΉ„ν–‰ 쀑(in flight)" μƒνƒœμΌ 수 있음.

βœ… μ΅œμ‹  ν”„λ‘œμ„Έμ„œ νŠΉμ§•

1. μΈμŠ€νŠΈλŸ­μ…˜ μˆ˜μ€€ 병렬성

2. 병렬 μ‹€ν–‰μ˜ μ„±λŠ₯ μ œν•œ μš”μΈ(ν•œκ³„)
- Latency Bound (μ§€μ—° ν•œκ³„)
: λͺ…령어듀이 순차적으둜만 μ‹€ν–‰λ˜μ–΄μ•Ό ν•  λ•Œ λ°œμƒ.

  • 예: ν•œ λͺ…λ Ήμ˜ κ²°κ³Όκ°€ λ‹€μŒ λͺ…λ Ήμ˜ μž…λ ₯이 λ˜λŠ” 경우 β†’ μ•žμ˜ 연산이 λλ‚˜μ•Ό λ‹€μŒ μ—°μ‚° μ‹œμž‘ κ°€λŠ₯.
  • 데이터 μ˜μ‘΄μ„±μ΄ 클수둝 병렬 μ‹€ν–‰ 효과 κ°μ†Œ.

- Throughput Bound (μ²˜λ¦¬λŸ‰ ν•œκ³„)

  • CPU의 κΈ°λŠ₯ μœ λ‹› κ°œμˆ˜μ™€ 처리 속도가 ν”„λ‘œκ·Έλž¨ μ„±λŠ₯을 μ œν•œ.
  • λ³‘λ ¬λ‘œ μ‹€ν–‰ν•  수 μžˆλŠ” μ΅œλŒ€ λͺ…λ Ήμ–΄ μˆ˜κ°€ ν•œκ³„μΉ˜μ— λ„λ‹¬ν•˜λ©΄ 즉 CPU의 "순수 계산 μš©λŸ‰" ν•œκ³„μ— λ‹€λ‹€λ₯΄λ©΄ μ„±λŠ₯이 더 이상 μ˜¬λΌκ°€μ§€ μ•ŠλŠ”λ‹€.

πŸ› οΈ 전체 λ™μž‘ (Overall Operation)

ν˜„λŒ€ ν”„λ‘œμ„Έμ„œλŠ” 초슀칼라(Superscalar) + Out-of-Order μ‹€ν–‰ 방식 μ‚¬μš©

  • 초슀칼라: ν•œ 클럭 사이클에 μ—¬λŸ¬ μ—°μ‚° μ‹€ν–‰ κ°€λŠ₯
  • Out-of-Order: λͺ…λ Ή μ‹€ν–‰ μˆœμ„œκ°€ μ½”λ“œ μˆœμ„œμ™€ λ‹€λ₯Ό 수 있음

πŸ“Œ μ£Όμš” ꡬ성

  1. λͺ…λ Ή μ œμ–΄ μœ λ‹›(ICU, Instruction Control Unit)
    • λ©”λͺ¨λ¦¬μ—μ„œ λͺ…령을 읽어와 μ›μ‹œ μ—°μ‚° μ§‘ν•©(primitive operations) 생성
    • λͺ…λ Ή μΊμ‹œ(Instruction Cache) μ‚¬μš© β†’ κ°€μž₯ 많이 μ“°μ΄λŠ” λͺ…λ Ή λΉ λ₯΄κ²Œ μ ‘κ·Ό κ°€λŠ₯
    • λΆ„κΈ° 예츑(Branch Prediction) μ‚¬μš© β†’ λ‹€μŒ λͺ…λ Ή 미리 μ‹€ν–‰
      • 예츑이 맞으면 κ·ΈλŒ€λ‘œ μ§„ν–‰, 틀리면 λ‘€λ°± ν›„ μž¬μ‹€ν–‰
  2. μ‹€ν–‰ μœ λ‹›(EU, Execution Unit)
    • ICUκ°€ μ „λ‹¬ν•œ μ—°μ‚° μ‹€ν–‰
    • μ‚°μˆ  μ—°μ‚°, λ©”λͺ¨λ¦¬ λ‘œλ“œ/μŠ€ν† μ–΄, λΆ„κΈ° μˆ˜ν–‰

βš™οΈ ν˜„λŒ€ ν”„λ‘œμ„Έμ„œμ˜ λͺ…λ Ή μ‹€ν–‰κ³Ό κΈ°λŠ₯ μœ λ‹›

πŸ”Ή λͺ…λ Ή λ””μ½”λ”©κ³Ό 마이크둜-μ—°μ‚° (Micro-operations)

  • x86 κ΅¬ν˜„ μ˜ˆμ‹œ:
    • λ ˆμ§€μŠ€ν„°λ§Œ μ‚¬μš©ν•˜λŠ” λͺ…λ Ή
      예: addq %rax, %rdx β†’ 단일 μ—°μ‚°μœΌλ‘œ λ””μ½”λ”©.
    • λ©”λͺ¨λ¦¬ μ°Έμ‘° 포함 λͺ…λ Ή
      예: addq %rax, 8(%rdx) β†’ 3개의 마이크둜-μ—°μ‚°μœΌλ‘œ 뢄할됨:
      1. load : λ©”λͺ¨λ¦¬μ—μ„œ 값을 μ½μ–΄μ˜΄.
      2. add : 읽은 값을 %rax와 더함.
      3. store : κ²°κ³Όλ₯Ό λ©”λͺ¨λ¦¬μ— μ €μž₯.

πŸ”Ή μ‹€ν–‰ μœ λ‹› (Execution Units, EU)

  • λͺ…령어듀을 λ°›μ•„ μ‹€μ œ 연산을 μˆ˜ν–‰ν•˜λŠ” μž₯치.
  • λ‹€μ–‘ν•œ functional units 둜 ꡬ성 β†’ 각 μœ λ‹›μ΄ νŠΉμ • 연산에 νŠΉν™”.
  • Load/Store μœ λ‹›:
    • Load: λ©”λͺ¨λ¦¬ β†’ λ ˆμ§€μŠ€ν„°, μ£Όμ†Œ 계산 κ°€λŠ₯.
    • Store: λ ˆμ§€μŠ€ν„° β†’ λ©”λͺ¨λ¦¬, μ£Όμ†Œ 계산 κ°€λŠ₯.
    • Load/StoreλŠ” 데이터 μΊμ‹œ μ‚¬μš©.

πŸ”Ή λΆ„κΈ° 예츑 (Branch Prediction)κ³Ό 투기 μ‹€ν–‰ (Speculative Execution)

  • λΆ„κΈ° 예츑: λΆ„κΈ°κ°€ taken / not taken 될지, 그리고 λΆ„κΈ° λͺ©ν‘œ μ£Όμ†Œ 예츑.
  • 투기 μ‹€ν–‰: λΆ„κΈ° κ²°κ³Ό ν™•μ • μ „, 예츑된 경둜의 λͺ…령을 미리 μ‹€ν–‰.
  • 예츑 μ‹€νŒ¨ μ‹œ β†’ 잘λͺ» μ‹€ν–‰λœ κ²°κ³Ό 폐기(Flush), μ˜¬λ°”λ₯Έ 경둜둜 μž¬μ‹œμž‘.
  • misprediction β†’ μ„±λŠ₯ 손싀 λ°œμƒ.

πŸ”Ή κΈ°λŠ₯ μœ λ‹›μ˜ μ—­ν•  (Functional Units)

  • Haswell κΈ°μ€€ 8개의 κΈ°λŠ₯ μœ λ‹›(0~7번) μ˜ˆμ‹œ:
    1. μ •μˆ˜ μ—°μ‚°, λΆ€λ™μ†Œμˆ˜ κ³±μ…ˆ, μ •μˆ˜/뢀동 λ‚˜λˆ—μ…ˆ, λΆ„κΈ°
    2. μ •μˆ˜ μ—°μ‚°, λΆ€λ™μ†Œμˆ˜ λ§μ…ˆ, μ •μˆ˜ κ³±μ…ˆ, λΆ€λ™μ†Œμˆ˜ κ³±μ…ˆ
    3. Load, μ£Όμ†Œ 계산
    4. Load, μ£Όμ†Œ 계산
    5. Store
    6. μ •μˆ˜ μ—°μ‚°
    7. μ •μˆ˜ μ—°μ‚°, λΆ„κΈ°
    8. Store μ£Όμ†Œ 계산

πŸ”Ή λ¦¬νƒ€μ΄μ–΄λ¨ΌνŠΈ μœ λ‹› (Retirement Unit)κ³Ό λ ˆμ§€μŠ€ν„° 파일

  • Retirement Unit:
    • 순차 μ‹€ν–‰μ˜ 의미 보μž₯
    • First-in First-out νμ—μ„œ λͺ…령이 μ™„λ£Œλ  λ•ŒκΉŒμ§€ λŒ€κΈ°
    • λΆ„κΈ° 예츑이 λ§žμ•˜λŠ”μ§€ 확인 ν›„, λͺ…λ Ή retire β†’ λ ˆμ§€μŠ€ν„° μ—…λ°μ΄νŠΈ
  • λ ˆμ§€μŠ€ν„° 파일: μ •μˆ˜, λΆ€λ™μ†Œμˆ˜, SIMD(SSE/AVX) λ ˆμ§€μŠ€ν„° μ €μž₯

πŸ”Ή λ ˆμ§€μŠ€ν„° 리넀이밍 (Register Renaming)

  • λͺ©μ : λͺ…λ Ή κ°„ μ˜€νΌλžœλ“œ μ˜μ‘΄μ„± ν•΄μ†Œ + 데이터 전달 μ΅œμ ν™”
  • κ³Όμ •:
    1. λ ˆμ§€μŠ€ν„° rλ₯Ό κ°±μ‹ ν•˜λŠ” λͺ…λ Ή λ””μ½”λ”© μ‹œ, 고유 νƒœκ·Έ t 생성.
    2. λ§€ν•‘ ν…Œμ΄λΈ”μ— (r, t) μ €μž₯.
    3. 이후 r μ‚¬μš© μ‹œ β†’ νƒœκ·Έ t 기반으둜 μ‹€μ œ κ°’ 좔적.
    4. ν•΄λ‹Ή νƒœκ·Έ κ²°κ³Ό (v, t)κ°€ μƒμ„±λ˜λ©΄, 이λ₯Ό κΈ°λ‹€λ¦¬λŠ” λͺ…령듀이 μ¦‰μ‹œ μ‚¬μš©.
  • μž₯점:
    • 쀑간 κ²°κ³Όλ₯Ό λ©”λͺ¨λ¦¬/λ ˆμ§€μŠ€ν„°μ— μ“°μ§€ μ•Šκ³ λ„ 직접 전달(Forwarding).
    • λŒ€κΈ° 없이 μ—°μ‚° 연속 μˆ˜ν–‰ κ°€λŠ₯.
    • λΆ„κΈ° ν™•μ • 전에도 투기 μ‹€ν–‰ κ°€λŠ₯.

0개의 λŒ“κΈ€