๐Ÿชœ Computer System : 5. ํ”„๋กœ์„ธ์„œ ๊ตฌ์กฐ_part3

A Yeon Jangยท2025๋…„ 8์›” 16์ผ

โ‰๏ธ ์ง€๋‚œ๋ฒˆ์—๋Š”

์ง€๊ธˆ๊นŒ์ง€๋Š” ๋ฃจํ”„ ํ˜น์€ ํ˜ธ์ถœ ๋“ฑ์—์„œ ๋ถˆํ•„์š”ํ•œ ๋ฐ˜๋ณต ์ œ๊ฑฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ ์ตœ์ ํ™”๋ฅผ ํ†ตํ•ด
ํ”„๋กœ๊ทธ๋žจ์„ ๋” ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜๋‹ค.
ํ•˜์ง€๋งŒ โ€œ๊ฐ€๋ณ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒโ€๋งŒ์œผ๋กœ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ๋‹ค.
ํ˜„๋Œ€ ํ”„๋กœ์„ธ์„œ๊ฐ€ ๊ฐ€์ง„ ๋ณ‘๋ ฌ ์‹คํ–‰ ๋Šฅ๋ ฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š”
๋ฃจํ”„ ์ž์ฒด์˜ ๊ตฌ์กฐ๋ฅผ ๋ณ€ํ˜•ํ•˜์—ฌ ๋” ๋งŽ์€ ์—ฐ์‚ฐ์„ ๋™์‹œ์— ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.

๊ทธ ๋Œ€ํ‘œ์ ์ธ ๊ธฐ๋ฒ•์ด ๋ฐ”๋กœ ๋ฃจํ”„ ํ’€๊ธฐ(loop unrolling)์™€ ๋‹ค์ค‘ ๋ˆ„์‚ฐ๊ธฐ(multiple accumulators)๋ฅผ
ํ™œ์šฉํ•œ ๋ช…๋ น ์ˆ˜์ค€ ๋ณ‘๋ ฌ์„ฑ(ILP, Instruction-Level Parallelism) ํ™•๋Œ€ ์ด๋‹ค.

๐Ÿ”„ ๋ฃจํ”„ ํ’€๊ธฐ

๋ฃจํ”„์˜ ๋งค ๋ฐ˜๋ณต์‹คํ–‰๋งˆ๋‹ค ๊ณ„์‚ฐ๋˜๋Š” ์›์†Œ์˜ ์ˆ˜ ์ž์ฒด๋ฅผ ์ฆ๊ฐ€์‹œ์ผœ์„œ
๋ฃจํ”„์—์„œ์˜ ์ด ๋ฐ˜๋ณต ์‹คํ–‰ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ํ”„๋กœ๊ทธ๋žจ ๋ณ€ํ™˜

์ด๋Š” ๋‘๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

  • ์ธ๋ฑ์Šค ๊ณ„์‚ฐ, ์กฐ๊ฑด๋ถ€ ๋ถ„๊ธฐ ๋“ฑ ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฒฐ๊ณผ์™€๋Š” ์ง์ ‘์ ์œผ๋กœ ๊ด€๋ จ์ด ์—†๋Š” ์—ฐ์‚ฐ๋“ค์˜ ์ˆ˜๋ฅผ ์ค„์ธ๋‹ค.
  • ์ „์ฒด ๊ณ„์‚ฐ์˜ ํ•ต์‹ฌ ๊ฒฝ๋กœ์— ์žˆ๋Š” ์—ฐ์‚ฐ์˜ ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์ฝ”๋“œ๋ณ€ํ™˜์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•œ๋‹ค.

๐Ÿ’ฌ ๋ฃจํ”„ ํ’€๊ธฐ์˜ ๊ธฐ๋ณธ ์•„์ด๋””์–ด๋ฅผ ์‚ดํŽด๋ณด์•˜์œผ๋‹ˆ, ์ด์ œ ์‹ค์ œ ์ฝ”๋“œ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด
์–ผ๋งˆ๋‚˜ ๋ฐ˜๋ณต ํšŸ์ˆ˜๋ฅผ ์ค„์ด๊ณ  ๋ณ‘๋ ฌ์„ฑ์„ ๋Œ์–ด๋‚ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋‹จ๊ณ„๋ณ„๋กœ ํ™•์ธํ•ด ๋ณด์ž.


๐Ÿ“ combine 4

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ์ฝ”๋“œ ์„ค๋ช…

acc = acc OP data[i]

  • ๋ฐ˜๋ณต๋ฌธ์—์„œ ๋งค๋ฒˆ ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ load ํ›„ ๋ˆ„์ ๊ฐ’(acc)์— ์—ฐ์‚ฐ
  • ๋ชจ๋“  ์—ฐ์‚ฐ์ด ์ด์ „ ๊ฒฐ๊ณผ(acc)์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ‘๋ ฌ์„ฑ์ด ๋‚ฎ๊ณ  CPE๊ฐ€ ๋†’๋‹ค.

๐Ÿ’พ ๋ ˆ์ง€์Šคํ„ฐ ์—ญํ• 

%rax : data ๋ฐฐ์—ด ์‹œ์ž‘ ์ฃผ์†Œ
%rbp : ์ข…๋ฃŒ ์ธ๋ฑ์Šค ์กฐ๊ฑด
%rdx : ํ˜„์žฌ ์ธ๋ฑ์Šค
%xmm0 : ๋ˆ„์ ๊ฐ’(acc) ์ €์žฅ

๐Ÿงฉ ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • load_1 : %rdx โ†’ ์ด๋ฒˆ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์ฃผ์†Œ ๊ณ„์‚ฐ
  • mul_1 :%xmm0์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ˆ„์ ๊ฐ’ acc์™€ ์ƒˆ ๊ฐ’ ์—ฐ์‚ฐ ํ›„ ์ €์žฅ
  • add, cmp, jne : %rdx ์ฆ๊ฐ€, %rbp ๋น„๊ต๋กœ ๋ฃจํ”„ ์ œ์–ด

๐Ÿ“ combine 5

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ์ฝ”๋“œ ์„ค๋ช…

acc = (acc OP data[i]) OP data[i+1]

2 * 1 loop unrolling

  • 2์˜ ๋ฐฐ์ˆ˜์— ๋Œ€ํ•ด ๊ณ„์‚ฐ์„ ์ง„ํ–‰ํ•˜์ง€๋งŒ ๋‹จ์ผ ๋ณ€์ˆ˜์— ๋ˆ„์ ํ•œ๋‹ค.
  • ๋ฃจํ”„ ์–ธ๋กค๋ง ๋•๋ถ„์— ํ•œ ๋ฒˆ ๋ฐ˜๋ณต์—์„œ load โ†’ mul โ†’ load โ†’ mul ์ˆœ์„œ๋กœ ์‹คํ–‰๋˜๋ฏ€๋กœ,
    CPU ํŒŒ์ดํ”„๋ผ์ธ์ด ๋กœ๋“œ์™€ ๊ณฑ์…ˆ์„ ๊ฒน์ณ์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • i๋ฒˆ์งธ ๋ฐ์ดํ„ฐ์™€ ๋ˆ„์ ๊ฐ’์˜ ๊ณฑ์…ˆํ›„์—์•ผ ๋‹ค์Œ ๊ฒฐ๊ณผ๋ฅผ ๋ˆ„์ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์ข…์†์„ฑ์ด ๋‚จ์•„ ์žˆ๋‹ค.
  • ํ•œ๋ฒˆ์˜ ๋ฃจํ”„์—์„œ 2๊ฐœ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•˜๋ฏ€๋กœ ๋ฐ˜๋ณต์‹คํ–‰ ํšŸ์ˆ˜๋Š” ์ ˆ๋ฐ˜์œผ๋กœ ์ค„์—ˆ๋‹ค.

๐Ÿ’พ ๋ ˆ์ง€์Šคํ„ฐ ์—ญํ• 

%rax : data ๋ฐฐ์—ด ์‹œ์ž‘ ์ฃผ์†Œ
%rbp : ์ข…๋ฃŒ ์ธ๋ฑ์Šค ์กฐ๊ฑด
%rdx : ํ˜„์žฌ ์ธ๋ฑ์Šค
%xmm0 : ๋ˆ„์ ๊ฐ’(acc) ์ €์žฅ

๐Ÿงฉ ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • load_1 : %rax, %rdx โ†’ i ๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์ฃผ์†Œ ๊ณ„์‚ฐ
  • mul_1 :%xmm0์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ˆ„์ ๊ฐ’ acc์™€ ์ƒˆ ๊ฐ’ ์—ฐ์‚ฐ ํ›„ %xmm0 ์— ์ €์žฅ
  • load_2 : %rax, %rdx โ†’ i+1 ๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์ฃผ์†Œ ๊ณ„์‚ฐ
  • mul_2 :%xmm0์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ˆ„์ ๊ฐ’ acc(i๋ฒˆ์งธ ๊ฐ’ ํฌํ•จ)์™€ ์ƒˆ ๊ฐ’ ์—ฐ์‚ฐ ํ›„ %xmm0 ์— ์ €์žฅ
  • add, cmp, jne : %rdx ์ฆ๊ฐ€, %rbp ๋น„๊ต๋กœ ๋ฃจํ”„ ์ œ์–ด

๐Ÿ‘๐Ÿป ์„ฑ๋Šฅ ๊ฐœ์„ 

๐Ÿ“Œ k ร— 1 ๋ฃจํ”„ ํ’€๊ธฐ์™€ ์„ฑ๋Šฅ ํ•œ๊ณ„

๐Ÿ” k ร— 1 ๋ฃจํ”„ ํ’€๊ธฐ๋ž€?

  • ํ•œ ๋ฃจํ”„์—์„œ k๊ฐœ์˜ ์›์†Œ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹
  • ์˜ˆ์‹œ:
    • 2ร—1 unrolling (combine5)
      acc = (acc OP data[i]) OP data[i+1];
    • 3ร—1 unrolling
      acc = ((acc OP data[i]) OP data[i+1]) OP data[i+2];
  • ๋‹จ์ผ ๋ˆ„์‚ฐ๊ธฐ๋งŒ ์‚ฌ์šฉํ•˜์—ฌ, ๋ฃจํ”„ ์ œ์–ด ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ํšจ๊ณผ๊ฐ€ ์žˆ๋‹ค.

โš ๏ธ ์„ฑ๋Šฅ ๊ฐœ์„ ์˜ ํ•œ๊ณ„ ์ด์œ 

1. ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ์œ ์ง€

  • ๋ชจ๋“  ์—ฐ์‚ฐ์ด acc์— ์˜์กด โ†’ acc = acc OP data[i]๊ฐ€ ๋๋‚˜์•ผ ๋‹ค์Œ ์—ฐ์‚ฐ ์‹œ์ž‘ ๊ฐ€๋Šฅ.
  • ๋”ฐ๋ผ์„œ CPU์˜ ์—ฌ๋Ÿฌ ์‹คํ–‰ ์œ ๋‹›์„ ๋ณ‘๋ ฌ๋กœ ํ™œ์šฉ ๋ถˆ๊ฐ€๋Šฅ.
  • ๊ฒฐ๊ตญ Latency bound(์ง€์—ฐ ํ•œ๊ณ„) ์ด์ƒ์œผ๋กœ๋Š” ์„ฑ๋Šฅ ๊ฐœ์„  ๋ถˆ๊ฐ€.

2. ๋ฃจํ”„ ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ ํšจ๊ณผ์˜ ํ•œ๊ณ„

  • ์–ธ๋กค๋ง(k ์ฆ๊ฐ€) โ†’ ๋ฃจํ”„ ์ œ์–ด ๋น„์šฉ(cmp, jne) ๊ฐ์†Œ.
  • ํ•˜์ง€๋งŒ ์ผ์ • ์ง€์  ์ดํ›„์—๋Š” ๋ฃจํ”„ ์ œ์–ด ๋น„์šฉ์ด ์ „์ฒด ์‹คํ–‰ ์‹œ๊ฐ„์—์„œ ์ฐจ์ง€ํ•˜๋Š” ๋น„์ค‘์ด ์ž‘์•„์ง.
  • โ†’ ๋” ์–ธ๋กคํ•ด๋„ ์„ฑ๋Šฅ ๊ฐœ์„  ๊ฑฐ์˜ ์—†์Œ.
  • ์‹ค์ œ๋กœ combine5 (2ร—1)์™€ 3ร—1์˜ ์„ฑ๋Šฅ์ด ๋™์ผํ•œ ์ด์œ .

3. ๋ ˆ์ง€์Šคํ„ฐ ์••๋ฐ• & ์ฝ”๋“œ ํฌ๊ธฐ ์ฆ๊ฐ€

  • k๊ฐ€ ์ปค์งˆ์ˆ˜๋ก ์ฝ”๋“œ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๊ณ , ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์šฉ์ด ๋Š˜์–ด๋‚œ๋‹ค.
  • ์ตœ์ ํ™” ํšจ๊ณผ๊ฐ€ ์ค„๊ณ , ์˜คํžˆ๋ ค ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ์„ฑ ์žˆ๋‹ค.

โœ… ์š”์•ฝ

  • kร—1 ์–ธ๋กค๋ง์€ ๋ฃจํ”„ ์ œ์–ด ์˜ค๋ฒ„ํ—ค๋“œ ๊ฐ์†Œ ํšจ๊ณผ๋Š” ์žˆ์ง€๋งŒ,
    ๋‹จ์ผ ๋ˆ„์‚ฐ๊ธฐ ์‚ฌ์šฉ์œผ๋กœ ์ธํ•ด ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ๋‹ค..
  • ๋”ฐ๋ผ์„œ ์ผ์ • ์ง€์ (k>2~4) ์ด์ƒ์—์„œ๋Š” ์„ฑ๋Šฅ ๊ฐœ์„ ์ด ๋ฉˆ์ถ˜๋‹ค.

๐Ÿ’ฌ ์ฆ‰, ๋ฐฉ๊ธˆ ๋ณธ ๊ฒƒ ์ฒ˜๋Ÿผ k * 1 ๋ฃจํ”„ ํ’€๊ธฐ ๋งŒ์œผ๋กœ๋Š” ์„ฑ๋Šฅ ๊ฐœ์„ ์— ์ œํ•œ์ด ์ƒ๊ธด๋‹ค.
๋” ํฐ ๊ฐœ์„ ์„ ์›ํ•œ๋‹ค๋ฉด ๐Ÿ‘‰ ๋‹ค์ค‘ ๋ˆ„์‚ฐ๊ธฐ(multiple accumulators) ๊ธฐ๋ฒ•์ด ํ•„์š”ํ•˜๋‹ค.


๐Ÿ”„ ๋ณ‘๋ ฌ์„ฑ ๋†’์ด๊ธฐ

๐Ÿ’ฌ ์œ„์—์„œ ๋ณธ ๊ฒƒ ์ฒ˜๋Ÿผ ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ์˜ ํ•จ์ˆ˜๋“ค์€ ์‚ฐ์ˆ ์—ฐ์‚ฐ ์œ ๋‹›๋“ค์˜ ์ง€์—ฐ์‹œ๊ฐ„์œผ๋กœ ์ธํ•œ ๊ฒฝ๊ณ„๊ฐ’์„ ๊ฐ€์กŒ๋‹ค. ์ง€๊ธˆ๋ถ€ํ„ฐ ์ด ์ˆœ์ฐจ์  ์˜์กด์„ฑ์„ ๊นจ๊ณ , ์ง€์—ฐ์‹œ๊ฐ„ ๊ฒฝ๊ณ„๊ฐ’๋ณด๋‹ค ์ข‹์€ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋“ค์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

๐Ÿงฎ ๋‹ค์ค‘ ๋ˆ„์‚ฐ๊ธฐ ์‚ฌ์šฉ

์ •์ˆ˜ ๋ง์…ˆ์ด๋‚˜ ๊ณฑ์…ˆ๊ณผ ๊ฐ™์ด ๊ตํ™˜์„ฑ๊ณผ ๊ฒฐํ•ฉ์„ฑ์ด ์žˆ๋Š” ์—ฐ๊ฒฐ์—ฐ์‚ฐ์— ๋Œ€ํ•ด
์—ฐ๊ฒฐ์—ฐ์‚ฐ์˜ ์ง‘ํ•ฉ์„ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋งˆ์ง€๋ง‰์— ํ•ฉ์น˜๋Š” ๋ฐฉ๋ฒ•

์ฆ‰, ๋ฐ˜๋ณต์‹คํ–‰๋งˆ๋‹ค ๋ณด๋‹ค ๋งŽ์€ ์›์†Œ๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ N์ค‘ ๋ฃจํ”„ ํ’€๊ธฐ์™€
๊ตํ™˜, ๊ฒฐํ•ฉ์„ฑ์ด ์žˆ๋Š” ์—ฐ๊ฒฐ์—ฐ์‚ฐ์˜ ์ง‘ํ•ฉ์„ ๋‚˜๋ˆ„์–ด ๋ˆ„์  ์—ฐ์‚ฐํ•˜๋Š” N์ค‘ ๋ณ‘๋ ฌ์„ฑ์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค

๐Ÿ“ combine 6

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ์ฝ”๋“œ ์„ค๋ช…

acc0 = acc0 OP data[i];
acc1 = acc1 OP data[i];

2 * 2 loop unrolling

  • ํ•œ ๋ฃจํ”„์—์„œ ์ง์ˆ˜์™€ ํ™€์ˆ˜ ๊ฐ๊ฐ 1๊ฐœ์”ฉ ์ด 2๊ฐœ์˜ ์›์†Œ ์ฒ˜๋ฆฌ
  • ์ง์ˆ˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๋Š” ์›์†Œ๋“ค์„ ์œ„ํ•œ%xmm0์™€ ํ™€์ˆ˜ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ–๋Š” ์›์†Œ๋“ค์„ ์œ„ํ•œ %xmm1
    ์ด ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ๋˜์–ด ์žˆ๋Š” ๋ˆ„์ ๊ฐ’ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์— ๋Œ€ํ•ด์„œ ๋‘ ๊ฐˆ๋ž˜๋กœ ๋‚˜๋ˆ  ์ผ๋ถ€ ๋ณ‘๋ ฌํ™” ๊ฐ€๋Šฅ

๐Ÿ’พ ๋ ˆ์ง€์Šคํ„ฐ ์—ญํ• 

%rax : data ๋ฐฐ์—ด ์‹œ์ž‘ ์ฃผ์†Œ
%rbp : ์ข…๋ฃŒ ์ธ๋ฑ์Šค
%rdx : ํ˜„์žฌ ์ธ๋ฑ์Šค
%xmm0 : ์ง์ˆ˜ ์ธ๋ฑ์Šค ๋ˆ„์ ๊ฐ’
%xmm1 : ํ™€์ˆ˜ ์ธ๋ฑ์Šค ๋ˆ„์ ๊ฐ’

๐Ÿงฉ ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • load_1 : %rax, %rdx โ†’ i ๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์ฃผ์†Œ ๊ณ„์‚ฐ
  • mul_1 : ์ง์ˆ˜ ์ธ๋ฑ์Šค๋ฅผ ์œ„ํ•œ %xmm0์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ˆ„์ ๊ฐ’ acc์™€ ์ƒˆ ๊ฐ’ ์—ฐ์‚ฐ ํ›„ %xmm0 ์— ์ €์žฅ
  • load_2 : %rax, %rdx โ†’ i +1 ๋ฒˆ์งธ ์ธ๋ฑ์Šค์— ๋Œ€ํ•œ ์ฃผ์†Œ ๊ณ„์‚ฐ
  • mul_2 : ํ™€์ˆ˜ ์ธ๋ฑ์Šค๋ฅผ ์œ„ํ•œ%xmm1์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ˆ„์ ๊ฐ’ acc(i๋ฒˆ์งธ ๊ฐ’ ํฌํ•จ)์™€ ์ƒˆ ๊ฐ’ ์—ฐ์‚ฐ ํ›„ %xmm1 ์— ์ €์žฅ
  • add, cmp, jne : %rdx ์ฆ๊ฐ€, %rbp ๋น„๊ต๋กœ ๋ฃจํ”„ ์ œ์–ด

๐Ÿ“ˆ k ร— k ๋ฃจํ”„ ํ’€๊ธฐ์˜ ์‹ค์ œ ์„ฑ๋Šฅ

๐Ÿ”น ์˜ˆ์ œ ๊ฒฐ๊ณผ ์š”์•ฝ

  • ์ •์ˆ˜ ๋ง์…ˆ(Integer +)
    • k โ‰ฅ 7์ผ ๋•Œ CPE โ‰ˆ 0.54 โ†’ ์ด๋ก ์  throughput bound (0.50)์— ๊ทผ์ ‘
  • ์ •์ˆ˜ ๊ณฑ์…ˆ(Integer ร—), ๋ถ€๋™ ๋ง์…ˆ(FP +)
    • k โ‰ฅ 3์ผ ๋•Œ CPE โ‰ˆ 1.01 โ†’ throughput bound (1.0)์— ๊ทผ์ ‘
  • ๋ถ€๋™ ๊ณฑ์…ˆ(FP ร—)
    • k โ‰ฅ 10์ผ ๋•Œ CPE โ‰ˆ 0.51 โ†’ throughput bound (0.50)์— ๊ทผ์ ‘

โžก๏ธ ์ฆ‰, k๋ฅผ ์ถฉ๋ถ„ํžˆ ํ‚ค์šฐ๋ฉด CPE๊ฐ€ ๊ฑฐ์˜ throughput bound์— ๊ฐ€๊นŒ์›Œ์ง์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ”น ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜๋Š” ์ด์œ 

  • ๋ฃจํ”„ ์ œ์–ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ถ„์‚ฐ๋˜์–ด CPE๊ฐ€ ๋‚ฎ์•„์ง„๋‹ค.
  • ํŒŒ์ดํ”„๋ผ์ธ์„ ๋” ํšจ์œจ์ ์œผ๋กœ ์ฑ„์›Œ์„œ ์—ฌ๋Ÿฌ ์‹คํ–‰ ์œ ๋‹›์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

๐Ÿ”น ์„ฑ๋Šฅ ๊ฐœ์„ ์˜ ์กฐ๊ฑด

  • ์–ด๋–ค ์—ฐ์‚ฐ์˜ latency = L
  • ํ•ด๋‹น ์—ฐ์‚ฐ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์œ ๋‹›์˜ ๊ฐœ์ˆ˜ = C
  • ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋‚ด๋ ค๋ฉด ์–ธ๋กค๋ง factor k โ‰ฅ L ร— C ํ•„์š”.

์ฆ‰, L ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ธฐ๊ณ„๊ฐ€ C๊ฐœ ์žˆ์œผ๋‹ˆ ์ตœ๋Œ€ ์ฒ˜๋ฆฌ๋Ÿ‰์„ ๋‚ด๋ ค๋ฉด L * C ๊ฐœ์˜ ์ž‘์—…์„ ํ•œ๋ฒˆ์— ๋งก๊ฒจ์•ผํ•œ๋‹ค.


โš ๏ธ ์ฃผ์˜ํ•  ์ 

  • ๋ฃจํ”„ ํ’€๊ธฐ๋งŒ์œผ๋กœ ์„ฑ๋Šฅ์ด ์˜ฌ๋ผ๊ฐ€๋Š” ๊ฑด, ํŒŒ์ดํ”„๋ผ์ธ์ด ์ถฉ๋ถ„ํžˆ ๋…๋ฆฝ์  ์—ฐ์‚ฐ์œผ๋กœ ์ฑ„์›Œ์งˆ ๋•Œ์— ํ•œ์ •๋œ๋‹ค.
  • ํ•˜์ง€๋งŒ acc ํ•˜๋‚˜๋งŒ ์“ฐ๋ฉด ์—ฌ์ „ํžˆ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด ์กด์žฌํ•˜๋ฏ€๋กœ, ์™„๋ฒฝํ•œ ์„ฑ๋Šฅ ๊ฐœ์„ ์€ ์–ด๋ ต๋‹ค.
  • ๋”ฐ๋ผ์„œ, ๋ฃจํ”„ ํ’€๊ธฐ๋ฅผ ๋‹ค์ค‘ ๋ˆ„์‚ฐ๊ธฐ(multiple accumulators)์™€ ๊ฒฐํ•ฉํ•ด์•ผ ๋” ํฐ ๊ฐœ์„ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”„ Reassociation Transformation (์žฌ๊ฒฐํ•ฉ ๋ณ€ํ™˜)

๐Ÿ”น ์•„์ด๋””์–ด

  • ๋‹จ์ˆœํžˆ kร—1 ์–ธ๋กค๋ง๋งŒ์œผ๋กœ๋Š” ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์ด ์—ฌ์ „ํžˆ ๋‚จ๋Š”๋‹ค.
  • ์—ฐ์‚ฐ์˜ ๊ด„ํ˜ธ ์œ„์น˜(๊ฒฐํ•ฉ ์ˆœ์„œ)๋ฅผ ๋ฐ”๊ฟ”์„œ,
    ๋…๋ฆฝ์ ์ธ ์—ฐ์‚ฐ์„ ๋จผ์ € ์ˆ˜ํ–‰ํ•œ ๋’ค ๋งˆ์ง€๋ง‰์— ํ•ฉ์น˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ „ํ™˜.

๐Ÿ“ combine 7

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป ์ฝ”๋“œ ์„ค๋ช…

acc = acc OP (data[i] OP data[i+1])

2 * 1a loop unrolling

  • ํ•œ ๋ฃจํ”„์—์„œ ์ด 2๊ฐœ์˜ ์›์†Œ ์ฒ˜๋ฆฌ
  • ๋‘ ๊ฐ’์˜ ์—ฐ์‚ฐ์„ ์œ„ํ•œ ์ž„์‹œ ๋ ˆ์ง€์Šคํ„ฐ%xmm0์™€ ๋ˆ„์ ๊ฐ’ ์—ฐ์‚ฐ์„ ์œ„ํ•œ %xmm1
    ์ด ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ๋˜์–ด ์žˆ๋Š” ๋ˆ„์ ๊ฐ’ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ƒˆ๋กœ์šด ๋‘ ๊ฐ’์— ๋Œ€ํ•œ ์—ฐ์‚ฐ ํ›„ ๋ˆ„์ ๊ฐ’๊ณผ ์—ฐ์‚ฐ

๐Ÿ’พ ๋ ˆ์ง€์Šคํ„ฐ ์—ญํ• 

%rax : data ๋ฐฐ์—ด ์‹œ์ž‘ ์ฃผ์†Œ
%rbp : ์ข…๋ฃŒ ์ธ๋ฑ์Šค
%rdx : ํ˜„์žฌ ์ธ๋ฑ์Šค
%xmm0 : ์ž„์‹œ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ(data[i] * data[i+1])
%xmm1 : ๋ˆ„์  ๊ฒฐ๊ณผ ๊ฐ’

๐Ÿงฉ ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • load_1 : %rax, %rdx โ†’ i ๋ฒˆ์งธ ๊ฐ’ %xmm0์— ๋กœ๋“œ
  • load_2 : %rax, %rdx โ†’ i +1 ๋ฒˆ์งธ ๊ฐ’ %xmm0์— ๋กœ๋“œ๋œ ๊ฐ’์ด๋ž‘ ๊ฒฐํ•ฉํ•  ์ค€๋น„
  • mul_1 : ์ž„์‹œ %xmm0์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋‘ ๊ฐ’์˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๊ฐ’
  • mul_2 : %xmm1์— ๋ˆ„์ ๊ฐ’ ๊ฐฑ์‹ 
  • add, cmp, jne : %rdx ์ฆ๊ฐ€, %rbp ๋น„๊ต๋กœ ๋ฃจํ”„ ์ œ์–ด

โœ… ๊ฐ ๋ฐ˜๋ณต ์‹คํ–‰์— ๋Œ€ํ•ด์„œ๋Š” combine6๋‚˜ combine7์™€ ๋น„์Šทํ•˜๊ฒŒ ํ•ด๋…๋˜์ง€๋งŒ,
๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์„ ๋ณด์ธ๋‹ค

โญ๏ธ ์ฆ‰, ๋ฃจํ”„์•ˆ์—์„œ ํ•ด์•ผ ํ•˜๋Š” ์—ฐ์‚ฐ ์ž์ฒด๋Š” ๋ˆ„์ ๊ฐ’์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ์ „๋ถ€ ๊ณ„์‚ฐ ํ›„ ์žฌ๊ธฐ๋ก ํ•  ๋ฟ์ด๋‹ค.

โœ… ์š”์•ฝ

  • kร—1 ์–ธ๋กค๋ง: ๋ฃจํ”„ ์˜ค๋ฒ„ํ—ค๋“œ ์ค„์ด๊ณ , ์ผ์ • ์ˆ˜์ค€๊นŒ์ง€๋Š” throughput bound ์ ‘๊ทผ ๊ฐ€๋Šฅ.
  • ํ•˜์ง€๋งŒ ๋‹จ์ผ ๋ˆ„์‚ฐ๊ธฐ๋งŒ ์‚ฌ์šฉ โ†’ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ํ•œ๊ณ„
  • Reassociation + ๋‹ค์ค‘ ๋ˆ„์‚ฐ๊ธฐ: ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์„ ๋Š๊ณ , critical path๋ฅผ ์ค„์—ฌ
    latency bound๊นŒ์ง€ ๋ŒํŒŒ ๊ฐ€๋Šฅ.

์ด๋กœ์จ ๋ฃจํ”„ ํ’€๊ธฐ๋Š” โ€œ๋ฃจํ”„ ์ œ์–ด ์ตœ์ ํ™” โ†’ ๋ณ‘๋ ฌ ์‹คํ–‰ ๊ทน๋Œ€ํ™”โ€๋ผ๋Š” ๋‘ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ์•ผ ๋น„๋กœ์†Œ ํฐ ์ตœ์ ํ™” ํšจ๊ณผ๋ฅผ ๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€