์ง๊ธ๊น์ง๋ ๋ฃจํ ํน์ ํธ์ถ ๋ฑ์์ ๋ถํ์ํ ๋ฐ๋ณต ์ ๊ฑฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฐธ์กฐ ์ต์ ํ๋ฅผ ํตํด
ํ๋ก๊ทธ๋จ์ ๋ ๊ฐ๋ณ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด์๋ค.
ํ์ง๋ง โ๊ฐ๋ณ๊ฒ ๋ง๋๋ ๊ฒโ๋ง์ผ๋ก๋ ํ๊ณ๊ฐ ์๋ค.
ํ๋ ํ๋ก์ธ์๊ฐ ๊ฐ์ง ๋ณ๋ ฌ ์คํ ๋ฅ๋ ฅ์ ์ต๋ํ ํ์ฉํ๊ธฐ ์ํด์๋
๋ฃจํ ์์ฒด์ ๊ตฌ์กฐ๋ฅผ ๋ณํํ์ฌ ๋ ๋ง์ ์ฐ์ฐ์ ๋์์ ์งํํ ์ ์๋๋ก ๋ง๋ค์ด์ผ ํ๋ค.
๊ทธ ๋ํ์ ์ธ ๊ธฐ๋ฒ์ด ๋ฐ๋ก ๋ฃจํ ํ๊ธฐ(loop unrolling)์ ๋ค์ค ๋์ฐ๊ธฐ(multiple accumulators)๋ฅผ
ํ์ฉํ ๋ช
๋ น ์์ค ๋ณ๋ ฌ์ฑ(ILP, Instruction-Level Parallelism) ํ๋ ์ด๋ค.
๋ฃจํ์ ๋งค ๋ฐ๋ณต์คํ๋ง๋ค ๊ณ์ฐ๋๋ ์์์ ์ ์์ฒด๋ฅผ ์ฆ๊ฐ์์ผ์
๋ฃจํ์์์ ์ด ๋ฐ๋ณต ์คํ ํ์๋ฅผ ์ค์ด๋ ํ๋ก๊ทธ๋จ ๋ณํ
์ด๋ ๋๊ฐ์ง ์ธก๋ฉด์์ ์ด๋ฃจ์ด์ง ์ ์๋ค.
๐ฌ ๋ฃจํ ํ๊ธฐ์ ๊ธฐ๋ณธ ์์ด๋์ด๋ฅผ ์ดํด๋ณด์์ผ๋, ์ด์ ์ค์ ์ฝ๋ ์์ ๋ฅผ ํตํด
์ผ๋ง๋ ๋ฐ๋ณต ํ์๋ฅผ ์ค์ด๊ณ ๋ณ๋ ฌ์ฑ์ ๋์ด๋ผ ์ ์๋์ง ๋จ๊ณ๋ณ๋ก ํ์ธํด ๋ณด์.

acc = acc OP data[i]
%rax : data ๋ฐฐ์ด ์์ ์ฃผ์
%rbp : ์ข ๋ฃ ์ธ๋ฑ์ค ์กฐ๊ฑด
%rdx : ํ์ฌ ์ธ๋ฑ์ค
%xmm0 : ๋์ ๊ฐ(acc) ์ ์ฅ
%rdx โ ์ด๋ฒ ์ธ๋ฑ์ค์ ๋ํ ์ฃผ์ ๊ณ์ฐ %xmm0์ ์ ์ฅ๋์ด ์๋ ๋์ ๊ฐ acc์ ์ ๊ฐ ์ฐ์ฐ ํ ์ ์ฅ %rdx ์ฆ๊ฐ, %rbp ๋น๊ต๋ก ๋ฃจํ ์ ์ด 
acc = (acc OP data[i]) OP data[i+1]
2 * 1 loop unrolling
%rax : data ๋ฐฐ์ด ์์ ์ฃผ์
%rbp : ์ข ๋ฃ ์ธ๋ฑ์ค ์กฐ๊ฑด
%rdx : ํ์ฌ ์ธ๋ฑ์ค
%xmm0 : ๋์ ๊ฐ(acc) ์ ์ฅ
%rax, %rdx โ i ๋ฒ์งธ ์ธ๋ฑ์ค์ ๋ํ ์ฃผ์ ๊ณ์ฐ %xmm0์ ์ ์ฅ๋์ด ์๋ ๋์ ๊ฐ acc์ ์ ๊ฐ ์ฐ์ฐ ํ %xmm0 ์ ์ ์ฅ %rax, %rdx โ i+1 ๋ฒ์งธ ์ธ๋ฑ์ค์ ๋ํ ์ฃผ์ ๊ณ์ฐ %xmm0์ ์ ์ฅ๋์ด ์๋ ๋์ ๊ฐ acc(i๋ฒ์งธ ๊ฐ ํฌํจ)์ ์ ๊ฐ ์ฐ์ฐ ํ %xmm0 ์ ์ ์ฅ %rdx ์ฆ๊ฐ, %rbp ๋น๊ต๋ก ๋ฃจํ ์ ์ด
acc = (acc OP data[i]) OP data[i+1];acc = ((acc OP data[i]) OP data[i+1]) OP data[i+2];acc์ ์์กด โ acc = acc OP data[i]๊ฐ ๋๋์ผ ๋ค์ ์ฐ์ฐ ์์ ๊ฐ๋ฅ.cmp, jne) ๊ฐ์. ๐ฌ ์ฆ, ๋ฐฉ๊ธ ๋ณธ ๊ฒ ์ฒ๋ผ k * 1 ๋ฃจํ ํ๊ธฐ ๋ง์ผ๋ก๋ ์ฑ๋ฅ ๊ฐ์ ์ ์ ํ์ด ์๊ธด๋ค.
๋ ํฐ ๊ฐ์ ์ ์ํ๋ค๋ฉด ๐ ๋ค์ค ๋์ฐ๊ธฐ(multiple accumulators) ๊ธฐ๋ฒ์ด ํ์ํ๋ค.
๐ฌ ์์์ ๋ณธ ๊ฒ ์ฒ๋ผ ์ง๊ธ๊น์ง ์ฐ๋ฆฌ์ ํจ์๋ค์ ์ฐ์ ์ฐ์ฐ ์ ๋๋ค์ ์ง์ฐ์๊ฐ์ผ๋ก ์ธํ ๊ฒฝ๊ณ๊ฐ์ ๊ฐ์ก๋ค. ์ง๊ธ๋ถํฐ ์ด ์์ฐจ์ ์์กด์ฑ์ ๊นจ๊ณ , ์ง์ฐ์๊ฐ ๊ฒฝ๊ณ๊ฐ๋ณด๋ค ์ข์ ์ฑ๋ฅ์ ์ป์ ์ ์๋ ๋ฐฉ๋ฒ๋ค์ ์ดํด๋ณผ ๊ฒ์ด๋ค.
์ ์ ๋ง์ ์ด๋ ๊ณฑ์ ๊ณผ ๊ฐ์ด ๊ตํ์ฑ๊ณผ ๊ฒฐํฉ์ฑ์ด ์๋ ์ฐ๊ฒฐ์ฐ์ฐ์ ๋ํด
์ฐ๊ฒฐ์ฐ์ฐ์ ์งํฉ์ ์ฌ๋ฌ ๋ถ๋ถ์ผ๋ก ๋๋๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ง์ง๋ง์ ํฉ์น๋ ๋ฐฉ๋ฒ
์ฆ, ๋ฐ๋ณต์คํ๋ง๋ค ๋ณด๋ค ๋ง์ ์์๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํ N์ค ๋ฃจํ ํ๊ธฐ์
๊ตํ, ๊ฒฐํฉ์ฑ์ด ์๋ ์ฐ๊ฒฐ์ฐ์ฐ์ ์งํฉ์ ๋๋์ด ๋์ ์ฐ์ฐํ๋ N์ค ๋ณ๋ ฌ์ฑ์ ๋ชจ๋ ์ฌ์ฉํ ๊ฒ์ด๋ค

acc0 = acc0 OP data[i];
acc1 = acc1 OP data[i];
2 * 2 loop unrolling
%xmm0์ ํ์ ๋ฒํธ๋ฅผ ๊ฐ๋ ์์๋ค์ ์ํ %xmm1%rax : data ๋ฐฐ์ด ์์ ์ฃผ์
%rbp : ์ข ๋ฃ ์ธ๋ฑ์ค
%rdx : ํ์ฌ ์ธ๋ฑ์ค
%xmm0 : ์ง์ ์ธ๋ฑ์ค ๋์ ๊ฐ
%xmm1 : ํ์ ์ธ๋ฑ์ค ๋์ ๊ฐ
%rax, %rdx โ i ๋ฒ์งธ ์ธ๋ฑ์ค์ ๋ํ ์ฃผ์ ๊ณ์ฐ %xmm0์ ์ ์ฅ๋์ด ์๋ ๋์ ๊ฐ acc์ ์ ๊ฐ ์ฐ์ฐ ํ %xmm0 ์ ์ ์ฅ %rax, %rdx โ i +1 ๋ฒ์งธ ์ธ๋ฑ์ค์ ๋ํ ์ฃผ์ ๊ณ์ฐ %xmm1์ ์ ์ฅ๋์ด ์๋ ๋์ ๊ฐ acc(i๋ฒ์งธ ๊ฐ ํฌํจ)์ ์ ๊ฐ ์ฐ์ฐ ํ %xmm1 ์ ์ ์ฅ %rdx ์ฆ๊ฐ, %rbp ๋น๊ต๋ก ๋ฃจํ ์ ์ดโก๏ธ ์ฆ, k๋ฅผ ์ถฉ๋ถํ ํค์ฐ๋ฉด CPE๊ฐ ๊ฑฐ์ throughput bound์ ๊ฐ๊น์์ง์ ์ ์ ์๋ค.
์ฆ, L ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๊ธฐ๊ณ๊ฐ C๊ฐ ์์ผ๋ ์ต๋ ์ฒ๋ฆฌ๋์ ๋ด๋ ค๋ฉด L * C ๊ฐ์ ์์ ์ ํ๋ฒ์ ๋งก๊ฒจ์ผํ๋ค.
acc ํ๋๋ง ์ฐ๋ฉด ์ฌ์ ํ ๋ฐ์ดํฐ ์์กด์ฑ์ด ์กด์ฌํ๋ฏ๋ก, ์๋ฒฝํ ์ฑ๋ฅ ๊ฐ์ ์ ์ด๋ ต๋ค. kร1 ์ธ๋กค๋ง๋ง์ผ๋ก๋ ๋ฐ์ดํฐ ์์กด์ฑ์ด ์ฌ์ ํ ๋จ๋๋ค.
acc = acc OP (data[i] OP data[i+1])
2 * 1a loop unrolling
%xmm0์ ๋์ ๊ฐ ์ฐ์ฐ์ ์ํ %xmm1%rax : data ๋ฐฐ์ด ์์ ์ฃผ์
%rbp : ์ข ๋ฃ ์ธ๋ฑ์ค
%rdx : ํ์ฌ ์ธ๋ฑ์ค
%xmm0 : ์์ ๊ณ์ฐ ๊ฒฐ๊ณผ(data[i] * data[i+1])
%xmm1 : ๋์ ๊ฒฐ๊ณผ ๊ฐ
%rax, %rdx โ i ๋ฒ์งธ ๊ฐ %xmm0์ ๋ก๋%rax, %rdx โ i +1 ๋ฒ์งธ ๊ฐ %xmm0์ ๋ก๋๋ ๊ฐ์ด๋ ๊ฒฐํฉํ ์ค๋น%xmm0์ ์ ์ฅ๋์ด ์๋ ๋ ๊ฐ์ ์ฐ์ฐ ๊ฒฐ๊ณผ๊ฐ%xmm1์ ๋์ ๊ฐ ๊ฐฑ์ %rdx ์ฆ๊ฐ, %rbp ๋น๊ต๋ก ๋ฃจํ ์ ์ดโ
๊ฐ ๋ฐ๋ณต ์คํ์ ๋ํด์๋ combine6๋ combine7์ ๋น์ทํ๊ฒ ํด๋
๋์ง๋ง,
๋ค๋ฅธ ๋ฐ์ดํฐ ์์กด์ฑ์ ๋ณด์ธ๋ค
โญ๏ธ ์ฆ, ๋ฃจํ์์์ ํด์ผ ํ๋ ์ฐ์ฐ ์์ฒด๋ ๋์ ๊ฐ์ ์์กดํ์ง ์๊ณ ์ ๋ถ ๊ณ์ฐ ํ ์ฌ๊ธฐ๋ก ํ ๋ฟ์ด๋ค.
์ด๋ก์จ ๋ฃจํ ํ๊ธฐ๋ โ๋ฃจํ ์ ์ด ์ต์ ํ โ ๋ณ๋ ฌ ์คํ ๊ทน๋ํโ๋ผ๋ ๋ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ๋น๋ก์ ํฐ ์ต์ ํ ํจ๊ณผ๋ฅผ ๋ผ ์ ์๋ค.