스킬캠퍼스

오늘 끝나면

스레드·워프·분기 발산

  • 스레드·워프·분기 발산의 핵심 문제를 한 문장으로 설명한다
  • 오른쪽 실습에서 스레드이 어떻게 움직이는지 관찰한다
  • 다음 강의와 이어지는 한계를 말할 수 있다

실습 미션

warp가 갈라지면 lane이 놀다 — active mask·utilization 이 문장이 실제로 무슨 뜻인지 실습에서 한 번 손으로 확인한다.

성공 조건

  • 실습의 기본값을 먼저 관찰
  • 입력값이나 모드를 한 번 이상 바꿔 결과 비교
  • 왜 결과가 바뀌었는지 한 문장으로 설명

반도체 설계 · 29

스레드·워프·
분기 발산

GPU는 thread 하나하나를 따로 굴리지 않는다.
여러 thread를 warp로 묶어 한 명령으로 같이 굴린다.
분기에서 갈리면 일부 lane이 놀고, 그만큼 속도가 깎인다.

P.01반도체 설계 · 29

thread를 warp로 묶는다, SIMT

GPU 코어는 thread를 한 줌씩 묶어 다룬다. 이 묶음이 warp다.

한 warp 안의 thread는 전부 같은 명령을 동시에 실행한다. 단, 각자 자기 데이터로 실행한다. 이게 SIMT(Single Instruction, Multiple Thread)다.
명령 해독기와 스케줄러를 thread 수만큼 두지 않고 warp 하나당 하나만 둔다. 그래서 제어 회로가 작아지고 ALU(lane)를 빽빽이 깔 수 있다.

실제 NVIDIA GPU의 warp는 32 thread다. 여기 랩에서는 보기 쉽게 4 lane으로 줄였다.
한 warp의 lane들은 PC(다음 명령 위치)를 공유하며 발맞춰 나아간다. lock-step으로 한 줄씩 나아간다.
그 lock-step이 깨지는 순간이 다음 장의 분기다.

32(여기선 4) thread · 한 명령을 lock-step으로
thread → warp · 한 명령 · lock-step
명령 1개 → 4 lane이 같이 받음
한 명령 (PC)L0tid 0L1tid 1L2tid 2L3tid 3
같은 명령 · 다른 데이터 = SIMT · 실제 warp는 32 lane
P.02반도체 설계 · 29

분기 발산, lane이 갈라진다

warp는 명령이 하나뿐이다. 그런데 if에서 thread마다 조건이 갈리면 문제가 생긴다.

어떤 lane은 if 쪽으로, 어떤 lane은 else 쪽으로 가야 한다. 한 warp가 두 길로 쪼개진다. 이걸 분기 발산(divergence)이라 한다.
하드웨어는 한 번에 한 경로만 실행한다. 그래서 if 쪽을 돌 때는 else lane의 스위치를 꺼버린다.

이 끄고 켜는 표가 active mask다. lane마다 1이면 실행, 0이면 놂(masked)이다.
if-경로를 active mask로 한 번 돌고, else-경로를 반대 mask로 또 한 번 돈다. 두 경로를 차례로 다 거친다.
그동안 꺼진 lane의 ALU는 계산을 안 하고 빈 슬롯으로 흘러간다. 일은 안 하는데 사이클은 쓴다.

if는 if대로 · else는 else대로 · 한 번에 한쪽만
분기 발산 · 한 번에 한 경로
1) if-경로 실행else lane masked
L0■ 실행
L1■ 실행
L2□ 놂
L3□ 놂
2) else-경로 실행if lane masked
L0□ 놂
L1□ 놂
L2■ 실행
L3■ 실행
active mask가 1인 lane만 일한다 · 두 경로를 차례로 다 돈다
P.03반도체 설계 · 29

재수렴, 다시 한 줄로 합친다

갈라진 채로 끝나면 warp가 망가진다. 갈린 길은 결국 다시 합쳐져야 한다.

if/else가 끝나고 두 갈래가 다시 만나는 지점이 재수렴 지점(reconvergence point)이다. 보통 분기 블록이 끝나는 첫 공통 명령이다.
그 지점에서 active mask를 다시 전부 1로 되돌린다. 꺼졌던 lane이 깨어나 warp가 한 줄로 복원된다.

하드웨어는 어디서 합칠지를 분기할 때 스택(reconvergence stack)에 적어둔다. if-경로를 다 돌면 else-경로를 꺼내 돌고, 둘 다 끝나면 합류 지점을 꺼내 mask를 복원한다.
그래서 발산은 영구적이지 않다. 합류 후엔 다시 전 lane이 함께 달린다.
손해는 갈라져 있던 그 구간 동안만 발생한다.

갈린 두 경로가 만나는 지점에서 mask 복원
재수렴 · 합류점에서 mask 복원
branchif · L0 L1else · L2 L3reconvergemask = 1111 (전 lane 복원)
손해는 갈라진 구간 동안만 · 합류 후 다시 함께 달림
P.04반도체 설계 · 29

직접 갈라보고 utilization을 본다

분기 조건 SPLIT으로 어디서 갈라질지 정하고 한 사이클씩 진행한다.

SPLIT=0이나 4면 전 lane이 한쪽으로 가 발산이 없다. utilization은 100%다.
1~3이면 if-경로와 else-경로를 차례로 다 도느라 사이클이 늘고, 그동안 반대편 lane이 □(놂)으로 빠져 utilization이 떨어진다.
여기서 정한 warp 폭이 MyChip GPU에 들어간다.

SPLIT 토글 → mask 타임라인 · 가동 lane 비율
워프 랩 · 4-lane warp · 분기 발산
warp = 4 thread · 같은 명령 lock-stepcyc 0 / 7
L0
tid 0
if
L1
tid 1
if
L2
tid 2
else
L3
tid 3
else
분기 조건, tid < SPLITSPLIT = 2

0·4 → 전 lane이 한쪽 (발산 없음) · 1~3 → if/else로 갈림 (발산)

예측 먼저, 이 SPLIT에서 발산이 날까?
커널, 이번에 도는 명령
PC0setup
PC1if (tid < SPLIT)
PC2body A0
PC3body A1
PC4else
PC5body B0
PC6done (재수렴)
근거 패널, active mask 타임라인 (■ 가동 · □ 놂)
lane0123456
L0·······
L1·······
L2·······
L3·······
PC0123456

□ = masked lane(놂). 발산 구간엔 매 사이클 일부 칸이 □라 가동 슬롯이 줄어든다.

utilization, 가동 슬롯 ÷ 전체 슬롯
가동 슬롯0 / 0
최종 utilization71%

발산: if-경로와 else-경로를 차례로 다 도느라 사이클이 늘고(7cyc), 그동안 반대편 lane이 놀아 최종 utilization 71%로 떨어진다. 한 warp의 lane 수(warp 폭)가 최종 MyChip GPU에 들어간다. 발산이 잦은 코드일수록 같은 warp에 비슷한 조건의 thread를 모으는 게 이득이다.

P.05반도체 설계 · 29

utilization이 곧 GPU 성능이다

GPU의 힘은 lane을 빽빽이 깔아 한 번에 많이 계산하는 데서 나온다. lane이 놀면 그 힘이 샌다.

utilization은 실제 일한 lane 슬롯을 전체 슬롯으로 나눈 비율이다. 가동 ÷ (사이클 × lane)으로 구한다.
발산이 없으면 매 사이클 모든 lane이 일해서 100%가 된다. 발산하면 한 경로 도는 동안 반대편 lane이 0으로 빠져 분모는 그대로인데 분자가 줄어든다.

그래서 같은 일을 시켜도 같은 warp에 비슷하게 분기할 thread를 모아두면 발산이 줄어 utilization이 오른다. 정렬·재배치로 성능을 버는 이유다.
분기가 lane마다 다 다른 최악의 코드는 warp 폭만큼 사이클이 길어질 수 있다. 32-lane이면 최대 32배까지 길어진다.
이 절충(warp 폭 vs 발산 손실)이 최종 MyChip GPU 설계에 그대로 들어간다.

Q. 분기 발산이 성능을 깎는 이유는?정답은 갈라진 동안 일부 lane이 놀기 때문이다.
하드웨어는 한 번에 한 경로만 돌아서, if-경로를 도는 동안 else lane을, else-경로를 도는 동안 if lane을 active mask로 꺼둔다(masked).
꺼진 lane의 ALU는 사이클은 쓰면서 계산은 안 하니, 가동 lane 비율(utilization)이 떨어지고 두 경로를 차례로 다 도느라 사이클도 늘어난다.
놀고 있는 lane = 버려지는 ALU
utilization · 놀면 ALU가 버려짐
발산 없음100%
전 lane 한쪽
2:2 발산60%
if 2 · else 2
lane마다 다름25%
최악 (warp 폭만큼)
비슷한 분기끼리 같은 warp로 모으면 발산이 줄어 util이 오른다

3줄 요약

  1. 1warp가 갈라지면 lane이 놀다 — active mask·utilization
  2. 2스레드·워프·분기 발산은 비트·게이트 → ALU → 시간·메모리 → 나만의 CPU → 메모리·GPU·SoC 흐름 안의 한 칸이다.
  3. 3개념을 외우는 것보다 입력을 바꾸면 무엇이 달라지는지 보는 것이 우선이다.

완료 전 점검

복습 카드

스레드

warp가 갈라지면 lane이 놀다 — active mask·utilization

ALU

산술·논리 연산을 하는 회로

ISA

CPU가 이해하는 명령어 집합과 인코딩