์ค๋ ๋ ๋ฐ์ฐ (thread divergence)
divergence๋ ๋ฐ์ฐ, ๋ถ๊ธฐ๋ผ๋ ๋ป์ ๊ฐ์ง ์์ด ๋จ์ด์ด๋ค.
๋ ์ด์์ ๋น์ฌ์ ๊ฐ์ ์๊ฒฌ, ๊ด์ฌ ๋๋ ํฌ๋ง ์ฌํญ์ ์ฐจ์ด ๋๋ ๊ณตํต์ ์์ ๋ฒ์ด๋๋ ๊ณผ์ ์ ์๋ฏธํ๋ค๊ณ ํ๋ค.
์ค๋ ๋ ๋ฐ์ฐ(thread divergence)์ GPU ๋ด์์ ์ค์ํ ๊ฐ๋ ์ผ๋ก, GPU๋ ๋ง์ ์์ ์์ด๋ ์ฝ์ด๋ฅผ ๊ฐ์ง๊ณ ์๊ณ ์ด ์ฝ์ด๋ค์ ๋ณ๋ ฌ๋ก ๋์์ ๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ๋ก ๋์ด์๋ค.
์ค๋ ๋ ๋ฐ์ฐ์ด ๋ฐ์ํ๋ฉด ์ด ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ํจ์จ์ฑ์ด ํฌ๊ฒ ๋จ์ด์ง๊ฒ ๋๋๋ฐ.... (;๏ผพโ๏ผพ;)ใ
์ค๋ ๋ ๋ฐ์ฐ(thread divergence) ์ด๋?
์ค๋ ๋ ๋ฐ์ฐ์ GPU๋ด์์ ์คํ๋๋ ์ฌ๋ฌ ์์ด๋ ์ฝ์ด(์ค๋ ๋)๊ฐ ๋์ผํ ์์ ์ ์๋ก ๋ค๋ฅธ ์คํ ๊ฒฝ๋ก๋ฅผ ๋ฐ๋ผ๊ฐ๊ฒ ๋ ๋ ๋ฐ์ํ๋ค.
์ด๋ ์ฃผ๋ก ์กฐ๊ฑด๋ฌธ('if', 'switch' ๋ฑ) ์ฌ์ฉ์ ์ํด ๋ฐ์ํ๋ฉฐ, ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์๋ก ๋ค๋ฅธ ์กฐ๊ฑด์ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ง๊ฒ ๋์ด ๋ฐ์ํ๋ ํ์์ด๋ค.
๊ฐ๋จํ๊ฒ ๋งํ๋ฉด ๋ณ๋ ฌ ์ปดํจํ ์์ ๋ฐ์ํ๋ ํ์์ผ๋ก ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์ผํ ๋ฐ์ดํฐ์ ๋ํด ๋ค๋ฅธ ์ฐ์ฐ์ ์ํํ ๋ ์ผ์ด๋๋ค.
์๋ฅผ ๋ค์ด์ 'if-else' ์กฐ๊ฑด๋ฌธ์์ ์ผ๋ถ ์ค๋ ๋๋ 'if' ์กฐ๊ฑด์ด ์ฐธ์ด์ด์ ํด๋น ๋ธ๋ก์ ์คํํ๊ณ ๋ค๋ฅธ ์ค๋ ๋๋ ๊ฑฐ์ง์ด์ด์ 'else' ๋ธ๋ก์ ์คํํ๋ ์ํฉ์ด ๋ฐ์ํ ์ ์๋ค.
GPU๋ ์ด๋ฐ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ช ๋ น์ด ์ธํธ๋ฅผ ๋์์ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ํ ์ชฝ์ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ชฝ์ ์คํ์ด ๋๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ ค์ผ ํ๋ฉฐ ์ด๋ก ์ธํด์ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ์ด์ ์ด ํฌ๊ฒ ๊ฐ์ํ๋ค.
์ ๋ฌธ์ ๊ฐ ๋๋์ง?
๋ฌธ์ ๊ฐ ๋๋ ์ด์ ๋ฅผ ์ธ ๊ฐ์ง๋ก ์ ๋ฆฌํด ๋ณผ ์ ์๋ค.
์ฒซ ๋ฒ์งธ๋ ์ฑ๋ฅ ์ ํ์ด๋ค.
์ค๋ ๋ ๋ฐ์ฐ์ด ๋ฐ์ํ๋ฉด, ๋ชจ๋ ์ค๋ ๋๊ฐ ๋์ผํ ๋ช ๋ น์ด๋ฅผ ์คํํ์ง ๋ชปํ๊ณ ์๋ก ๋ค๋ฅธ ๊ฒฝ๋ก๋ฅผ ์คํํด์ผ ํ๋ฏ๋ก ์ผ๋ถ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์ค๋ ๋์ ์์ ์๋ฃ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ ๋์ ์๋ฌด ์ผ๋ ํ์ง ๋ชปํ๊ฒ ๋๋ค.
์ด๋ GPU์ ์ฒ๋ฆฌ ๋ฅ๋ ฅ์ ๋ญ๋นํ๊ณ , ์ ์ฒด์ ์ธ ์ฑ๋ฅ ์ ํ๋ฅผ ์ด๋ํ๋ค.
๋ ๋ฒ์งธ๋ ๋ฆฌ์์ค ํ์ฉ๋ ๊ฐ์์ด๋ค.
์ค๋ ๋ ๋ฐ์ฐ์ผ๋ก ์ธํด์ GPU ๋ด์ ์์ด๋ ์ฝ์ด ์ผ๋ถ๊ฐ ์ ํด ์ํ์ ๋น ์ง๊ฒ ๋๋ฉฐ, ์ด๋ ๋ฆฌ์์ค ํ์ฉ๋๊ฐ ๋ฎ์์ง๊ฒ ๋ง๋ ๋ค.
์ธ ๋ฒ์งธ๋ ์๋์ง ํจ์จ์ฑ ์ ํ์ด๋ค.
๋นํจ์จ์ ์ผ๋ก ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํ๋ฉด์๋ ์ ๋ ฅ ์๋ชจ๋ ์ค์ด๋ค์ง ์๊ธฐ ๋๋ฌธ์ ์๋์ง ํจ์จ์ฑ์ด ๋จ์ด์ง๊ฒ ๋๋ค.
๋ค์์ ์ค๋ ๋ ๋ฐ์ฐ์ด ๋ฐ์ํ๋ ์์๋ค์ด๋ค.
โ GPU ์์ด๋์์์ ์ค๋ ๋ ๋ฐ์ฐ
๋ ๋๋ง ์ ์ฌ์ง์ ๋ฐ๋ผ ๋ค๋ฅธ ์์ด๋ ๋ก์ง์ ์ ์ฉํ๋ ๊ฒฝ์ฐ
void main()
{
vec4 color;
if (materialType == METAL)
{
color = computeReflection(reflectivityParams);
}
else if (materialType == GLASS)
{
color = computeRefraction(refractionParams);
}
else
{
color = texture2D(texture, texCoords);
}
gl_FragColor = color;
}
๊ฐ ํฝ์ ์์ด๋๊ฐ ๋์ํ ๋, ํฝ์ ์ด ์ํ ์ฌ์ง์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์คํํ๊ฒ ๋๋ฉด ์ค๋ ๋ ๋ฐ์ฐ์ด ๋ฐ์ํ๋ค.
โ ๋ฉํฐ์ค๋ ๋ CPU ํ๋ก๊ทธ๋๋ฐ์์์ ์ค๋ ๋ ๋ฐ์ฐ
๋ค์ค ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ ์ค๋ ๋๊ฐ ๋ค๋ฅธ ์์ ์ ์ํํ๋ ๊ฒฝ์ฐ
void processTasks(int threadId)
{
if (threadId % 2 == 0)
{
performComplexComputation();
}
else
{
performSimpleComputation();
}
}
์ฌ๋ฌ CPU ์ฝ์ด ๋๋ ์ค๋ ๋๊ฐ ๋์์ ๋ค๋ฅธ ํ์ ์ ์์ ์ ์ํํ ๋, ์ผ๋ถ ์ค๋ ๋๊ฐ ๋ ๋ฌด๊ฑฐ์ด ์์ ์ ์ํํ๊ณ ๋ค๋ฅธ ์ค๋ ๋๋ ๋ ๊ฐ๋ฒผ์ด ์์ ์ ์ํํ๊ฒ ๋๋ฉด, ์์ ์ ๋ถ๊ท ํ์ผ๋ก ์ธํด ์ ์ฒด์ ์ธ ํ๋ก์ธ์ค ์ฑ๋ฅ์ด ์ ํ๋ ์ ์๋ค.
์ด๋ ์ค๋ ๋ ๋ฐ์ฐ๊ณผ๋ ์กฐ๊ธ ๋ค๋ฅธ ๊ฐ๋ ์ ๋ถํ ๋ถ๊ท ํ์ด์ง๋ง ๋ณ๋ ฌ ํ๋ก์ธ์ฑ์ ํจ์จ์ฑ์ ์ ํ์ํค๋ ์ ์ฌํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ๋ค.
โ ๋ฒกํฐํ ์คํจ๋ก ์ธํ ์ค๋ ๋ ๋ฐ์ฐ
CPU์์ SIMD ๋ช ๋ น์ ์ฌ์ฉํ ๋ ์กฐ๊ฑด๋ฌธ์ผ๋ก ์ธํด ๋ฒกํฐํ๊ฐ ์คํจํ๋ ๊ฒฝ์ฐ
for (int i = 0; i < n; i++)
{
if (data[i] > threshold)
{
results[i] = computeHigh(data[i]);
}
else
{
results[i] = computeLow(data[i]);
}
}
SIMD ์ต์ ํ์์ ์ด๋ฌํ ์กฐ๊ฑด๋ฌธ์ ํ ๋ฒกํฐ ๋ด์ ๋ค๋ฅธ ์์๋ค์ด ๋ค๋ฅธ ํจ์๋ฅผ ํธ์ถํ๊ฒ ํ์ฌ, ๋ฒกํฐํ๋ฅผ ๋ฐฉํดํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ์ค๋ ๋ ๋ฐ์ฐ๊ณผ ์ ์ฌํ ์ฑ๋ฅ ์ ํ๋ฅผ ์ผ์ผํฌ ์ ์๋ค.
์ฌ๊ธฐ์ ์ค๋ ๋๋ผ๋ ์ฉ์ด ๋์ SIMD ๋ ์ธ(lane)์ด๋ผ๋ ํํ์ด ๋ ์ ํฉํ ์ ์์ง๋ง ๋ณ๋ ฌ์์์ ์ฒ๋ฆฌ ์ด์๋ ์ ์ฌํ๋ค!
ํด๊ฒฐ ๋ฐฉ์
โ GPU ์์ด๋์์์ ์ค๋ ๋ ๋ฐ์ฐ
1. ์ฌ์ง ์ ํ์ ๋ฐ๋ผ ๋๋ก์ฐ์ฝ์ ๋ถ๋ฆฌํ๋ค.
๊ฐ๋ฅํ๋ค๋ฉด ์ฌ์ง ์ ํ๋ณ๋ก ๋ณ๋์ ๋๋ก์ฐ ์ฝ์ ์ํํ๋๋ก ๊ตฌ์ฑํ๋ค.
์ด ๋ฐฉ์์ GPU๊ฐ ๋์ผํ ๋๋ก์ฐ์ฝ์์ ๋์ผํ ์์ด๋ ์ฝ๋๋ฅผ ์คํํ๋๋ก ํด์ ์ค๋ ๋ ๋ฐ์ฐ์ ํฌ๊ฒ ์ค์ผ ์ ์๋ค.
2. ์กฐ๊ฑด ๋ก์ง ์ต์ํ
์์ด๋ ๋ด์์ ๊ฐ๋ฅํ ํ ์กฐ๊ฑด๋ฌธ์ ์ฌ์ฉํ์ง ์๊ณ ํ์ํ ์ฐ์ฐ์ ๋ชจ๋ ์ํํ ๋ค์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๊ฒฐ๊ณผ๋ฅผ ์ ํํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์ ์๋ค.
์๋ฅผ ๋ค์ด์ ๋ฐ์ฌ ๋ฐ ๊ตด์ ๊ณ์ฐ์ ๋ชจ๋ ์ํํ๊ณ ๋ง์ง๋ง์ 'mix()' ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ํํ ์ ์๋ฐ.
โ ๋ฉํฐ์ค๋ ๋ CPU ํ๋ก๊ทธ๋๋ฐ์์์ ์ค๋ ๋ ๋ฐ์ฐ
1. ์์ ๋ถ๋ฐฐ ์ต์ ํ
์ค๋ ๋ ํ์ ์ฌ์ฉํ์ฌ ์์ ์ ๋์ ์ผ๋ก ํ ๋นํ๊ณ , ๊ฐ ์ค๋ ๋๊ฐ ๋๊ธฐ ์๊ฐ ์์ด ๊ณ์ํด์ ์์ ์ ๊ฐ์ ธ๊ฐ ์ ์๋๋ก ํ๋ค.
์ด๋ ์์ ์ ๋ถํ๋ฅผ ๊ท ๋ฑํ๊ฒ ๋ถ๋ฐฐํด ์ค๋ ๋ ๊ฐ์ ์ฑ๋ฅ ์ฐจ์ด๋ฅผ ์ต์ํ ํ๋๋ฐ ๋์์ด ๋๋ค.
2. ์ค๋ ๋ ์ดํผ๋ํฐ ์ค์
ํน์ ์ค๋ ๋๊ฐ ํน์ CPU ์ฝ์ด์ ๊ณ ์ ๋๋๋ก ์ค์ ํจ์ผ๋ก์จ, ์บ์ ํ์ฉ๋๋ฅผ ์ต์ ํํ๊ณ ์ปจํ ์คํธ ์ค์์นญ์ ์ค์ผ ์ ์๋ค.
โ ๋ฒกํฐํ ์คํจ๋ก ์ธํ ์ค๋ ๋ ๋ฐ์ฐ
1. ์กฐ๊ฑด๋ฌธ ์ฌ๊ตฌ์กฐํ
์กฐ๊ฑด๋ฌธ์ ์ฌ๊ตฌ์กฐํํ์ฌ ๋ฐ์ดํฐ์ ๋ฐ๋ผ ๋ถ๊ธฐ๊ฐ ์ผ์ด๋๋ ๊ฒ์ ์ต์ํํ๋ค.
๊ฐ๋ฅํ๋ฉด ์กฐ๊ฑด์ฒ๋ฆฌ๋ฅผ ๋ฐ์ดํฐ ์ค๋น์์ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํ๊ณ SIMD ์ฐ์ฐ์ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ผ๊ด์ ์ผ๋ก ์ ์ฉํ ์ ์๋๋ก ํ๋ค.
2. ๋ง์คํน ์ฐ์ฐ ์์ฉ
์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ์ฐ์ฐ์ ์ํํด์ผ ํ ๋๋ ๋ง์คํน์ ์ฌ์ฉํ๋ค.
๋ชจ๋ ๋ฐ์ดํฐ์ ๋ํด ๋ ์ฐ์ฐ์ ์ํํ๊ณ , ์กฐ๊ฑด์ ๋ฐ๋ผ ์ ์ ํ ๊ฒฐ๊ณผ๋ฅผ ์ ํํ ์ ์๋๋ก ๋ง์คํน์ ์ ์ฉํ๋ค.
์ค๋ ๋ ๋ฐ์ฐ์ ์ต์ํํ๊ธฐ ์ํด ์กฐ๊ฑด๋ฌธ ์ฌ์ฉ์ ์ค์ด๊ฑฐ๋ ์กฐ๊ฑด๋ฌธ์ ์ต์ ํํ์ฌ ๊ฐ๋ฅํ ํ ๋ง์ ์ค๋ ๋๊ฐ ๊ฐ์ ์ฝ๋ ๊ฒฝ๋ก๋ฅผ ์คํํ๋๋ก ์ค๊ณํ๋ ๊ฒ์ด ์ข๋ค.
๋ํ ๋ฃจํ ๋ด์ ์กฐ๊ฑด๋ฌธ์ ์ธ๋ถ๋ก ์ด๋์ํค๊ฑฐ๋, ๊ณ์ฐ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋์์ ๋ค๋ฅด๊ฒ ํ๋ ๋์ ๋ฏธ๋ฆฌ ๊ณ์ฐ๋ ๊ฐ๊ณผ ์ ์ ํ ๋ง์คํน ์ฐ์ฐ์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ ๋ฑ์ ๊ณ ๋ คํ ์ ์๋ค.
์ฐธ๊ณ ์ถ์ฒ;
https://nichijou.co/cuda3-thread-divergence/
https://www.linkedin.com/pulse/thread-divergence-yeshwanth-n
Text generated by ChatGPT, April 12, 2024, OpenAI, https://chat.openai.com/
'๐โ๏ธ(ใปโใป) > computer' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SIMD๋? (Single Instruction Multiple Data) (1) | 2024.03.26 |
---|---|
Mac VSCode-๋ท๋ท sdk ์ค๋ฅ๊ฐ ๋ฐ์ํ ๋ (The .NET Core SDK cannot be located) (0) | 2023.06.17 |
Mac ์ ๋ํฐ-VSCode ์ฐ๋ ์ค์ (M2 pro) (0) | 2023.06.17 |