๋ณธ ํฌ์คํ ์ ํจ์คํธ์บ ํผ์ค ํ๊ธ ์ฑ๋ฆฐ์ง ์ฐธ์ฌ๋ฅผ ์ํด ์์ฑํ์์ต๋๋ค.
Abit.ly ๋ค์ด๋ฐ๊ธฐ
abit.ly
๊ณต๋ถ ์์ ์๊ฐ - 22:57
๊ฐ์์ฅ ๋ชฉ๋ก
์ค๋์ ์บ์ ์นํ์ ์ธ ์ฝ๋์ ๊ทธ๋ ์ง ์์ ์ฝ๋๋ฅผ ๊น์ด ์๊ฒ ์ดํด๋ณด์, ARABOZA.
์บ์ ์นํ์ ์ด๋ผ๋ ๋ง์ ์บ์ ํํธ๋ฅผ ์ต๋ํํ๊ณ ์บ์ ๋ฏธ์ค๋ฅผ ์ต์ํํ์ฌ ์คํ ์๋๋ฅผ ๋น์ฝ์ ์ผ๋ก ๋์ธ๋ค๋ ๋ป์ด๋ค.
์ฒซ์งธ, ์๊ฐ ์ง์ญ์ฑ์ ์ง์คํ์. ์๊ฐ ์ง์ญ์ฑ์ด๋ ํ ๋ฒ ์ฐธ์กฐ๋ ๋ฐ์ดํฐ๊ฐ ๊ฐ๊น์ด ๋ฏธ๋์ ๋ค์ ์ฐธ์กฐ๋ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ํน์ฑ์ด๋ค. ์์ปจ๋ ๋ค์ ์ฝ๋๋ ๋ฃจํ ์์์ ๋ณ์ num์ ๊ณ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์บ์์ num์ด ๋จธ๋ฌผ๋ฉด์ ํํธ์จ์ด ๋งค์ฐ ๋๋ค.
int num = 2;
for (int i = 1; i <= 9; ++i)
cout << num << " x " << i << " = " << num * i << "\n";
๋ณ์ num์ด ์บ์ ๋ผ์ธ์ ์ ์ง๋์ด ์ฝ๊ธฐ ๋น์ฉ์ ์ต์ํํ๋ค.
๋์งธ, ๊ณต๊ฐ ์ง์ญ์ฑ์ ๊ณ ๋ คํ์. 2์ฐจ์ ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ์ ํ ์ฐ์ (row-major) ๋ฐฉ์์ผ๋ก ์ฐ์ ์ ์ฅ๋๋ค. ์ด ์ฐ์ (column-major) ์ํ ์ฝ๋๋ ์ด ์ฐ์์ฑ์ ๋ฌด์ํ๋ฏ๋ก ์บ์ ๋ฏธ์ค๊ฐ ๋น๋ฒํด์ง๋ค.
int matrix[10000][10000];
for (int i = 0; i < 10000; ++i)
for (int j = 0; j < 10000; ++j)
matrix[j][i] = 1; // ๋น์ถ์ฒ
์ด์ ๋ฌ๋ฆฌ ํ ์ฐ์ ์ํ๋ ์ธ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์์ฐจ ์ ๊ทผํ์ฌ ์บ์ ํจ์จ์ด ๊ทน๋ํ๋๋ค.
int matrix[10000][10000];
for (int i = 0; i < 10000; ++i)
for (int j = 0; j < 10000; ++j)
matrix[i][j] = 1; // ์ถ์ฒ
์ด์ฒ๋ผ ๊ฐ๋จํ ์ํ ์์๋ง ๋ฐ๊พธ์ด๋ ์คํ ์๋๊ฐ ์๋ฐฐ ๊ฐ๊น์ด ๊ฐ์ ๋ ์ ์๋ค.
์ ์งธ, ๋์ฉ๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์๋ ๋ธ๋ก ๋จ์ ์ฒ๋ฆฌ(Loop Tiling)๋ฅผ ๊ณ ๋ คํ์. ์ ์ฒด ๋ฐฐ์ด์ด ์บ์๋ฅผ ์ด๊ณผํ๋ฉด ๋จ์ ํ ์ฐ์ ์ํ๋ง์ผ๋ก๋ ํ๊ณ๊ฐ ์๋ค. ์ด๋๋ ์์ ๋ธ๋ก ํฌ๊ธฐ(B)๊ฐ ์บ์์ ๋ค์ด์ค๋๋ก 2์ค ๋ฃจํ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ถํ ํ๋ค.
const int B = 64;
for (int ii = 0; ii < N; ii += B)
for (int jj = 0; jj < N; jj += B)
for (int i = ii; i < ii + B; ++i)
for (int j = jj; j < jj + B; ++j)
matrix[i][j] = 1;
์ด ๊ธฐ๋ฒ์ ๊ฐ ๋ธ๋ก์ด ์บ์์ ์ ์ฌ๋ ์ํ์์ ์ฐ์ฐ์ ์ง์ค ์ํํ๋ฏ๋ก ์บ์ ํํธ๋ฅผ ๊ทน๋ํํ๋ค.
๋ท์งธ, ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ค๊ณ์๋ ์ ๊ฒฝ ์จ์ผ ํ๋ค. ๋ฐฐ์ด ๋์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ ํธ๋ฆฌ์ ๊ฐ์ ํฌ์ธํฐ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ ๋ฉ๋ชจ๋ฆฌ ์์ ํฉ์ด์ ธ ์ ์ฅ๋๊ธฐ ์ฝ๊ณ ์บ์ ๋ฏธ์ค๋ฅผ ์ ๋ฐํ๋ค. ๊ฐ๋ฅํ ํ ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ํ๋๋ฅผ ๊ฐ์ง ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐฐ์ด๋ก ์ ์ธํ ๋, ์ค์ ๋ก ์์ฃผ ์ฌ์ฉํ๋ ํ๋๋ง ๋ฐ๋ก ๋ชจ์ ๋ณ๋ ๋ฐฐ์ด๋ก ๊ด๋ฆฌํ๋ฉด ์บ์ ํ์ฉ๋๊ฐ ๋์์ง๋ค.
๋ง์ง๋ง์ผ๋ก ํ๋์จ์ด ์ง์ ๊ธฐ๋ฅ์ ํ์ฉํด ๋ณด์.
์ปดํ์ผ๋ฌ์ __builtin_prefetch๋ C++17์ std::hardware_destructive_interference_size ๊ฐ์ ์์ฑ์ ์ด์ฉํ๋ฉด ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์บ์์ ์ ์ฌํ๊ฑฐ๋ ์บ์ ๊ฐ์ญ์ ์ค์ผ ์ ์๋ค. ๋ค๋ง ๊ณผ๋ํ ํ๋ฆฌํ์น๋ ์คํ๋ ค ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์์ผ๋, ์ค์ ๋ฒค์น๋งํฌ๋ฅผ ํตํด ์ต์ ์ง์ ์ ์ฐพ์์ผ ํ๋ค.
์ ๋ฆฌํ์๋ฉด, ์บ์ ์นํ์ ์ฝ๋๋
- ํต์ฌ ๋ฃจํ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ณต ์ฐธ์กฐํด ์๊ฐ ์ง์ญ์ฑ์ ๋์ด๊ณ ,
- ์ธ์ ํ ๋ฐ์ดํฐ๋ฅผ ์์ฐจ ์ ๊ทผํ๋ฉฐ ๊ณต๊ฐ ์ง์ญ์ฑ์ ์ต๋ํ ํ์ฉํ๊ณ ,
- ํ์ ์ ๋ฃจํ ํฐ๋ง์ผ๋ก ๋ธ๋ก ๋จ์ ์ฒ๋ฆฌํ์ฌ ๋์ฉ๋ ๋ฐ์ดํฐ์์๋ ์บ์ ํจ์จ์ ์ ์งํ๋ฉฐ,
- ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฐ์ผ๋ก ์ค๊ณํ๊ณ ,
- ์ ์ ํ ํ๋ฆฌํ์น ๊ธฐ๋ฒ์ ๋ณํ ์ ์ฉํจ์ผ๋ก์จ ์คํํ ์ ์๋ค.
์ด๋ฌํ ์ต์ ํ ์์น์ ์ผ๋์ ๋๋ฉด, ๋ฉ๋ชจ๋ฆฌ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๋์ด ์ ์ฒด ์์คํ ์ฑ๋ฅ์ ๋น์ฝ์ ์ผ๋ก ํฅ์์ํฌ ์ ์๋ค. ํ๋ก๊ทธ๋๋จธ๋ ์บ์ ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์์ ์ดํดํ๊ณ ์ฝ๋์ ๋ฐ์ํจ์ผ๋ก์จ, ๊ณ ์ฑ๋ฅ ์ํํธ์จ์ด๋ฅผ ํ์ธต ๋ ๋ฐ์ ์ํฌ ์ ์๋ค.
๊ณต๋ถ ์ข ๋ฃ ์๊ฐ - 23:27