
๋ค์ด๊ฐ๋ฉฐ
๊ณ ์ฑ๋ฅ ์๋น์ค๋ฅผ ์ํ ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ์ค์ ๊ธฐ๋ณธ์ธ Cache(์บ์)์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค. ์บ์๋ CPU ์ฑ๋ฅ์ ๊ทน๋ํ ์ํฌ ์ ์๋ ์ค์ํ ์์์ ๋๋ค. ํ๋ก๊ทธ๋จ์ Cache hit ํ๋ฅ ๋ง ๋์ฌ์ค๋ ๋งค์ฐ ๋นจ๋ผ์ง๊ธฐ ๋๋ฌธ์ Cache Memory์ ์ค์๋๋ ๋๋ค๊ณ ๋ณผ ์ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์บ์ ์ง์ญ์ฑ(Cache Locality)๋ผ๋ ๊ฒ์ '์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ผ๋ง๋ ์์ฃผ / ์ฐ์์ ์ผ๋ก ์ ๊ทผ๋๋๋'์ ๊ด๋ จ๋์ด ์์ต๋๋ค. ์ค๋์ Cache์ ๋ํด ์ฌ์ธต์ ์ผ๋ก ํ์ ํด๋ด ์๋ค.
Cache Memory
ํ๋ก๊ทธ๋จ์ด ์คํ๋๊ณ ํ๋ก์ธ์ค๊ฐ ๋์ด ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ผ์์ ์ด์์ฒด์ ์ ์ํด ์คํ๋ฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ๋ ๋ชจ๋ ์ํํธ์จ์ด ์์ ์ ๋ชจ๋ ํ๋ก๊ทธ๋จ์ด๊ธฐ ๋๋ฌธ์(์ฌ์ง์ด ์ด์์ฒด์ ๋) ํ๋ก๊ทธ๋จ ์๋ ๋ฐฉ์์ ์์๋๋ฉด ์ข์ต๋๋ค. ํ๋ก์ธ์ค๋ CPU์ ์ํด ์์ฑํด๋ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ๋ฌธ์ ๋ CPU์ ๋ฉ๋ชจ๋ฆฌ(RAM)์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋จ์ด์ ธ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ CPU ์ฐ์ฐ์ ๋งค์ฐ ๋น ๋ฆ ๋๋ค. ๊ทธ๋ผ ๋ญ๊ฐ ๋ฌธ์ ์ผ๊น์? CPU๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์ค๋ ๋ถ๋ถ์ด ๋๋ฆฌ๋ค๋ ๊ฒ์ ๋๋ค. CPU์์ ์ฐ์ฐ 1ํ๋ฅผ ์ฒ๋ฆฌํ๋ ์๋๋ฅผ ์ฌ์ดํด์ด๋ผ๊ณ ํ๋๋ฐ, ๋น๊ต์ ์ต๊ทผ์ ์ถ์๋ ํ๋ก์ธ์ค ๊ธฐ์ค์ผ๋ก๋ ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด ์ค๋ ๊ฒ์ 40์ฌ์ดํด ์ด์ ๊ฑธ๋ฆฝ๋๋ค. ์ฆ, RAM์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋๋ง๋ค CPU๋ 40ํ ์ด์์ ์ฐ์ฐํ ์ ์๋ ์๊ฐ์ ์ ํด์ํ๋ก ๋ณด๋ธ๋ค๋ ๋ป์ ๋๋ค.
๋ฐ๋ผ์ CPU๊ฐ๋ฐ์๋ค์ ์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ์บ์(Cache)๋ผ๋ ๊ฒ์ ๋์ ํฉ๋๋ค. ์บ์๋ CPU์ ๊ทผ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ๋๋ค. CPU๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ๊ฐ ์๋ Cache ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ ธ์ค๋ฉด, ์ฝ๊ธฐ ์๋๊ฐ ํ์ ํ๊ฒ ์์นํฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ์ ๋ด์ฉ์ ๋ชจ๋ ์บ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฃ์ผ๋ฉด ์๋ ๊น์? ์บ์์ ํฌ๊ธฐ๋ ํฌ์ง ์์ต๋๋ค. ์๋ฌด๋๋ CPU ์นฉ์ ๋ด๋ถ์ ๋ค์ด๊ฐ๋ค๋ณด๋ CPU์ ์ ์ผ ๊ฐ๊น์ด ์บ์๋ 100KB๋ ๋์ง ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ง ์บ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ์ฝ๊ณ ์ฐ๋ ๊ฒ์ด ํจ์จ์ ์ ๋๋ค. CPU๊ฐ ์ฌ์ฉํ๋ ค๋ ๋ฐ์ดํฐ๊ฐ ์บ์ ๋ฉ๋ชจ๋ฆฌ์ ์์ด์ ์ฆ์ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ ์บ์ ํํธ(Cache hit)๋ผ๊ณ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๊ฐ ์ค๋ ๋ค๋ค๋ณผ ๋ด์ฉ์ด ์บ์ ํํธ ํ๋ฅ ์ ๋์ผ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ฉ๋๋ค.
| ๊ณ์ธต | ์์ | ์ ๊ทผ ์๋(ns) | ๋น๊ณ |
| L1 Cache | Core๋ณ | 0.5 ~ 1 | ๋งค์ฐ ์๊ณ ๋น ๋ฆ |
| L2 Cache | Core๋ณ | 2 ~ 4 | ์ค๊ฐ ํฌ๊ธฐ |
| L3 Cache | ๊ณต์ | 10 ~ 20 | ํฐ ์ฉ๋, ์ฌ๋ฌ ์ฝ์ด๊ฐ ๊ณต์ |
| DRAM | Main Memory | 60 ~ 120 | ์บ์์ ๋นํด ๋งค์ฐ ๋๋ฆผ |
<์บ์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์>

CPU์์ ๋ฉ๋ชจ๋ฆฌ ํ์ ์์๋ L1 ์บ์ -> L2 ์บ์ -> L3 ์บ์ -> ๋ฉ์ธ๋ฉ๋ชจ๋ฆฌ ์์ ๋๋ค. L1 -> L3๋ก ๊ฐ์๋ก ๋๋ฆฌ์ง๋ง ์ฉ๋์ ์ปค์ง๋๋ค.
Cache Locality
์บ์์ ํจ์จ์ ๋ฐ์ดํฐ๊ฐ ์ผ๋ง๋ ์์ฃผ ์ ๊ทผ๋๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ด๋ฅผ ์ง์ญ์ฑ์ด๋ผ๊ณ ๋ถ๋ฅด๋๋ฐ, ์ฝ๊ฒ ์๊ธฐํ๋ฉด ์บ์ ํํธ ํ๋ฅ ์ ๊ด๋ จ๋ ์ฉ์ด์ ๋๋ค. ์บ์ ์ง์ญ์ฑ์ ์๊ฐ ์ง์ญ์ฑ๊ณผ ๊ณต๊ฐ ์ง์ญ์ฑ์ผ๋ก ๋๋ฉ๋๋ค.
์๊ฐ ์ง์ญ์ฑ(Temporal Locality)
ํ ๋ฒ ์ฐธ์กฐ๋ ์ฃผ์์ ๋ด์ฉ์ ๊ณง ๋ค์์ ๋ค์ ์ฐธ์กฐ๋๋ค๋ ํน์ฑ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ ์์ด๋ฅผ ๋ฐฐ์ธ๋๋ ๋๋ผ๋ ๊ฒ์ด์ง๋ง, ์ฌ์ฉํ๋ 90%์ ๋จ์ด๋ ์์ 1000๊ฐ ๋จ์ด์ ๊ตญํ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ๋งค๋ฒ ์ฌ์ฉํ๋ ๊ฒ๋ค๋ง ์์ฃผ ์ฌ์ฉํ๋ค๋ ๋ป์ธ๋ฐ, ํ๋ก๊ทธ๋จ์์๋ ์์ฃผ ์ฌ์ฉ๋๋ ๋ฐ์ดํฐ๋ ๊ณ์ ์ฌ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์บ์ํํ๋ฉด ์ฑ๋ฅ์ ์ฌ๋ฆด ์ ์๋ค๋ ๋ป์ ๋๋ค. ๋ํ์ ์ผ๋ก ๋ฐ๋ณต๋ฌธ์ธ for, while์์ ์ฌ์ฉํ๋ ์กฐ๊ฑด ๋ณ์์ฒ๋ผ ํ๋ฒ ์ฐธ์กฐ๋ ๋ฐ์ดํฐ๋ ๋ ์ฐธ์กฐ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ๊ฒ์ ๋๋ค.
๊ณต๊ฐ ์ง์ญ์ฑ(Spatial Locality)
๊ณต๊ฐ ์ง์ญ์ฑ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์ฐ์์ผ๋ก ์ ๊ทผํ ๋ ์ฐธ์กฐ๋ ๋ฐ์ดํฐ ๊ทผ์ฒ์ ์๋ ๋ฐ์ดํฐ๊ฐ ์ฌ์ฌ์ฉ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ๊ณ ์ฑ๋ฅ ํ๋ก๊ทธ๋๋ฐ์ ํ ๋์๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์์ ์ผ๋ก ์ ๊ทผํ๋ ๊ฒ์ด ์ ๋ฆฌํ๋ค๋ ์๋ฏธ๊ฐ ๋ฉ๋๋ค.
// c++
// first
int res = 0;
for (int i = 0; i < 10000; i++) {
for (int j = 0; j < 10000; j++) {
res += data[j];
}
}
// second
for (int j = 0; j < 10000; j++) {
for (int i = 0; i < 10000; i++) {
res += data[j];
}
}
์์ ๊ฒฝ์ฐ first๋ณด๋จ second๊ฐ ์บ์ ์ง์ญ์ฑ์ด ๋์ต๋๋ค.second์ ๊ฒฝ์ฐ 10,000ํ ๋์ ํ๋์ ๋ฐ์ดํฐ์ ์ฐ์์ผ๋ก ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ์ฒซ ์ ๊ทผ์ ์ ์ธํ ๋๋จธ์ง ์ ๊ทผ์ด Cache hit๋์ด์ ํจ์ฌ ๋น ๋ฆ ๋๋ค.
๋ฐ์ดํฐ์ ์ ์ธ์์๋ int a[10000], b[10000]๊ณผ ๊ฐ์ด ์ ์ธํ๋ ๊ฒ๋ณด๋ค ์ฌ๋ฌ ์ค์ ๋๋ ์ ์ ์ธํ๋ ๊ฒ์ด ์บ์ ์ง์ญ์ฑ์ ์ ๋ฆฌํฉ๋๋ค.
False Sharing(๊ฑฐ์ง ๊ณต์ )
False Sharing(๊ฑฐ์ง ๊ณต์ )์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์ ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ(๋ณ์)๋ฅผ ์๋ก ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋์์ ๊ฐฑ์ ํ์ง๋ง,
๊ทธ ๋ฐ์ดํฐ๋ค์ด ๊ฐ์ cache line(๋ณดํต 64 byte)์ ์กด์ฌํ ๋ ๋ฐ์ํ๋ ์ฑ๋ฅ ์ ํ ํ์์
๋๋ค.
๋ฉํฐ์ค๋ ๋ฉ ํ๊ฒฝ์์ ์ฌ๋ฌ ์ฝ์ด๋ ์์ ๋ง์ ์บ์๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ฝ์ด์ ์บ์๋ฅผ ๋๊ธฐํ ์์ผ์ฃผ์ง ์์ผ๋ฉด ๊ฐ์ address์ ์ ๊ทผํจ์๋ ๊ฐ ์ฝ์ด๊ฐ ์๋ก ๋ค๋ฅธ ๊ฐ์ ๋ณผ ์ ์์ต๋๋ค. ํน์ ์๋ก ๋ค๋ฅธ ๋ณ์์ด์ง๋ง ๊ฐ์ ์บ์ ๋ผ์ธ์ ์กด์ฌํ์ฌ ๊ฑฐ์ง ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์ค๊ฒ ๋ฉ๋๋ค. ์บ์ ๋ผ์ธ์ ๋ณดํต 64๋ฐ์ดํธ์ด๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ๋ฐ์ดํฐ๋ฅผ 64๋ฐ์ดํธ ๋จ์๋ก ์ค์ ํด์ค๋ค๋ฉด ์ฝ์ด๋ผ๋ฆฌ ์๋ก ๋ค๋ฅธ ์บ์ ๋ผ์ธ์ ์ํ๊ธฐ ๋๋ฌธ์, ๋๊ธฐํ๋ฌธ์ ์์ ์์ ๋ก์์ง๋๋ค.
// ๋ฌธ์ ์ํฉ
struct Counters {
std::atomic<int> a;
std::atomic<int> b;
};
Counters counters;
void thread1() {
for (int i = 0; i < 1000000; ++i)
counters.a++;
}
void thread2() {
for (int i = 0; i < 1000000; ++i)
counters.b++;
}
// ํด๊ฒฐ(alignas๋ฅผ ํตํ 64๋ฐ์ดํธ ํจ๋ฉ)
struct alignas(64) Counter {
std::atomic<int> value;
};
Counter c1;
Counter c2;
Cache ์ฌ์ฉ์ ๊ทน๋ํํ๋ ์ค์ ์ ๋ต
1. ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ ๋ ฌ
์ฑ๋ฅ์ ์ํด์๋ผ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฐ์์ ์ธ vector๋ฅผ ์ฌ์ฉํฉ์๋ค. Linked list๋ฅผ ์ฌ์ฉํ๋ list์ map์ ์บ์ ๋ฏธ์ค๊ฐ ์ฆ์ต๋๋ค.
// โ
์ข์ ์
std::vector<float> v(N);
for (auto &x : v) sum += x; // spatial locality ์ฐ์
// โ ๋์ ์
std::list<float> l(N);
for (auto &x : l) sum += x; // cache miss ๋ค๋ฐ
2. Struct of Arrays (SoA) ํจํด
ํ์ํ ํ๋๋ง ๋ชจ์ ๋ถ๋ฆฌ๋ ๋ฐฐ์ด ๊ตฌ์กฐ(SoA)๋ก ๊ตฌ์ฑํ๋ฉด ์บ์ ํจ์จ์ด ๋์์ง๋๋ค.
// โ AoS
struct Particle {
float x, y, z, velocity;
};
std::vector<Particle> particles;
// โ
SoA
struct Particles {
std::vector<float> x, y, z, velocity;
};
3. Loop Reordering (Loop Tiling / Blocking)
๋ค์ฐจ์ ๋ฐฐ์ด์ ์ํํ ๋ ๋ฉ๋ชจ๋ฆฌ stride ์ ๊ทผ์ ์ต์ํํด์ผ ํฉ๋๋ค.
// โ row-major ๋ฉ๋ชจ๋ฆฌ์์ column-first ์ ๊ทผ
for (int j = 0; j < N; ++j)
for (int i = 0; i < N; ++i)
sum += matrix[i][j];
// โ
row-first ์ ๊ทผ
for (int i = 0; i < N; ++i)
for (int j = 0; j < N; ++j)
sum += matrix[i][j];
4. False Sharing ๋ฐฉ์ง
์์ ์ค๋ช ํ๋ ๊ฒ์ฒ๋ผ False sharing์ ์ฌ๊ฐํ ์ฑ๋ฅ ์ ํ๋ฅผ ์ ๋ฐํฉ๋๋ค. ๋ฉํฐ์ค๋ ๋๋ฅผ ์์ฐ๋ ๊ฒ๋ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋์ ๋ฐฉ์งํด์ค์๋ค. c++์์๋ ์บ์ ๋ผ์ธ์ ๋จ์์ธ 64๋ฐ์ดํธ๋ก paddingํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค(alignas ์ฌ์ฉ).
struct alignas(64) Counter {
std::atomic<int> value;
}; // ๊ฐ ์ค๋ ๋๋ณ๋ก cache line ๋ถ๋ฆฌ
๋ง์น๋ฉฐ
๋ค์ํ๋ฒ ๋ง์๋๋ฆฌ์ง๋ง ๊ณ ์ฑ๋ฅ ํ๋ก๊ทธ๋๋ฐ์์ ์บ์ ํ์ฉ์ ํ์์
๋๋ค. ๊ฐ๋ฐ์๊ฐ ์ง์ ์บ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ํ ์๋ ์์ง๋ง ์ผ๋ง๋ ์ง ์ฝ๋๋จ์์ ์บ์ํ์ฉ์ ๊ทน๋ํ์ํฌ ์ ์์ต๋๋ค. CPU์ ์บ์๋ฉ๋ชจ๋ฆฌ์ ํน์ง๊ณผ ํ์ฉ๋ฒ์ ์๊ณ ๊ฐ๋ฐํ๋ ๊ฒ๊ณผ ๋ชจ๋ฅด๊ณ ๊ฐ๋ฐํ๋ ๊ฒ์ ๋ง์ด ๋ค๋ฅผ ๊ฒ์
๋๋ค. ์ด ๊ธ์ ์ฝ์ ์ฌ๋ฌ๋ถ๋ค์ ์ด์ ๋ถํฐ ์บ์ํ์ฉ๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค!
๋ค์์๊ฐ์๋ Translation Lookaside Buffer(์ผ๋ช
TLB, TLB miss)์ ๋ํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
'์ปดํจํฐ ๊ตฌ์กฐ & ์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [๊ณ ์ฑ๋ฅ] NUMA(Non-Uniformed Memory Access) Locality์ CPU Affinity (1) | 2025.10.09 |
|---|---|
| [๊ณ ์ฑ๋ฅ] TLB(Translation Lookaside Buffer)์ TLB miss (0) | 2025.10.09 |
| ํ์ด์ง ๊ต์ฒด ์๊ณ ๋ฆฌ์ฆ๊ณผ ํ๋ ์ ํ ๋น (1) | 2023.11.11 |
| ๊ฐ์๋ฉ๋ชจ๋ฆฌ(Virtual Memory)์ ํ์ด์ง ๊ธฐ๋ฒ(Paging) (1) | 2023.11.07 |
| ์ด์์ฒด์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น(Memory Allocation) (2) | 2023.11.06 |
๋๊ธ