ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰์ฑŒ๋ฆฐ์ง€ 18์ผ์ฐจ : ํ˜„์‹ค ์„ธ์ƒ์˜ ์ปดํ“จํ„ฐ๊ณตํ•™ ์ง€์‹ with 30๊ฐ€์ง€ ์‹ค๋ฌด ์‹œ๋‚˜๋ฆฌ์˜ค ์ดˆ๊ฒฉ์ฐจ ํŒจํ‚ค์ง€ Online. ๊ฐ•์˜ ํ›„๊ธฐ

๋ณธ ํฌ์ŠคํŒ…์€ ํŒจ์ŠคํŠธ์บ ํผ์Šค ํ™˜๊ธ‰ ์ฑŒ๋ฆฐ์ง€ ์ฐธ์—ฌ๋ฅผ ์œ„ํ•ด ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

 

https://abit.ly/lisbva

 

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 ๊ฐ™์€ ์†์„ฑ์„ ์ด์šฉํ•˜๋ฉด ๋ฏธ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ์— ์ ์žฌํ•˜๊ฑฐ๋‚˜ ์บ์‹œ ๊ฐ„์„ญ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ ๊ณผ๋„ํ•œ ํ”„๋ฆฌํŽ˜์น˜๋Š” ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์„ ์ €ํ•˜์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋‹ˆ, ์‹ค์ œ ๋ฒค์น˜๋งˆํฌ๋ฅผ ํ†ตํ•ด ์ตœ์  ์ง€์ ์„ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

 

์ •๋ฆฌํ•˜์ž๋ฉด, ์บ์‹œ ์นœํ™”์  ์ฝ”๋“œ๋Š”

  1. ํ•ต์‹ฌ ๋ฃจํ”„์—์„œ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜๋ณต ์ฐธ์กฐํ•ด ์‹œ๊ฐ„ ์ง€์—ญ์„ฑ์„ ๋†’์ด๊ณ ,
  2. ์ธ์ ‘ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ ์ ‘๊ทผํ•˜๋ฉฐ ๊ณต๊ฐ„ ์ง€์—ญ์„ฑ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ณ ,
  3. ํ•„์š” ์‹œ ๋ฃจํ”„ ํ‹ฐ๋ง์œผ๋กœ ๋ธ”๋ก ๋‹จ์œ„ ์ฒ˜๋ฆฌํ•˜์—ฌ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ์—์„œ๋„ ์บ์‹œ ํšจ์œจ์„ ์œ ์ง€ํ•˜๋ฉฐ,
  4. ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์—ฐ์† ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„ํ•˜๊ณ ,
  5. ์ ์ ˆํ•œ ํ”„๋ฆฌํŽ˜์น˜ ๊ธฐ๋ฒ•์„ ๋ณ‘ํ–‰ ์ ์šฉํ•จ์œผ๋กœ์จ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ตœ์ ํ™” ์›์น™์„ ์—ผ๋‘์— ๋‘๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋„˜์–ด ์ „์ฒด ์‹œ์Šคํ…œ ์„ฑ๋Šฅ์„ ๋น„์•ฝ์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋™์ž‘ ๋ฐฉ์‹์„ ์ดํ•ดํ•˜๊ณ  ์ฝ”๋“œ์— ๋ฐ˜์˜ํ•จ์œผ๋กœ์จ, ๊ณ ์„ฑ๋Šฅ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ•œ์ธต ๋” ๋ฐœ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

๊ณต๋ถ€ ์ข…๋ฃŒ ์‹œ๊ฐ„ - 23:27

 

  • ๋„ค์ด๋ฒ„ ๋ธ”๋กœ๊ทธ ๊ณต์œ 
  • ๋„ค์ด๋ฒ„ ๋ฐด๋“œ ๊ณต์œ 
  • ํŽ˜์ด์Šค๋ถ ๊ณต์œ 
  • ์นด์นด์˜ค์Šคํ† ๋ฆฌ ๊ณต์œ