ํ์๊ฐ Princeton University๊ฐ Coursera์์ ์ ๊ณตํ๋ Computer Architecture (Instructor: David Wentzlaff)๋ฅผ ๋ฃ๊ณ ์ผ๋ถ๋ฅผ ์์ฝํด ์ ๋ฆฌํ ๊ธ์
๋๋ค.
์ด ๊ธ์์๋ ๋ณ๋ ฌ ํ๋ก๊ทธ๋๋ฐ์ ์ํ ์ํคํ
์ฒ์ธ Vector, SIMD(Single Instruction, Multiple Data), ๊ทธ๋ฆฌ๊ณ GPU๋ฅผ ์๊ฐํ๋ค.
Vector
๋จผ์ ๋ฒกํฐ ํ๋ก์ธ์์ ์ ์๋ฅผ ์์๋ณด์.
In computing, a vector processor or array processor is a central processing unit (CPU) that implements an instruction set where its instructions are designed to operate efficiently and effectively on large one-dimensional arrays of data called vectors. (Wikipedia)
์ฆ, ๋ฒกํฐ ํ๋ก์ธ์๋ vector๋ผ๊ณ ๋ถ๋ฆฌ๋ 1์ฐจ์ ๋ฐฐ์ด์ ๋ํ ์ผ๊ด์ ์ธ ์ฐ์ฐ์ ์ง์ํ๋ ์ํคํ
์ฒ๋ฅผ ๊ฐ์ถ๊ณ ์์ด์ผ ํ๋ค. ์ด๋ฌํ ๋ฒกํฐ ์ํคํ
์ฒ๋ ์ด๋ป๊ฒ ๊ตฌํ๋๊ณ , ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์๋์ง ๊ฐ๋ตํ๊ฒ ์์๋ณธ๋ค.
Vector Programming Model
์ํํธ์จ์ด์ ์
์ฅ์์ ๋ฐ๋ผ๋ณธ Vector Programming Model์ ๋จผ์ ์์๋ณด์. ๋จผ์ ๋ฒกํฐ ํ๋ก์ธ์์๋ ๋ฒกํฐ, ์ฆ 1์ฐจ์ ๋ฐฐ์ด์ ์ ์ฅํ๊ธฐ ์ํ vector register๊ฐ ์๋ค. ๋ํ VLR
(Vector Length Register)์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ค์นผ๋ผ ๋ ์ง์คํฐ๊ฐ ์์ด ๋ฒกํฐ์ ์ต๋ ๊ธธ์ด๋ฅผ ์ ํ ์ ์๊ฒ ๋์ด ์๋ค.
Vector ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํ๋ ๋ํ์ ์ธ ์ํคํ
์ฒ๋ก๋ VMIPS๊ฐ ์๋๋ฐ, ์ด๋ฆ์์๋ ์ ์ ์๋ฏ MIPS์์ ํ์๋ ์ํคํ
์ฒ์ด๋ค. VMIPS์์๋ MIPS์ ์ค์นผ๋ผ ์ฐ์ฐ instruction๋ช
์ V
์ S
๋ฅผ ๋ถ์ฌ ๋ฒกํฐ ์ฐ์ฐ์์ ๋ช
์ํ๋ค. ์๋ฅผ ๋ค์ด,
ADDVV
๋ ๋ ๋ฒกํฐ ์ฌ์ด์ ๋ง์
์ ์๋ฏธํ๋ค.
ADDVS
๋ ๋ฒกํฐ ํ๋์ ์ค์นผ๋ผ ํ๋ ์ฌ์ด์ ๋ง์
์ ์๋ฏธํ๋ค. ์ฆ, ๋์ผํ ์ค์นผ๋ผ ๋ณ์๊ฐ ๋ฒกํฐ์ ๊ฐ ์์์ ๋๊ฐ์ด ๋ํด์ง๋ค.
์ด๋ ๊ฒ ๋ฒกํฐ ์ฐ์ฐ์ ํ๊ธฐ ์ํด์๋ ๋จผ์ ๋ฒกํฐ ๋ ์ง์คํฐ์ ๊ฐ๋ค์ด ์ ์ฅ๋์ด ์์ด์ผ ํ ๊ฒ์ด๋ค. VMIPS์์๋ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ก๋ถํฐ ๋ฒกํฐ ๋ ์ง์คํฐ๋ก ๊ฐ์ ๋ถ๋ฌ์ค๊ณ ์ ์ฅํ๊ธฐ ์ํด vector load/store ์ฐ์ฐ๋ค์ ์ง์ํ๋ค. ์๋ฅผ ๋ค์ด,
LV v1, r1, r2
๋ r1
์์ ์์ํด r2
์ stride๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ์ฌ r1
, r1 + r2
, r1 + 2 * r2
, $\cdots$์ ์ฃผ์์ ์๋ ๊ฐ๋ค์ ์ฐจ๋ก๋๋ก ๋ฒกํฐ ๋ ์ง์คํฐ v1
์ ๋ถ๋ฌ์ค๋๋ก ํ๋ค.
LV v1, r1
์ด๋ผ๊ณ ๋ง ํ๋ฉด stride r2
๊ฐ ๊ธฐ๋ณธ๊ฐ์ธ 1๋ก ์ค์ ๋๋ค.
Example: Element-wise Multiplication
๋ค์์ C ์ฝ๋๋ฅผ ์ค์นผ๋ผ์ ๋ฒกํฐ๋ฅผ ์ฌ์ฉํด ๊ฐ๊ฐ ์ปดํ์ผํ๋ค๊ณ ํด๋ณด์.
for(i = 0; i < 64; i++){
C[i] = A[i] * B[i];
}
# Scalar Assembly Code
LI R4, 64
loop:
L.D F0, 0(R1)
L.D F2, 0(R2)
MUL.D F4, F2, F0
S.D F4, 0(R3)
DADDIU R1, 8
DADDIU R2, 8
DADDIU R3, 8
DADDIU R4, 1
DADDIU R1, 8
BNEZ R4, loop
์ค์นผ๋ผ ํ๋ก์ธ์์์๋ ์ค์ ๋ก i
์ ๊ฐ์ ์ฆ๊ฐ์์ผ ๊ฐ๋ฉด์ &A[i]
์ &B[i]
์ ์ ๊ทผํด ์ด๋ค ๊ฐ์ ๋ ์ง์คํฐ๋ก ๋ถ๋ฌ์ค๊ณ , ์ด๋ฅผ ๊ณฑํ ํ &C[i]
์ ์ฃผ์๋ก ์ ์ฅํ๋ ๊ณผ์ ์ ์ํํด์ผ ํ๋ค. ๋ฐ๋ฉด ๋ฒกํฐ๋ฅผ ์ฌ์ฉํ ๋๋ฅผ ๋ณด์.
# Vector Assembly Code
L1 VLR, 64
LV V1, R1
LV V2, R2
MULVV.D V3, V1, V2
SV V3, R3
๋ฒกํฐ์ ๊ฒฝ์ฐ vector length register์ item์ ๊ฐ์์ธ 64๋ฅผ ๋์
ํ ํ, A[i]
๊ณผ B[i]
(i=0, 1, ... 63
)๋ฅผ ๊ฐ๊ฐ LV
๋ฅผ ์ฌ์ฉํด ๋ฒกํฐ ๋ ์ง์คํฐ์ ๋ก๋ฉํด์จ ํ MULVV.D
๋ฅผ ์ฌ์ฉํด ํ๋ฒ์ ๊ณฑ์
์ ์ํํ ์ ์๋ค.
Vector Arithmetic Execution
๋ฒกํฐ ํ๋ก์ธ์๋ค์ ๋งค์ฐ ๊น์ pipeline์ ์ฌ์ฉํด vector register์ ์ ์ฅ๋ element๋ค์ ํ๋์ฉ ์ฐ์ฐ์ ํ๋ค. pipeline์ด ๊น๋ค๋ ๊ฒ์ ์ฐ์ฐ ๋ก์ง์ ์๊ฒ ์ชผ๊ฐ ๋์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก clock์ ๋๊ฒ ์ค์ ํ ์ ์๊ณ , ์ฐ์ฐ์ ๋น ๋ฅด๊ฒ ์ํํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ์ด๋ ๋ฒกํฐ์ ๊ฐ ์์๋ค์ ์๋ก ๋
๋ฆฝ์ ์ด๋ฏ๋ก data hazard์ด ๋ฐ์ํ์ง ์์ bypassing ๋ฑ์ ๋ถํ์ํ๋ค.
Interleaved Vector Memory System
ํํธ, vector๊ฐ ํ์ฌ๋ system์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ ์์คํ
์ ๋ณ๊ฒฝ์ด ํ์ํ๋ค. Vector load ์ฐ์ฐ์ ํ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ read์ ํ์๊ฐ ๋๋ฌด ๋ง๊ธฐ ๋๋ฌธ์, memory load ๊ณผ์ ์ interleavingํ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ์ํด ๋ง์ ๋ฒกํฐ ์์คํ
์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ์ banking์ ๋์
ํ๋ค. ์์๋ก Cray-1์ ๋ฉ์ธ ๋ฉ๋ชจ๋ฆฌ๋ 16๊ฐ์ memory bank๋ก ์ด๋ฃจ์ด์ ธ ์์ด, ๊ฐ๊ฐ์ด ์ ์ฒด ์ฃผ์ ๊ณต๊ฐ์ $\frac{1}{16}$์ ํด๋นํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ด๋ค. Cray-1์์ ๊ฐ๊ฐ์ bank๋ busy time (bank๊ฐ ๋ค์ request๋ฅผ ๋ฐ์ ์ค๋น๊ฐ ๋๊ธฐ๊น์ง ๊ฑธ๋ฆฌ๋ ์๊ฐ)์ด 4 ์ฌ์ดํด, latency๊ฐ 16 ์ฌ์ดํด์ผ๋ก ์ค๊ณ๋์ด ์๋ค. ์ฆ (๋ฒกํฐ์ ์ต๋ ๊ธธ์ด์ธ) 64๊ฐ์ ์์๋ฅผ ๋ก๋ฉํ๋ค๋ฉด, ๊ฐ bank์ ํ๊ฒ ์ฃผ์๊ฐ ๊ณ ๋ฅด๊ฒ ๋ถํฌํ๋ค๋ ๊ฐ์ ํ์ $4 \times 3 + 16 = 28$ ์ฌ์ดํด๋ง์ 64๊ฐ์ ์์๋ฅผ ๋ฒกํฐ ๋ ์ง์คํฐ์ ๋ก๋ํ ์ ์๋ค.
Vector Processing Optimization
Example: Pipeline Diagram
for(i = 0; i < 4; i++){
C[i] = A[i] * B[i];
}
๋ผ๋ ์ฝ๋๊ฐ ์ฃผ์ด์ ธ ์์ ๋, ์ปดํ์ผ๋ ์ด์
๋ธ๋ฆฌ๊ฐ ๋ค์๊ณผ ๊ฐ๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ฒกํฐ ํ๋ก์ธ์๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ pipeline diagram์ ๊ทธ๋ ค๋ณด์.
ํ์ดํ๋ผ์ธ์ ์์ ๊ฐ์ ๊ตฌ์กฐ๋ผ๊ณ ๊ฐ์ ํ๋ค. ์ฌ๊ธฐ์ F, D, R, W์ ๊ฐ๊ฐ fetch, decode, register access, write-back์ด๊ณ X, L, S, Y๋ ๊ฐ๊ฐ ๋ง์
, memory load/store, ๊ณฑ์
์ด๋ผ๊ณ ๊ฐ์ ํ๋ค.
LI VLR, 4
LV V1, R1
LV V2, R2
MULVV.D V3, V1, V2
SV V3, R3
LV V2.. | F | D | R | L0 | L1 | W | | | | | | | | | | | | | | | | | | | |
| | | | R | L0 | L1 | W | | | | | | | | | | | | | | | | | | |
| | | | | R | L0 | L1 | W | | | | | | | | | | | | | | | | | |
| | | | | | R | L0 | L1 | W | | | | | | | | | | | | | | | | |
MULVV.D | | F | D | D | D | D | D | D | D | R | Y0 | Y1 | Y2 | Y3 | W | | | | | | | | | | |
| | | | | | | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | | | | | | | | |
| | | | | | | | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | | | | | | | |
| | | | | | | | | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | | | | | | |
SV | | | F | F | F | F | F | F | F | D | D | D | D | D | D | D | D | D | R | S0 | S1 | W | | | |
| | | | | | | | | | | | | | | | | | | | R | S0 | S1 | W | | |
| | | | | | | | | | | | | | | | | | | | | R | S0 | S1 | W | |
| | | | | | | | | | | | | | | | | | | | | | R | S0 | S1 | W |
๋ฒกํฐ instruction์ ์คํ์์ chime์ด๋ผ๋ ๊ฐ๋
์ ์ ์ํ ์ ์๋ค. ์ด๋ instruction์ ์คํํ๊ธฐ ์์ํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ overhead๋ฅผ ๋ชจ๋ ์ ์ธํ๊ณ , ํด๋น instruction์ผ๋ก vector sequence๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ฏธํ๋ค. ์์ ๊ฒฝ์ฐ, vector length๊ฐ 4์ผ ๋ chime์ด 4๋ผ๊ณ ๋งํ ์ ์๋ค.
diagram์ ๋ณด๋ฉด, LV
์์ 4๊ฐ์ load๊ฐ ๋ชจ๋ ์๋ฃ๋ ๋๊น์ง ๋ค์ ๋จ๊ณ๊ฐ ์งํ๋์ง ์๋ ๋นํจ์จ์ด ๋ฐ์ํ๋ ๊ฒ์ ์ ์ ์๋ค.
ํนํ ์์ pipeline diagram์์๋ ๊ฐ cycle์ ํ๋์ functional unit๋ง์ด ์คํ๋์๋ค. ์ด๋ฅผ ๊ฐ์ ํ์ฌ, superscalar processor์ฒ๋ผ ์ฌ๋ฌ FU๊ฐ ๋์์ ์คํ๋ ์ ์๋๋ก ํ ์ ์๋ค. ์ด๋ ๊ฒ vector instruction parallelism์ ์ต๋ํ exploitํ ์ ์๋๋ก ํ๋์จ์ด๋ฅผ ๊ฐ์ ํด๋ณด์.
Vector Chaining
๋ฒกํฐ ํ๋ก์ธ์์์๋ ๊ธฐ์กด ์ค์นผ๋ผ ํ๋ก์ธ์์ bypassing๊ณผ ์ ์ฌํ ํ
ํฌ๋์ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฅผ Vector Chaining์ด๋ผ ํ๋ค.
LV V1
MULVV V3, V1, V2
ADDVV V5, V3, V4
์๋ฅผ ๋ค์ด ์์ ์ฝ๋์์๋ LV V1
์ ๊ฒฐ๊ณผ๋ก ๋์จ V1
๋ ์ง์คํฐ์ ๊ฐ์ด ๊ณง๋ฐ๋ก MULVV
์ ์
๋ ฅ์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋๊ณ , MULVV
์ ๊ฒฐ๊ณผ๋ก ๋์จ V3
๋ ๋ค์ ADDVV
์ ์
๋ ฅ์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋๋ค.
์ด๋ chaining(ํน์ ๊ธฐ์กด ์ฉ์ด๋ก bypassing)์ register file์ ๊ฑฐ์ณ์ ์ผ์ด๋๋ค. ์ฆ, ์ค์นผ๋ผ ํ๋ก์ธ์์์ ํํ ๋ณด๋ ๊ฒ์ฒ๋ผ execution stage๊ฐ ๋๋ ๊ฐ์ด ์์ฑ๋์๋ง์ ๋ค์ ์ฌ์ดํด์ ์ด๋ฅผ ์ฌ์ฉํด ๋ค๋ฅธ instruction์ด execution์ ํ ์ ์๊ฒ ๋๋ ๊ฒ์ ์๋๊ณ , register์ write๋ฅผ ํ๊ณ ๋ค์ read๋ฅผ ํ๋ ๊ณผ์ ์ด ํ์ํ๋ค. ๋ฐ๋ผ์ ๋ ์ฌ์ดํด(์์ instruction์ register write, ์ด์ ์์กดํ๋ instruction์ register read)์ ๋ญ๋น๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
Vector chaining์ด ์ ์ฉ๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํ๊ณ pipeline diagram์ ๋ค์ ๊ทธ๋ ค๋ณด์.
LV V2.. | F | D | R | L0 | L1 | W | | | | | | | | | | | | | |
| | | | R | L0 | L1 | W | | | | | | | | | | | | |
| | | | | R | L0 | L1 | W | | | | | | | | | | | |
| | | | | | R | L0 | L1 | W | | | | | | | | | | |
MULVV.D | | F | D | D | D | D | R | Y0 | Y1 | Y2 | Y3 | W | | | | | | | |
| | | | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | | | | | |
| | | | | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | | | | |
| | | | | | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | | | |
SV | | | F | F | F | F | D | D | D | D | D | D | R | S0 | S1 | W | | | |
| | | | | | | | | | | | | | R | S0 | S1 | W | | |
| | | | | | | | | | | | | | | R | S0 | S1 | W | |
| | | | | | | | | | | | | | | | R | S0 | S1 | W |
์ด๋ MULVV.D
์ ์ฒซ ์ฌ์ดํด์ ๋ณด๋ฉด LV V2, R2
์ ์ฒซ ๋ฒ์งธ item์ด ๋ ์ง์คํฐ ํ์ผ์ write๋ ๊น์ง ๊ธฐ๋ค๋ฆฐ ํ ์ด๋ฅผ ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ ์์ ์ค๋ช
ํ ๊ฒ๊ณผ ๊ฐ์ด 2์ฌ์ดํด์ด ๋ญ๋น๋๋ ๊ฒ์ ์ ์ ์๋ค. ๋ ์ง์คํฐ ํ์ผ์ ๊ฑฐ์น์ง ์๊ณ ์ค์นผ๋ผ ํ๋ก์ธ์์์ ํ๋ ๊ฒ์ฒ๋ผ bypassing network๋ฅผ ์ฌ์ฉํ๋ฉด ์ด ๋ญ๋น๋ฅผ ์ค์ผ ์ ์์ผ๋, ์ด ๊ฒฝ์ฐ ๋ ์ง์คํฐ ํ์ผ์ multiported๋ก ๋ฐ๊พธ์ง ์๋ ํ register read์์ structural hazard๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
๋ง์ฝ ๋ ์ง์คํฐ ํ์ผ์ด multiported๋ผ vector chaining์ด ๋ ์ง์คํฐ๋ฅผ ๊ฑฐ์น์ง ์์๋ ๋๋ ๊ฒฝ์ฐ, pipeline diagram์ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค.
LV V2.. | F | D | R | L0 | L1 | W | | | | | | | | | |
| | | | R | L0 | L1 | W | | | | | | | | |
| | | | | R | L0 | L1 | W | | | | | | | |
| | | | | | R | L0 | L1 | W | | | | | | |
MULVV.D | | F | D | D | R | Y0 | Y1 | Y2 | Y3 | W | | | | | |
| | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | | | |
| | | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | | |
| | | | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | |
SV | | | F | F | D | D | D | D | R | S0 | S1 | W | | | |
| | | | | | | | | | R | S0 | S1 | W | | |
| | | | | | | | | | | R | S0 | S1 | W | |
| | | | | | | | | | | | R | S0 | S1 | W |
Vector Instruction Execution with Multiple Lanes
Chime์ ๊ฐ์์ํค๊ธฐ ์ํด์๋ execution step์ ๋ณ๋ ฌํ๊ฐ ํ์ํ๋ค. ์ด๋ฅผ ์ํด์๋ ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋์ผํ functional unit ๋ค์ด ๋ ๊ฐ ์ด์์ฉ ์์ด์ผ ํ๋ค.
์์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ 2-way vector stripping์ด ์ ์ฉ๋ ๊ฒฝ์ฐ, pipeline diagram์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๋๊ฒ ๋๋ค.
LV V2... | F | D | D | R | L0 | L1 | W | | | | | | | |
| | | | | R | L0 | L1 | W | | | | | | |
| | | | R | L0 | L1 | W | | | | | | | |
| | | | | R | L0 | L1 | W | | | | | | |
MULVV.D | | | F | D | D | R | Y0 | Y1 | Y2 | Y3 | W | | | |
| | | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | |
| | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | | |
| | | | | | | R | Y0 | Y1 | Y2 | Y3 | W | | |
SV | | | | F | F | D | D | D | D | R | S0 | S1 | W | |
| | | | | | | | | | | R | S0 | S1 | W |
| | | | | | | | | | R | S0 | S1 | W | |
| | | | | | | | | | | R | S0 | S1 | W |
๋ค์ด์ด๊ทธ๋จ์ ๋ณด๋ฉด, ๊ฐ๊ฐ์ ๋ช
๋ น์ด(LV
, MULVV.D
, SV
)๋ฅผ ์ฒ๋ฆฌํ ๋ ๋ ๊ฐ์ฉ์ operation์ด ์ง์ง์ด์ ๋์์ ์ผ์ด๋๋ค. ์๋ฅผ ๋ค์ด์, ๋ค์ด์ด๊ทธ๋จ์ ์ฒซ ๋ ์ค์ A[0]
์ A[2]
๊ฐ ๋ก๋ฉ๋๋ ๊ฒ์ผ๋ก, ๊ทธ ๋ค์ ๋ ์ค์ A[1]
๊ณผ A[3]
๊ฐ ๋ก๋ฉ๋๋ ๊ฒ์ผ๋ก ์๊ฐํ ์ ์๋ค. ์ด๋ฅผ ํตํด chime์(VLR=4์ผ ๋) 4์์ 2๋ก ๊ฐ์ํ๋ค. ์ด๊ฒ์ ๋์ผ functional unit์ด ๋ ๊ฐ์ฉ ์๊ธฐ์ ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
Vector Stripmining
์ง๊ธ๊น์ง๋ ๋ฒกํฐ ๋ ์ง์คํฐ์ ๋ค์ด๊ฐ๋ ์์์ ์๊ฐ ๋ง์ง ์์ ๊ฒฝ์ฐ๋ง์ ๋ค๋ฃจ์์ผ๋, ๋ฒกํฐ ๋ ์ง์คํฐ์ ๋ค์ด๊ฐ ์ ์๋ ์์์ ๊ฐ์๋ ์ ํํ๋ค. ๋ฐ๋ผ์ ์ด๋ฅผ ๋๋ ๊ธธ์ด์ array์ ๋ํด์๋ vector instruction์ ์ฌ๋ฌ ๋ฒ ์ชผ๊ฐ์ด ์คํํด์ฃผ์ด์ผ ํ๋ค. ์ด๋ฅผ vector stripmining์ด๋ผ๊ณ ํ๋ค.
๊ทธ๋ฆผ์ ์ฝ๋์ ๊ฒฝ์ฐ์๋ ์ต๋ ๋ฒกํฐ ๊ธธ์ด๊ฐ 64์ธ ์ํคํ
์ฒ๋ก, $N\mod 64$๊ฐ์ ์์์ ๋ํด ๋จผ์ ๊ณ์ฐ์ ๋ง์น ํ 64๊ฐ์ฉ ๋ฐ๋ณตํ์ฌ ๊ณ์ฐ์ ํ๋ ๊ฒ์ ์ ์ ์๋ค. Vector stripmining์ ํ๋ ๊ฒฝ์ฐ ์ด์ฒ๋ผ ๋ฒกํฐ ์ฐ์ฐ ์์ฒด๋ฅผ ์ ์ธํ๋๋ผ๋ ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๋ฅผ ํ๋ ์ฝ๋์ ๋น์ค์ด ๋ง์์ง๋ฏ๋ก, $N$์ด ์๋์ ์ผ๋ก ์๋ค๋ฉด ์ด๋ฌํ ์ฒ๋ฆฌ์ overhead์ ๋น์ค์ด ์ปค์ ธ ์ฑ๋ฅ์ด ๊ธฐ๋์ ๋ฏธ์น์ง ๋ชปํ ์ ์๋ค.
Vector ISA์ ์ฅ์
Vector ํ๋ก์ธ์๋ ์ผ๋ฐ์ ์ธ ์ค์นผ๋ผ ํ๋ก์ธ์์ ๋นํด ๋ค์๊ณผ ๊ฐ์ ์ฅ์ ์ ๊ฐ์ง๋ค.
- Compact: ํ instruction์ด
N
๊ฐ์ operation์ ์ธ์ฝ๋ฉํ๊ณ ์์ผ๋ฏ๋ก ๋ช
๋ น์ด ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํ๋ค.
- Expressive: Vector ISA๋ก instruction์ ํํํ ์,
N
๊ฐ์ instruction๋ค์ด
- independentํ๊ณ
- ๋์ผํ functional unit์ ์ฌ์ฉํ๋ฉฐ
- ์ฌ์ฉํ๋ register๊ฐ ๊ฒน์น์ง ์๊ณ (์ฆ dependence, data hazard๊ฐ ์๊ณ )
- ์ด์ instruction๊ณผ ๊ฐ์ ํจํด์ access๋ฅผ ํ๋ฉฐ
- ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ธ ๋ธ๋ก๋ค์ ์ด์ฉํ๋ฉฐ
- strided load/access์ ํจํด์ผ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํจ์ ํ๋์จ์ด์ ์์์ ์ผ๋ก ์๋ ค์ค ์ ์๋ค.
- Scalable: lane์ ๋ํด ํ์ฅ๋ ํ์ดํ๋ผ์ธ์์๋ ๋์ผํ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค.
Code Vectorization
์ฝ๋๋ฅผ ์ปดํ์ผ ํ ๋, sequentialํ ์ฝ๋๋ฅผ ์ฌ๋ฐฐ์ดํ์ฌ ๋ฒกํฐ๋ฅผ ํ์ฉํ ์ฝ๋๋ฅผ ๋ง๋๋ ๊ฒ์ code vectorization(์ฝ๋ ๋ฒกํฐํ)์ด๋ผ๊ณ ํ๋ค. ์ด๋ ๋ฐ๋ณต๋ฌธ์ ๊ฐ iteration๊ฐ ์์กด์ฑ์ ๋ํ ๊น์ ๋ถ์์ด ํ์ํ๋ค. ์ด ๋จ๋ฝ์์๋ ๋ฐ๋ณต๋ฌธ์์ ํํ ๋ฐ์ํ๋ ์ฌ๋ฌ ํจํด๋ค์ vectorizeํ๋ ์ฌ๋ฌ ์์๋ฅผ ์๊ฐํ๋ค.
Conditional Execution
for(i = 0; i < N; i++){
if(A[i] > 0) A[i] = B[i];
}
์ ์ฝ๋์ ๊ฒฝ์ฐ ๋ฐฐ์ด์ ๋ชจ๋ ์์์ ๋ํด์ ๋์ผํ ์ฐ์ฐ์ด ์ ์ฉ๋์ง ์๊ณ ์๋ค. A[i]
๊ฐ ์์์ธ ๊ฒฝ์ฐ์๋ง ๋์
์ฐ์ฐ์ ์คํํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ, predicated register์ ๋ฒกํฐ ๋ฒ์ ์ด๋ผ๊ณ ๋ ํ ์ ์๋ vector mask(๋๋ vector flag)๋ฅผ ์ถ๊ฐํ์ฌ ์ฝ๋๋ฅผ ๋ฒกํฐํํ ์ ์๋ค. Vector mask๋ ๊ฐ ์์๋น 1bit๋ฅผ ์ฐจ์งํ๋๋ก ๋์ด ์๋ ๋ฐฐ์ด์ผ๋ก, ๊ฐ๊ฐ์ ์์์ ๋ํด ์ฐ์ฐ์ ์ ์ฉํ ์ง ๋ง์ง๋ฅผ ๋ช
์ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
Conditional execution์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ ๋ ๊ฐ์ง๊ฐ ์์ ๊ฒ์ด๋ค.
- ๋จ์ํ ๋ฐฉ๋ฒ์ผ๋ก, ๊ณ์ฐ ์์ฒด๋ ๋ชจ๋ ์ํํ ํ mask bit๋ฅผ ๋ ์ง์คํฐ ์ฐ๊ธฐ์ ๋ํ enabler๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์๋ค.
- ๋์ฑ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก, mask vector ์ ์ฒด๋ฅผ ํ๋ฒ ์ฝ์ ํ, ์คํ ์์ฒด๋ฅผ mask๊ฐ 0์ด ์๋ ์์๋ค์ ๋ํด์๋ง ํ ์ ์๋ค.
- ์ด ๊ฒฝ์ฐ ๊ตฌํ์ด ์ด๋ ค์ ๋๋ฆฌ ์ฌ์ฉ๋์ง๋ ์๋๋ค.
Vector Reductions
Vector reduction์ด๋ ๋ฒกํฐ๋ฅผ ์
๋ ฅ์ผ๋ก ๋ฐ์ ์ค์นผ๋ผ๋ฅผ ๋ฐํํ๋ ์ฐ์ฐ์ ์๋ฏธํ๋ค. ๊ฐ๋จํ ์์๋ก ๋ฒกํฐ ์ ์ฒด์ ํฉ์ ๊ตฌํ๋ ๊ฒ์ด ์์ ๊ฒ์ด๋ค.
sum = 0;
for(i = 0; i < N; i++)
sum += A[i];
์ ์ฝ๋์ ๊ฒฝ์ฐ ํ๋ฉด์ ์ผ๋ก๋ sum
์ด๋ผ๋ ๋ณ์์ inter-loop dependence๊ฐ ์๋ค. ๊ทธ๋ฌ๋ ์ฝ๋๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ณํํ๋ฉด dependency๋ฅผ ์์ ๊ณ ๋ฒกํฐ ์ฐ์ฐ๋ค์ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์๋ค.
sum[0:VL-1]
for(i = 0; i < N; i+= VL)
sum[0:VL-1] += A[i:i+VL-1] // accumulate A[VL * k + i]'s to sum[i]
do{
VL = VL / 2;
sum[0:VL-1] += sum[VL:2*VL-1]
} while (VL > 1)
์์ฒ๋ผ ์ด์งํธ๋ฆฌ์ ๊ฐ์ด ๋ฒกํฐ๊ฐ์ ๋ง์
์ ๋ฐ๋ณต์ ์ผ๋ก ์คํํ๋ฉด $\lceil\lg N\rceil$๋ฒ ๋ง์ ํฉ์ ๊ตฌํ ์ ์๋ค.
Vector Scatter/Gather
for(i = 0; i < N; i++)
A[i] = B[i] + C[D[i]];
์ ์ฝ๋์ ๊ฒฝ์ฐ loop์ indirect access๊ฐ ์กด์ฌํ๋ค. ์ ๊ทผํด์ผ ํ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ ์ฐ์์ ์ด๊ฑฐ๋ strided pattern์ผ๋ก ์ฃผ์ด์ง๋ ๊ฒ์ด ์๋๋ผ, ๋ค๋ฅธ ๋ฒกํฐ ๋ ์ง์คํฐ์ ์ ์ฅ๋์ด ์๋ ๊ฒ์ด๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ์ํด vector scatter*์ vector gather**๋ผ๋ instruction์ด ์๋ค. Gather๋ ๋ฒกํฐ์ ์ ์ฅ๋์ด ์๋ ์ฃผ์๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด loadํ๋ ๊ฒ์, scatter๋ ๋ฒกํฐ์ ์ ์ฅ๋์ด ์๋ ์ฃผ์๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํด storeํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์์ ์ฝ๋๋ฅผ ๋ฒกํฐ ํ๋ก์ธ์๋ก ์ปดํ์ผํ๋ฉด vector scatter/gather๋ฅผ ํ์ฉํด ์๋์ ๊ฐ์ ์ด์
๋ธ๋ฆฌ ์ฝ๋๋ฅผ ์ป์ ์ ์๋ค.
LV vD, rD
LVI vC, rC, vD
LV vB, rB
ADDV.D vA, vB, vC
SV vA, rA
SIMD
Single Instruction, Multiple Data(SIMD) ๋๋ Multimedia Extension์ ๋ฒกํฐ์ ์น์ฒ๊ณผ๋ ๊ฐ์ ์ํคํ
์ฒ๋ก, ์ค๋๋ ์ ๋ฐ์คํฌํ ์ปดํจํฐ๊ฐ ๋ฒกํฐ ์ฐ์ฐ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. ์ผ๋ฐ์ ์ธ instruction์ด ํ instruction์ผ๋ก ํ๋์ ๋ฐ์ดํฐ๋ฅผ ์ป๋ ๋ฐ ๋นํด, SIMD instruction๋ค์ ์ฌ๋ฌ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ๋ฒ์ ์ฒ๋ฆฌํ๋ค. ์๋ฅผ ๋ค์ด, 64๋นํธ์ง๋ฆฌ wide register์ 32๋นํธ์ง๋ฆฌ ๋ฐ์ดํฐ 2๊ฐ๋ฅผ ์ ์ฅํ๋ ์์ด๋ค. ์ด๋ฌํ wide register 2๊ฐ๋ก ๋ง์
์ ์ํํ๋ฉด 32๋นํธ์ง๋ฆฌ ๋ฐ์ดํฐ ๋ ์์ ๋ํด ๋์์ ๋ง์
์ด ์ํ๋๋ค.
SIMD๋ x86์์ MMX(MultiMedia eXtension)๊ฐ ์ฒ์ ๋์
๋ ์ดํ, SSE, SSE2, SSE3๋ฅผ ๊ฑฐ์ณ AVX(Advanced Vector eXtension)๊ฐ ์๋ฆฌ์ก๊ฒ ๋๋ฉด์ ๋์ค์ ์ผ๋ก ์ฌ์ฉ๋๊ฒ ๋์๋ค. ์ฌ๊ธฐ์ ๊ฐ๊ฐ์ ์ฐจ์ด๋ ๋ ์ง์คํฐ์ ํฌ๊ธฐ์ ๊ฐ์, instruction์ ์ข
๋ฅ ๋ฑ์ด๋ค.
SIMD๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ datapath ์์ฒด์ ๋ณํ์ด ํ์ํ๋ค. ์๋ฅผ ๋ค์ด 32๋นํธ ๊ฐ์ฐ๊ธฐ๋ฅผ 8๋นํธ ์ ์ 4์์ ๋ง์
์ ์ํด ์ฌ์ฉํ๋ค๋ฉด, carry chain์ ๋์ด์ผ ํ๋ค. ๋ฐ๋ฉด bitwise OR, AND์ ๊ฐ์ ์ฐ์ฐ์ ๊ฒฝ์ฐ์๋ ์๋ฌด ๋ณ๊ฒฝ ์์ด๋ ๊ทธ๋ฅ ์ฌ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ค.
SIMD vs Vectors
SIMD์ ๋ฒกํฐ์ ์ฐจ์ด์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- SIMD๋ ๋ฒกํฐ๋ณด๋ค ISA๊ฐ ํจ์ฌ ์ ํ์ ์ด๋ค. ๋ฒกํฐ์ ๊ธธ์ด๋ฅผ ์กฐ์ ํ ์ ์๊ณ , strided load/store๊ฐ ์์ผ๋ฉฐ unit stride load์์๋ ๋ฐ๋์ SIMD ๋ ์ง์คํฐ์ boundary์ align์ด ํ์ํ๋ค.
- SIMD๋ ๋ ์ง์คํฐ์ ๊ธธ์ด๊ฐ ํจ์ฌ ์งง๋ค. ์ ํ์ ์ธ vector ํ๋ก์ธ์๋ 64๊ฐ ์์๋ฅผ ์ ์ฅํ ์ ์๋ vector register๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋, AVX์ ๊ฒฝ์ฐ ๋ฉํฐ๋ฏธ๋์ด ๋ ์ง์คํฐ์ ๊ธธ์ด๋ 256๋นํธ์ ๋ถ๊ณผํ๋ค.
- ๋ฐ๋ผ์ SIMD์ ๊ฒฝ์ฐ ํ๋์ instruction์ผ๋ก ๋ง์ ์์
์ ํ ์ ์์ผ๋ superscalar dispatch๊ฐ ํ์ํ๋ค.
ํํธ, SIMD๋ ๋ฒ์ ์ด ์ฌ๋ผ๊ฐ๋ฉฐ ์ ์ ๋ฒกํฐ์ ์ ์ฌํ๊ฒ ๋ฐ์ ํ๊ณ ์๋ค. ์ต๊ทผ ๋ฒ์ ์์๋ misaligned memory access๋ double precision์ ์ง์ํ๋ฉฐ, New AVX(2008๋
)์ ๊ฒฝ์ฐ 1024๋นํธ๊น์ง ํ์ฅ์ด ๊ฐ๋ฅํ์ฌ ๋ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ค๊ณ๋์ด ์๋ค.
GPUs
Graphic Processing Unit(GPU)๋ ์๋๋ general computing์ด ์๋ 3D ๊ทธ๋ํฝ ๋ ๋๋ง์ ์ฉ๋๋ก ํ์ํ ํ๋ก์ธ์์ด๋ค. ์ด๋ pixel shader ๋ฑ์ ๋ช ๊ฐ์ง ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉ๋์๊ณ , ์ด ๋๋ฌธ์ ์ด๊ธฐ GPU์ ๊ฒฝ์ฐ ํ๋ก๊ทธ๋๋ฐํ ์ ์๋ ์ ๋๊ฐ ๋งค์ฐ ์ ํ์ ์ด์๋ค. ์ด ๋๋ฌธ์ ์ผ๋ถ ์ฌ์ฉ์๋ค์ GPU์ ํผํฌ๋จผ์ค๋ฅผ ๋ค๋ฅธ ์์
์๋ ํ์ฉํ๊ธฐ ์ํด ๋ค๋ฅธ ์์
๋ค์ pixel shading๊ณผ ๊ฐ์ด GPU๊ฐ ์ง์ํ๋ ์์
๋ค๋ก ๋งคํํ ํ, ๊ทธ ์ถ๋ ฅ๊ฐ์ ๋ค์ ์๋์ ๋๋ฉ์ธ์ผ๋ก ๋งคํํ๋ ์์ผ๋ก GPU๋ฅผ ์ฌ์ฉํ์๋ค.
์ดํ NVIDIA์์ CUDA(Compute Unified Device Architecture)๊ฐ ์ถ์๋๋ฉฐ, GPGPU(General-Purpose GPU)๊ฐ ํ์ํ๊ฒ ๋๋ค. ์ด๋ฅผ ํตํด ๋ง์ ํ๋ก๊ทธ๋๋จธ๋ค์ด GPU์ ๊ณ์ฐ ์ฑ๋ฅ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ์ general computing์ ๊ฐ์ํ์ํค๋ ๋ฐ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค.
GPGPU์์๋ attached processor model์ด๋ผ๋ ๊ฒ์ ๊ฐ์ ํ๋๋ฐ, ์ด๋ host CPU๊ฐ GPGPU์ data-parallel kernel์ issueํ์ฌ ์คํ์ํค๋๋ก ํ๋ ๋ฐฉ์์ด๋ค.
CUDA Programming Model
CUDA๋ ๊ณ์ฐ์ thread ๋จ์๋ก ์ํํ๋ค. ์ด๋ ๊ฐ๊ฐ์ thread๋ CUDA thread ๋๋ microthread๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, thread block์ด๋ผ๋ ๋จ์๋ก ๋ฌถ์ธ๋ค. ๊ฐ๊ฐ์ thread๊ฐ ์๋ก ๋
๋ฆฝ์ ์ธ scalar ์ฐ์ฐ์ ๋ณ๋ ฌ์ ์ผ๋ก ์ํํ๋ ์์ด๋ค.
์์๋ก DAXPY๋ฅผ ์ํํ๋ CUDA ์ฝ๋๋ฅผ ์ดํด๋ณด์. DAXPY๋ double-precision ax plux y์ ์ฝ์๋ก, ๋ค์์ C ์ฝ๋์ ๊ฐ์ ์ผ์ ์ํํ๋ ์์
์ด๋ค.
void daxpy(int n, double a, double *x, double *y){
for(int i = 0; i < n; i++){
y[i] = a * x[i] + y[i];
}
}
์ด๋ฅผ CUDA๋ก ๋ณ๋ ฌํ์ํจ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
__host__ // Piece run on host processor
int nblocks = (n+255) / 256; // 256 CUDA threads/block
daxpy<<<nblocks,256>>>(n, 2.0, x, y)
__device__ // Piece run on GPGPU
void daxpy(int n, double a, double *x, double *y){
int i = blockIdx.x * blockDim.x + threadId.x;
if (i < n)
y[i] = a * x[i] + y[i];
}
CUDA๋ฅผ ์ฌ์ฉํ๋ฉด ์์ ๊ฐ์ด C์์ ํ์ฅํ ์ฝ๋๋ฅผ ์ด์ฉํด, GPU์์ ์์
์ thread ๋จ์๋ก ๋ณ๋ ฌํํ์ฌ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. CUDA์ ์ด๋ฌํ ํน์ฑ์ Single Instruction, Multiple Thread(SIMT)๋ผ๊ณ ํ๋ค. Scalar instruction ํ๋๋ง์ผ๋ก (CUDA์ ๊ฒฝ์ฐ) 32๊ฐ์ thread๋ฅผ ๋ณ๋ ฌ๋ก ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
SIMT์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ด ์ค๋ช
ํ ์ ์๋ค.
- ๋ชจ๋ vector load/store instruction์ scatter/gather์ ๊ฐ๋ค. ๊ฐ๊ฐ์ microthread๊ฐ ๊ฐ๊ฐ scalar load/store๋ฅผ ์ค์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ๊ฐ๊ฐ์ microthread๋ ๊ฐ์๊ฐ ์ค์ค๋ก๊ฐ activeํ์ง๋ฅผ ํ๋ณํ์ฌ(์ ์ฝ๋์
i<n
๋ถ๋ถ์ ํด๋น) stripmining calculation์ ์ํํด์ผ ํ๋ค.
- ๋ง์ฝ microthread๋ง๋ค control flow๊ฐ ๋ฌ๋ผ์ง๋ค๋ฉด predication์ด ์๊ตฌ๋๋ค.