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

A Yeon JangΒ·2025λ…„ 8μ›” 8일
post-thumbnail

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

πŸ’­ ν”„λ‘œκ·Έλž¨μ˜ μ΅œμ ν™”λŠ” 무엇을 μœ„ν•œ 것인가?

ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ΄ ν”„λ‘œκ·Έλž¨μ„ λ‹¨μˆœνžˆ 'μž‘μ„±'만 ν•œλ‹€λ©΄ λͺ¨λ“  μ‚¬λžŒλ“€μ΄ λ§Œμ‘±ν•  수 μžˆλŠ”κ°€?
에 λŒ€ν•΄ 생각해본닀면 λ‹Ήμ—°νžˆ 닡은 μ•„λ‹ˆλ‹€ :
μ‚¬μš©μžλŠ” μ •ν™•ν•˜κ³  λΉ λ₯Έ μ†Œν”„νŠΈμ›¨μ–΄λ₯Ό κΈ°λŒ€ν•œλ‹€.
응닡이 1μ΄ˆκ°€ 3초둜만 λŠ˜μ–΄λ‚˜λ„ μ΄νƒˆλ₯ μ΄ νŠ„λ‹€.
μŠ¬λž™μ—μ„œ 보낸 농담 λ©”μ‹œμ§€κ°€ λ‚΄ νŒ€μ›μ΄ μ•„λ‹ˆλΌ μ½”μΉ˜λ‹˜κ»˜ κ°€λŠ” λ²„κ·Έμ²˜λŸΌ, 느림과 였λ₯˜λ‘œ 인해
아무도 ν•΄λ‹Ή ν”„λ‘œκ·Έλž¨μ„ μ‚¬μš©ν•˜μ§€ μ•Šμ„ 것이닀.

λ”°λΌμ„œ μš°λ¦¬λŠ” λͺ¨λ“  합리적 ν™˜κ²½μ—μ„œ μ •ν™•μ„±κ³Ό 속도λ₯Ό λ™μ‹œμ— 달성해야 ν•œλ‹€.
이λ₯Ό μœ„ν•΄ 무엇을 μΈ‘μ •ν•˜κ³ , μ–΄λ””λ₯Ό 쀄이며,
μ–΄λ–€ μˆœμ„œλ‘œ κ°œμ„ ν• μ§€ 체계적인 μ΅œμ ν™” 방법을 μ‚΄νŽ΄λ³΄λ €κ³  ν•œλ‹€.

πŸ’Š 효율적인 ν”„λ‘œκ·Έλž¨μ„ μœ„ν•œ λ°©μ•ˆ

πŸ’» 효율적인 ν”„λ‘œκ·Έλž¨μ˜ μž‘μ„±

첫째, μ μ ˆν•œ μ•Œκ³ λ¦¬μ¦˜κ³Ό 자료ꡬ쑰λ₯Ό μ„ νƒν•œλ‹€.

λ‘˜μ§Έ, μ»΄νŒŒμΌλŸ¬κ°€ 효과적으둜 μ΅œμ ν™”ν•΄μ„œ 효율적인 μ‹€ν–‰μ½”λ“œλ‘œ λ°”κΏ€ 수 μžˆλŠ” μ†ŒμŠ€μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€.

  • 이 μ΅œμ ν™” 컴파일러의 λŠ₯λ ₯κ³Ό ν•œκ³„λ₯Ό 이해해야 ν•œλ‹€.

πŸ’­ ν”„λ‘œκ·Έλž˜λ¨Έλ“€μ˜ κ³ λ―Ό

첫째, μ–΄λ–»κ²Œ μ½”λ“œκ°€ μ‚¬μš©λ˜κ³  μ–΄λ–€ 결정적인 μš”μ†Œλ“€μ΄ 영ν–₯을 λΌμΉ˜λŠ”κ°€λ₯Ό κ³ λ €ν•΄μ•Ό ν•œλ‹€.

λ‘˜μ§Έ, μ–΄λ–»κ²Œ ν•˜λ©΄ κ΅¬ν˜„κ³Ό μœ μ§€λ₯Ό μ‰½κ²Œν•  μ§€, λ™μ‹œμ— μ–΄λ–»κ²Œ 더 빨리 돌릴 수 μžˆμ„μ§€ μ‚¬μ΄μ—μ„œ νƒ€ν˜‘ν•΄μ•Ό ν•œλ‹€.

β˜‘οΈ 컴파일러의 이용

첫째, μ½”λ“œκ°€ μˆ˜ν–‰ν•΄μ•Ό ν•˜λŠ” μž‘μ—…μ„ 효율적으둜 μˆ˜ν–‰ν•˜λ„λ‘ λΆˆν•„μš”ν•œ μž‘μ—…μ„ μ œκ±°ν•΄μ•Ό ν•œλ‹€.

  • λΆˆν•„μš”ν•œ ν•¨μˆ˜ 호좜, 쑰건 ν…ŒμŠ€νŠΈ, λ©”λͺ¨λ¦¬ μ°Έμ‘° λ“±

λ‘˜μ§Έ, μ»΄νŒŒμΌλŸ¬λŠ” κ³„μ†ν•΄μ„œ λŠ₯λ ₯이 κ°±μ‹ λ˜κ³  κ°œμ„ λ˜λ―€λ‘œ μ»΄νŒŒμΌλŸ¬κ°€ 효율적인 μ½”λ“œλ₯Ό 생성할 수 μžˆλŠ” μ •λ„μ˜ μ΅œμ†Œν•œμ˜ μˆ˜μ •λ§Œ ν•œλ‹€.

μ΅œμ ν™” 컴파일러의 λŠ₯λ ₯κ³Ό ν•œκ³„

πŸ€– ν˜„λŒ€ 컴파일러의 λŠ₯λ ₯

  • λͺ©ν‘œ: λΆˆν•„μš”ν•œ 연산을 μ œκ±°ν•˜κ³ , 계산을 λ‹¨μˆœν™”ν•˜λ©°, μ—°μ‚° λΉˆλ„λ₯Ό 쀄여 μ„±λŠ₯ ν–₯상
  • μ΅œμ ν™” μˆ˜μ€€: -Og(κΈ°λ³Έ), -O1, -O2, -O3둜 갈수둝 곡격적인 μ΅œμ ν™” μˆ˜ν–‰

⚠️ μ΅œμ ν™” μˆ˜μ€€μ—μ„œ λ°œμƒν•  수 μžˆλŠ” 문제

μ΅œμ ν™” μˆ˜μ€€μ΄ λ†’μœΌλ©΄ 훨씬 μš°μˆ˜ν•œ Cμ–Έμ–΄λ₯Ό μž‘μ„±ν•˜κ³ , μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆλ‹€.
λ‹€λ§Œ 디버그가 μ–΄λ €μ›Œμ§„λ‹€.

**μ΅œμ ν™” μˆ˜μ€€μ΄ λ†’λ‹€ = μ €μˆ˜μ€€ 언어에 가깝닀**

λ””λ²„κ±°λŠ” 기계가 μ•„λ‹Œ μ‚¬λžŒμ˜ μž…μž₯μ—μ„œ ν”„λ‘œκ·Έλž¨μ„ κ΄€μ°°ν•˜κΈ° μœ„ν•œ λ²ˆμ—­κΈ°μ΄λ‹€.
즉, μ΅œμ ν™” μˆ˜μ€€μ΄ λ†’μ•„μ§„λ‹€λ©΄ μ›λž˜μ˜ μ†ŒμŠ€μ½”λ“œμ™€ λ³€ν™”κ°€ λ§Žμ•„μ§€κΈ° λ•Œλ¬Έμ— λ§€ν•‘ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ΄λ‹€.


ν•˜μ§€λ§Œ μ΅œμ ν™” μ˜΅μ…˜μ„ 아무리 μ λ‹Ήν•˜κ²Œ 높인닀고 해도, λͺ¨λ“  μƒν™©μ—μ„œ 졜고의 μ„±λŠ₯을 보μž₯ν•˜μ§„ μ•ŠλŠ”λ‹€.
μ½”λ“œ κ΅¬μ‘°λ‚˜ 데이터 μ ‘κ·Ό 방식에 따라 μ»΄νŒŒμΌλŸ¬κ°€ μ μš©ν•  수 μžˆλŠ” μ΅œμ ν™”μ— ν•œκ³„κ°€ 있기 λ•Œλ¬Έμ΄λ‹€.
μ΄λŸ¬ν•œ ν•œκ³„λ₯Ό λ§Œλ“œλŠ” λŒ€ν‘œμ μΈ μš”μΈλ“€μ΄ λ°”λ‘œ λ‹€μŒκ³Ό κ°™λ‹€.

😈 μ΅œμ ν™”λ₯Ό λ°©ν•΄ν•˜λŠ” μ΅œμ ν™” μž₯μ• λ¬Ό

  1. λ©”λͺ¨λ¦¬ 별칭: 포인터 κ°„μ˜ 관계λ₯Ό ν™•μ •ν•˜κΈ° μ–΄λ ΅κΈ° λ•Œλ¬Έμ— 보수적으둜 μ²˜λ¦¬ν•  수 μžˆλ‹€.

    • 두 포인터가 같은 λ©”λͺ¨λ¦¬λ₯Ό κ°€λ¦¬ν‚€λŠ” 문제둜 μΈν•΄μ„œ μ •ν™•ν•œ 값이 λ“€μ–΄κ°€μ§€ μ•ŠλŠ” μ΅œμ•…μ„ ν•œλ²ˆ 더 κ³ λ €ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— μ„œλ‘œ λ‹€λ₯Έ 포인터라고 해도 같은 μœ„μΉ˜λ₯Ό 가리킨닀고 κ°€μ •ν•œλ‹€.
  2. ν•¨μˆ˜ 호좜: 호좜 μ˜€λ²„ν—€λ“œμ™€ μ™ΈλΆ€ 영ν–₯(μ „μ—­ λ³€μˆ˜ λ³€κ²½ λ“±) λ•Œλ¬Έμ— μ΅œμ ν™”κ°€ μ œν•œλ  수 μžˆλ‹€.

    • λΆ€μž‘μš©(Side Effect) 으둜 ν•¨μˆ˜κ°€ μ™ΈλΆ€ μƒνƒœλ₯Ό λ³€κ²½ν•˜λ©΄ λͺ…λ Ή μˆœμ„œ 변경이 λΆˆκ°€λŠ₯.

πŸ’¬ ν”„λ‘œκ·Έλž¨ μ„±λŠ₯의 ν‘œν˜„

κ·Έλ ‡λ‹€λ©΄ μ΅œμ ν™”λ₯Ό 잘 ν™œμš©ν•˜λ €λ©΄ 이제 λ‹¨μˆœνžˆ 컴파일러 μ˜΅μ…˜μ—λ§Œ μ˜μ‘΄ν•˜λŠ” 것이 μ•„λ‹ˆλΌ ν˜„μž¬ μ½”λ“œκ°€ μ–΄λŠ λΆ€λΆ„μ—μ„œ 병λͺ©μ΄ λ°œμƒν•˜λŠ”μ§€λ₯Ό νŒŒμ•…ν•˜κ³ , 이λ₯Ό 수치둜 ν‘œν˜„ν•΄ λΆ„μ„ν•˜λŠ” 과정이 ν•„μš”ν•˜λ‹€.
이 과정이 μžˆμ–΄μ•Ό μ½”λ“œ ꡬ쑰 λ³€κ²½μ΄λ‚˜ μ•Œκ³ λ¦¬μ¦˜ κ°œμ„ μ΄ μ‹€μ œ μ„±λŠ₯ ν–₯μƒμœΌλ‘œ μ΄μ–΄μ‘ŒλŠ”μ§€ κ°κ΄€μ μœΌλ‘œ 확인할 수 μžˆλ‹€. μ΄λŸ¬ν•œ μ„±λŠ₯ λΆ„μ„μ—λŠ” λ‹€μ–‘ν•œ μ§€ν‘œκ°€ μ‚¬μš©λ˜λŠ”λ°, ν•˜λ‚˜μ˜ μ˜ˆμ‹œκ°€ λ°”λ‘œ CPE이닀.

πŸ₯š CPE (Cycles Per Element)

: 데이터 1개λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 ν•„μš”ν•œ 평균 CPU 사이클 수둜 μš”μ†Œλ‹Ή μΈ‘μ • 사이클이라고도 ν•œλ‹€.

  • μΈ‘μ • 이유: ν•˜λ“œμ›¨μ–΄λ§ˆλ‹€ μ„±λŠ₯에 λ”°λ₯Έ μ‹œκ°„(ns) 차이가 μžˆμœΌλ―€λ‘œ, 사이클 λ‹¨μœ„κ°€ 비ꡐ에 더 적합
  • 루프 μ „κ°œ(Loop Unrolling)λ₯Ό ν™œμš©ν•˜λ©΄ 반볡 횟수λ₯Ό 쀄이고 CPE κ°μ†Œ κ°€λŠ₯.
// κΈ°λ³Έ 루프
void psum1(float a[], float p[], long n) {
    p[0] = a[0];
    for (long i = 1; i < n; i++)
        p[i] = p[i-1] + a[i]; //ν•œλ²ˆμ˜ λ°˜λ³΅λ¬Έμ— 1개의 μ›μ†Œλ§Œ 처리
}

// 루프 μ „κ°œ 적용
void psum2(float a[], float p[], long n) {
    p[0] = a[0];
    for (long i = 1; i < n-1; i += 2) {
        float mid = p[i-1] + a[i];
        p[i] = mid;
        p[i+1] = mid + a[i+1]; //ν•œλ²ˆμ˜ λ°˜λ³΅λ¬Έμ— 2개의 μ›μ†Œ 처리
    }
}
  • psum1: CPE β‰ˆ 9.0
  • psum2: CPE β‰ˆ 6.0 β†’ μ„±λŠ₯ ν–₯상이 된 것을 확인 ν•  수 μžˆλ‹€.

μœ„μ˜ μ½”λ“œμ—μ„œ λ³Ό 수 μžˆλŠ” κ²ƒμ²˜λŸΌ
1. 반볡문 μ•ˆμ— μž‘μ—…μ΄ 1개인 κ²½μš°λŠ” μš”μ†Œλ‹Ή μ‚¬μ΄ν΄μ˜ μˆ˜μ™€ λ°˜λ³΅λ‹Ή μ‚¬μ΄ν΄μ˜ μˆ˜κ°€ κ°™λ‹€.
2. 반볡문 μ•ˆμ— μ—¬λŸ¬κ°œμ˜ μž‘μ—…μ΄ μžˆλŠ” 경우 μš”μ†Œλ‹Ή μ‚¬μ΄ν΄μ˜ μˆ˜λŠ” λ°˜λ³΅λ‹Ή μ‚¬μ΄ν΄μ˜ μˆ˜λ³΄λ‹€ 더 μž‘λ‹€.

즉, μš°λ¦¬κ°€ κΆκΈˆν•œκ±΄ 데이터 1개λ₯Ό μ²˜λ¦¬ν•˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ΄λ―€λ‘œ
루프 μ „κ°œμ‹œ μ„±λŠ₯차이λ₯Ό 확인할 수 μžˆλŠ” CPEλ₯Ό ν™•μΈν•˜λŠ” 것이 더 쒋은 것이닀.


πŸ§ͺ ν”„λ‘œκ·Έλž¨ 예제

μ•„λž˜ μ˜ˆμ œλŠ” μ§€κΈˆκΉŒμ§€ 배운 μ΅œμ ν™” 기법 적용 μ „Β·ν›„μ˜ μ„±λŠ₯ 차이λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•œ κΈ°μ € μ½”λ“œμ΄λ‹€.
ν˜„μž¬ μƒνƒœμ—μ„œλŠ” μ½”λ“œ ꡬ쑰상 λΆˆν•„μš”ν•œ ν•¨μˆ˜ 호좜과 λ©”λͺ¨λ¦¬ 접근이 ν¬ν•¨λ˜μ–΄ μžˆμ–΄,
μ»΄νŒŒμΌλŸ¬κ°€ μΆ©λΆ„νžˆ μ΅œμ ν™”ν•˜μ§€ λͺ»ν•œλ‹€.

πŸ”Ά 벑터 좔상 μžλ£Œν˜•

int get_vec_element(vec_ptr v, long index, data_t *dest)
{
	if (index < 0 || index >= v->len)
		return 0;
	*dest = v->data[index];
	return 1;
 }
  • if (index < 0 || index >= v->len) : μ•ˆμ „ν•œ μž₯μΉ˜μ΄κΈ°λŠ” ν•˜λ‚˜ 맀번 인덱슀 검사λ₯Ό ν•˜κΈ° λ•Œλ¬Έμ— ν•¨μˆ˜ 호좜 μ˜€λ²„ν—€λ“œλ₯Ό λ°œμƒμ‹œν‚€κ³  μžˆλ‹€.

πŸ”Ά κ²°ν•© μ—°μ‚° μ˜ˆμ‹œ

void combine1(vec_ptr v, data_t *dest) {
    *dest = IDENT;
    for (long i = 0; i < vec_length(v); i++) {
        data_t val;
        get_vec_element(v, i, &val);
        *dest = *dest OP val;
    }
}
  • vec_length() : 벑터 길이가 λ³€ν•  일이 μ—†λŠ”λ° 맀번 길이λ₯Ό κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•¨μœΌλ‘œμ¨,
    ν•¨μˆ˜ν˜ΈμΆœμ˜€λ²„ν—€λ“œ 및 λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ 접근을 λ°œμƒμ‹œν‚€κ³  μžˆλ‹€.

  • *dest = *dest OP val; : 맀번 λ©”λͺ¨λ¦¬μ—μ„œ ν•΄λ‹Ή λ³€μˆ˜μ˜ μœ„μΉ˜λ₯Ό 읽고 맀번 λ‹€μ‹œ μ“°λ©΄μ„œ
    λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ 접근을 λ°œμƒμ‹œν‚€κ³  μžˆλ‹€.


⁉️ λ‹€μŒμ€?

이처럼 λ‹¨μˆœν•œ 좔상 μžλ£Œν˜• 기반 κ΅¬ν˜„μ—μ„œλ„,
μž‘μ€ 섀계 선택듀이 ν•¨μˆ˜ 호좜 μ˜€λ²„ν—€λ“œμ™€ λΆˆν•„μš”ν•œ λ©”λͺ¨λ¦¬ 접근을 λ§Œλ“€ 수 μžˆλ‹€.
λ‹€μŒ κΈ€μ—μ„œλΆ€ν„° 이 κΈ°μ € μ½”λ“œλ₯Ό λ°”νƒ•μœΌλ‘œ ꡬ체적인 μ΅œμ ν™” 기법을 μ μš©ν•˜κ³ ,
CPE와 같은 μ§€ν‘œλ‘œ μ„±λŠ₯ ν–₯상을 μΈ‘μ •ν•˜λŠ” 과정을 μ‚΄νŽ΄λ³΄λ €κ³  ν•œλ‹€.

0개의 λŒ“κΈ€