SIMT (Single Instruction Multiple Threads)
핵심 인사이트 (3줄 요약)
- 본질: 엔비디아(NVIDIA)가 GPU를 범용 계산(GPGPU)으로 뜯어고치면서 창안한 독자적인 실행 모델로, "지휘관(스케줄러) 1명이 내린 단일 명령어(Single Instruction)를 32개의 스레드(Multiple Threads)가 각자의 레지스터 상태를 가지고 동시에 수행"하는 융단 폭격 아키텍처다.
- 가치: 기존 CPU의 경직된 SIMD(벡터 연산)의 한계를 부수고, 각 스레드에 독립적인 번호표(ID)와 실행 흐름을 부여함으로써, 복잡한 분기문(Branch)이 섞인 C/C++ 코드를 무지막지한 코어 수의 그래픽 카드 위에서 돌릴 수 있게 해 주었다.
- 융합: 하지만 스레드들이
if-else에서 서로 다른 길을 갈 때 지휘관이 쪼개지지 못해 절반의 스레드를 얼음(정지) 시켜야 하는 **'워프 분기 발산(Warp Divergence)'**의 끔찍한 한계가 있어, 소프트웨어 개발자의 평탄화(Flattening) 코딩 기법과 필수적으로 융합되어야만 생존할 수 있다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
SIMT (Single Instruction Multiple Threads)는 "어떻게 하면 GPU의 무식한 코어 수만 개를, 보통의 프로그래머들이 익숙한 방식(스레드)으로 조종하게 만들까?"라는 딜레마에서 탄생한 천재적인 타협안이다.
과거 CPU의 병렬 처리 기술인 **SIMD (단일 명령어 다중 데이터, 예: AVX 벡터)**는 아주 빠르지만 멍청했다. 10개의 데이터 뭉텅이를 가져와 무조건 '더하기'만 해야 했다. 만약 5개는 더하고 5개는 빼야 하는 복잡한 로직이 들어가면 SIMD 하드웨어는 즉시 깡통이 되었다.
엔비디아는 이 멍청한 SIMD를 개조했다. "데이터 뭉텅이를 그냥 던져주지 말고, 아예 32개의 '독립된 영혼(스레드)'으로 찢어버리자. 그리고 그 32명(Warp)에게 명령어 하나를 외쳐! 단, 32명은 각자 자기 번호표(Thread ID)와 자기 주머니(레지스터)를 가지고 있으니까, 명령어는 하나여도 각자 자기가 맡은 데이터만 쏙쏙 뽑아서 계산할 수 있잖아!"
[SIMD (CPU 벡터) vs SIMT (GPU 워프) 패러다임 차이]
(A) SIMD (CPU) - 멍청한 뭉텅이 처리
- 방식: "배열 A[0~3]과 배열 B[0~3] 덩어리를 몽땅 더해라!"
- 한계: 덩어리 전체가 움직이므로, 중간에 "A[2]가 짝수면 빼라" 같은 유연한 대처(분기)가 원천 불가능.
(B) SIMT (GPU) - 군대식 점호 (32명 1개 조 워프)
- 방식: 32명의 스레드에게 "A배열의 네 번호(ID)에 맞는 칸을 더해라!"라고 명령함.
- 스레드 0번: "난 ID가 0이니까 A[0]에 더해야지."
- 스레드 1번: "난 ID가 1이니까 A[1]에 더해야지."
- 유연성 폭발: 각 스레드가 자아(레지스터/ID)를 가지게 됨으로써, 일반 C언어의 `threadIdx` 기반 코딩이 가능해져 GPGPU 시대의 프로그래밍 혁명을 일으킴.
SIMT 덕분에 과학자들은 징그러운 벡터 어셈블리어를 배우지 않고도, 익숙한 스레드 프로그래밍 C 코드를 짜서 GPU에 밀어 넣으면 하드웨어가 알아서 32명씩 묶어(Warp) 1클럭 융단 폭격을 가하는 기적을 맛보게 되었다.
📢 섹션 요약 비유: SIMD는 큰 대형 트럭으로 흙을 한 번에 푹 떠버리는 무식한 굴착기입니다. 흙 속에 돌이 섞여 있어도 가려내지 못합니다. SIMT는 지휘관 1명의 깃발(명령어) 아래 일사불란하게 움직이는 32명의 정예 병사입니다. 깃발이 올라가면 동시에 찌르지만, 병사들이 각자 눈과 손(스레드 ID)을 가지고 있어서 돌(예외 조건)을 피해서 찌르는 유연성을 갖추고 있습니다.
Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)
SIMT 아키텍처의 물리적 심장부는 하드웨어가 유지하는 **워프(Warp)**와 액티브 마스크(Active Mask) 로직이다.
| 하드웨어 동작 원리 | 아키텍처적 특성 (SIMT) | 비유 |
|---|---|---|
| Warp (32개 스레드 묶음) | 엔비디아 GPU 실행의 절대적 최소 단위. 지휘관의 명령 하나에 무조건 32개의 ALU가 1클럭에 동시에 반응함 | 32인 1각 달리기 (혼자 뛰는 건 허용 안 됨) |
| PC (Program Counter) 공유 | 워프 내 32명의 스레드는 단 1개의 PC(현재 코드 위치)를 공유함. 즉, 절대 서로 다른 줄의 코드를 동시에 실행할 수 없음! | 32명이 다 같이 똑같은 악보의 똑같은 마디를 부름 |
| Register 독립 | 32명은 하나의 명령을 듣지만, 하드웨어 레지스터는 각자 독립적으로 가짐 (자아 유지) | 부르는 악보는 같지만 각자 자기만의 목소리와 마이크를 가짐 |
| Active Mask (마스킹) | 특정 스레드를 일시적으로 얼음(정지) 상태로 만드는 32비트짜리 온오프 스위치 회로 | "짝수 번호만 쏴! 홀수는 가만히 있어!" |
SIMT의 가장 위대하고도 치명적인 메커니즘은 바로 조건 분기문(if-else)을 만났을 때 작동하는 하드웨어 마스킹(Masking) 처리다. 지휘관은 1명(PC 1개)인데, 32명 중 절반이 왼쪽으로 가고 절반이 오른쪽으로 가야 할 때 하드웨어는 어떻게 할까?
[SIMT 아키텍처의 비극: 워프 분기 발산 (Warp Divergence)]
* 코드: 32명(1 Warp)이 아래 코드를 만남.
if (Thread_ID % 2 == 0) { // 짝수 16명
A 연산 수행;
} else { // 홀수 16명
B 연산 수행;
}
[ 하드웨어 지휘관의 2-Step 쌩쇼 ]
1. "자, 일단 A 연산부터 한다! 홀수 16명은 마스크(Mask) 씌워서 입 다물게 해!(정지)"
-> 짝수 16명만 A 연산 수행. (연산기 절반이 텅 빈 채 전기만 먹음 - 50% 효율 박살)
2. "A 끝났다. 이제 B 연산 한다! 짝수 16명 입 다물어!(정지)"
-> 이번엔 홀수 16명만 B 연산 수행. (또 50% 박살)
=> 결론: CPU 코어였다면 1클럭에 각자 갈 길을 갔겠지만,
SIMT 구조에서는 지휘관이 1명이라 두 번에 걸쳐 "순차적(직렬화)"으로 처리해야 함.
성능이 1/2로 곤두박질치는 최악의 병목(Warp Divergence) 발생!
이 때문에 SIMT 아키텍처는 데이터 레벨 병렬성(DLP)의 축복을 주었지만, 반대급부로 "모두가 한마음 한뜻으로 분기문 없이 직진해야 한다"는 무시무시한 코딩 제약을 프로그래머에게 강제(융합)하게 되었다.
📢 섹션 요약 비유: 선생님 1명이 32명의 유치원생(SIMT 워프)을 데리고 횡단보도를 건넙니다. 16명은 편의점에 가고 싶고, 16명은 화장실에 가고 싶다고 칭얼대면, 몸이 하나인 선생님은 절대 둘 다 동시에 데려갈 수 없습니다. 16명에게 "너네 화장실 앞에서 가만히 기다려(마스킹)!" 해놓고 편의점 다녀온 뒤, 다시 교대시키는 끔찍한 시간 낭비(워프 발산)를 치러야만 합니다.
Ⅲ. 융합 비교 및 다각도 분석 (Comparison & Synergy)
SIMT는 순수 병렬성(SIMD)과 자율적 스레드(MIMD) 사이의 위태로운 줄타기를 하는 이기종 타협안이다. 이를 비교하면 컴퓨터 구조의 딜레마가 보인다.
플린의 병렬 아키텍처 분류와 SIMT의 위치
| 분류 | 철학 (지휘관 : 병사 비율) | 유연성 (분기문) | 면적당 연산 성능 (가성비) | 현대 적용 |
|---|---|---|---|---|
| MIMD (멀티코어 CPU) | 1명당 1지휘관 (자율 행동) | 100% (알아서 다 함) | 최악 (제어부가 칩 다 잡아먹음) | 인텔 Core, 폰 노이만 컴퓨터 |
| SIMD (과거 벡터 머신) | 1지휘관이 데이터 덩어리 지휘 | 0% (분기문 원천 불가) | 중간 | CPU AVX 명령어, 구형 가속기 |
| SIMT (엔비디아 GPU) | 1지휘관이 32개 자아(ID) 지휘 | 50% (마스킹으로 직렬화 타협) | 우주 최강 | 쿠다(CUDA) 코어, 딥러닝 인프라 |
타 과목 관점의 융합 시너지
- 컴파일러 최적화 (프레디케이션, Predication): GPU 컴파일러(NVCC)는 분기 발산의 끔찍함을 알기에, 프로그래머가 멍청하게 짧은
if-else를 짜면 이를 뜯어고친다. 분기(Branch) 명령어를 기계어에서 아예 삭제해 버리고,A연산(조건 참일 때 저장)과B연산(조건 거짓일 때 저장)명령어를 둘 다 실행(마스킹) 시키는 프레디케이션(Predication) 기법으로 하드웨어 파이프라인의 멈춤을 강제로 막아내는 눈물겨운 융합을 보여준다. - 인공지능 아키텍처 (텐서 코어의 반역): 딥러닝 혁명이 터지자, SIMT 구조조차 비효율적이라고 까이기 시작했다. "왜 32명이 각자 레지스터에서 숫자를 하나씩 꺼내 곱하고 더하고 있지? 딥러닝은 무조건 4x4 행렬 뭉텅이 연산인데?" 엔비디아는 결국 볼타(Volta) 아키텍처부터 SIMT 쿠다 코어 옆에, 아예 행렬 전체를 1클럭에 씹어먹는 괴물인 **텐서 코어(Tensor Core)**를 융합 탑재했다. 이는 스레드의 자율성(SIMT)을 다시 일정 부분 포기하고 초거대 SIMD(행렬 융단 폭격)로 회귀하여 성능을 10배 이상 폭발시킨 역사적 아키텍처의 나선형 진화다.
[CUDA 스케줄러의 지연 은닉 (Latency Hiding) 마법]
SIMT의 워프 32명이 메모리를 퍼오느라 400클럭의 렉(Stall)이 걸렸다! CPU라면 뻗었겠지만?
하드웨어 스케줄러: "워프 0번 멈췄어? 바로 옆에 대기 타던 워프 1번 파이프라인에 꽂아!!"
(1클럭 스위칭 소모) -> 워프 1번 실행!
워프 1번도 멈춤? -> 워프 2번 실행!
... 워프 20번까지 돌리니 그제야 아까 워프 0번의 데이터 도착 완료!
=> 압도적인 융합: 비록 32명이 발이 묶여 둔탁한 SIMT 구조라도,
수십 개의 워프를 칩 위에 빽빽이 대기시켜 놓고 빛의 속도로 스위치(교대)해버리는
물량 공세 덕분에 코어의 ALU는 1초도 쉬지 않고 100% 풀가동된다.
📢 섹션 요약 비유: SIMT 구조는 노를 젓는 32인승 갤리선입니다. 1명이 물 마신다고 하면 31명이 같이 노를 멈춰야 하는 멍청한 배(워프 발산)지만, 선장(스케줄러)이 이 배를 20척 준비해 놓고 1번 배가 멈추면 1초 만에 2번 배 노꾼들에게 채찍을 휘두릅니다. 배 한 척의 사정은 딱하지만 함대 전체의 전진 속도(Throughput)는 무적함대급입니다.
Ⅳ. 실무 적용 및 기술사적 판단 (Strategy & Decision)
실무 AI 연구원이나 GPGPU 엔지니어가 C++ 쿠다(CUDA) 코드를 짤 때, 이 SIMT의 "동시 지휘" 룰을 모르면 초고가 GPU(A100, H100)를 사놓고 인텔 CPU 1개 코어 속도를 구경하게 된다.
실무 GPU 병목 튜닝 및 SIMT 최적화 시나리오
-
워프 분기 발산 (Warp Divergence) 타파를 위한 로직 평탄화
- 상황: 라이다(LiDAR) 센서 포인트 클라우드를 GPU로 계산하는데, 커널 코드 안에
if (x > 10)같은 공간 탐색 조건문을 넣었더니 코어 점유율이 50%로 반토막 남. - 의사결정: 워프(32개 스레드) 내부에서 절대
if-else분기가 갈라지지 않도록, **CPU 호스트 단에서 미리 데이터를 정렬(Sorting)**하여 양수는 양수끼리, 음수는 음수끼리 모아서 워프에 태워 보내거나, 아예 조건문을 없애고 삼항 연산자를 이용한 수학 공식(Result = A * (x>10) + B * (x<=10))으로 코드를 평탄화(Flatten) 시켜버린다. - 이유: SIMT 지휘관은 1명이다. 32명 중 단 1명만
else를 타도, 하드웨어는 눈물을 머금고 31명을 멈춰 세운 채 1명을 먼저 실행하는 직렬화 낭비를 저지른다. 워프 내의 32명은 무조건 "똑같은 곳을 보고 똑같은 짓을 하도록" 데이터를 재배치하는 것이 GPGPU 연봉을 결정하는 최상위 튜닝이다.
- 상황: 라이다(LiDAR) 센서 포인트 클라우드를 GPU로 계산하는데, 커널 코드 안에
-
메모리 코얼레싱 (Memory Coalescing) 강제 동기화
- 상황: 배열 연산을 시켰는데 쿠다 코어가 일을 안 하고 VRAM 병목(Memory Bound)에서 허덕임.
- 의사결정: 구조체 배열(AoS:
Array of Structures)을 완전히 해체하고, 배열의 구조체(SoA:Structure of Arrays) 포맷으로 뜯어고쳐서, 워프 내 스레드 0~31번이 1번지~32번지까지 딱 붙어있는 **연속된 메모리 주소(Contiguous Memory)**를 요구하도록 코딩한다. - 이유: SIMT 하드웨어의 메모리 컨트롤러는 스레드 32명이 "나란히 붙어있는" 주소를 요청하면, 128바이트짜리 거대한 포크레인 삽으로 한 방에 퍼와서(1 트랜잭션) 각 스레드에 뿌려준다(광속). 하지만 스레드들이 듬성듬성 흩어진 주소를 요구하면, 포크레인이 무려 32번이나 삽질을 해야 해서 메모리 대역폭이 1/32로 폭파해버린다. SIMT에선 생각도, 밥 먹는 위치도 일렬종대여야 한다.
[실무 SIMT 커널 Nsight 프로파일링 병목 진단 트리]
[현상] Nsight Compute로 GPU 파이프라인을 뜯어보니 ALU 낭비가 70%다.
├─ 지표에 Branch Efficiency (분기 효율성)이 100%가 아닌가?
│ ├─ Yes ──> 100% 워프 발산(Divergence) 지뢰 밟음!
│ │ 너의 코드 어딘가에 if-else나 횟수가 다른 for 루프가 숨어있어서
│ │ 스레드들이 서로를 기다리며 얼음 땡 놀이를 하는 중이다. 코드를 분해하라!
│ │
│ └─ No ───> 분기는 완벽하다. 모두가 같은 일을 한다.
│ ▼
├─ Memory Throughput 지표가 과부하(빨간불) 상태인가?
│ ├─ Yes ──> 메모리 코얼레싱(Coalescing) 실패. 스레드들이 너무 흩어진 주소를
│ │ 찔러대서 트래픽 잼 발생. 데이터를 1차원 선형 배열로 다시 포장해라!
운영 및 아키텍처 도입 체크리스트
-
텐서플로우(TensorFlow)나 파이토치(PyTorch)에서 마스킹(Masking) 처리를 할 때,
tf.where나torch.where함수가 결국 밑바닥 SIMT 하드웨어에서 워프 발산을 유발하지 않도록 최적화된 하위 텐서 연산을 호출하고 있는지 확인했는가?
안티패턴: "우와 나도 멀티스레드 10만 개 띄워봐야지!" 하고, GPU 커널 코드 안에 깊이가 수십 단계인 재귀 함수(Recursion)나 트리 탐색을 던져 넣는 초보자. 함수 호출 깊이가 워프마다 달라지는 순간 칩 내부에 대재앙이 터지며, 하드웨어 스택이 터져 커널 패닉을 맞이한다.
📢 섹션 요약 비유: SIMT 최적화는 북한의 매스게임(카드섹션) 지휘와 같습니다. 10만 명의 관중(스레드)이 단 하나의 어긋남 없이 똑같은 카드(데이터)를 똑같은 타이밍에 펼쳐야만 거대한 용(결과물)이 나타납니다. 1명이라도 화장실에 가거나 다른 카드를 꺼내면(분기 발산), 매스게임 전체가 멈추고 엉망이 되어버리는 극단의 동기화 예술입니다.
Ⅴ. 기대효과 및 결론 (Future & Standard)
SIMT는 똑똑하지만 소수정예인 CPU 중심의 컴퓨팅 철학을 엎어버리고, "멍청하더라도 1만 명을 일사불란하게 움직이면 세상을 바꿀 수 있다"는 병렬 공학의 새 시대를 연 아키텍처 모델이다.
| 척도 | 낡은 SIMD (CPU 벡터) 패러다임 | SIMT (NVIDIA GPU) 융합 패러다임 | 병렬 컴퓨팅 산업 기대효과 |
|---|---|---|---|
| 개발자 추상화 | 어셈블리로 레지스터를 수동으로 쪼갬 | threadIdx 등 스레드(자아) 개념 부여 | 전 세계 수백만 개발자가 1주일 만에 GPGPU 코딩 입문 가능 |
| 명령어 제어 비용 | 조건문 걸리면 시스템 뻗음 | 하드웨어 마스킹으로 분기문 유연 통과 | 딥러닝부터 유체 역학 시뮬레이션까지 인간의 모든 연산 GPU 오프로딩 |
미래 전망: 순수 SIMT 아키텍처는 워프 분기 발산(Divergence)의 저주를 풀기 위해 진화 중이다. 최신 엔비디아 Volta/Hopper 아키텍처에서는 워프 내 32명 스레드가 하나의 낡은 PC(Program Counter)를 쓰던 공산주의 방식을 버리고, **스레드 1개마다 개별적인 PC와 스케줄링 상태(Independent Thread Scheduling)**를 부여하는 파괴적인 혁신을 단행했다. 여전히 같이 움직이는 게 빠르지만, 필요할 땐 32명이 서로 다른 락(Lock)을 잡고 대기할 수 있게 허용함으로써 SIMT와 CPU의 MIMD 구조가 궁극적으로 융합되어 가는 완벽한 과도기에 있다.
📢 섹션 요약 비유: 과거 SIMT 군대는 32명이 다리를 묶고 뛰는 2인 3각 경기여서 1명이 넘어지면 다 같이 쓰러졌습니다. 하지만 미래의 진화된 SIMT는 다리에 묶인 밧줄을 살짝 느슨하게 풀어주어(독립 스케줄링), 웅덩이를 만나면 각자 피해서 점프한 뒤 다시 줄을 맞춰 뛰게 해주는 눈물겨운 자유도를 하드웨어로 선물해 주고 있습니다.
📌 관련 개념 맵 (Knowledge Graph)
- GPU / GPGPU | SIMT 실행 모델을 품고 있는 거대한 물리적 칩셋 박스와, 그 병렬력을 범용 연산에 끌어다 쓰는 패러다임
- 워프 (Warp) | SIMT 지휘관이 한 번 명령을 내릴 때 강제로 똑같이 움직여야 하는 32개 스레드의 불쌍한 운명 공동체
- 워프 분기 발산 (Warp Divergence) | SIMT 최악의 약점으로, 32명 중 일부가 If문을 타고 일부가 Else를 탈 때, 지휘관이 반을 정지시키고 직렬로 순차 처리하며 칩 성능을 50% 박살 내는 현상
- 메모리 코얼레싱 (Memory Coalescing) | 32명의 스레드가 메모리를 요청할 때 1번지, 2번지, 3번지처럼 나란히 붙어있게 코딩해야만 하드웨어가 1번의 덩어리로 퍼다 줘서 대역폭이 뚫리는 코딩 규칙
- 독립 스레드 스케줄링 (ITS) | 최신 엔비디아 칩에서 SIMT의 경직성을 풀기 위해, 스레드 각자에게 프로그램 카운터(PC)를 따로 쥐여줘 분기문에서 데드락이 걸리지 않게 숨통을 틔워준 아키텍처 진화
👶 어린이를 위한 3줄 비유 설명
- 개념: SIMT는 선생님(지휘관) 1명이 32명의 유치원생(스레드)을 통제할 때, "다 같이 1번 문제 풀어라!" 하고 단 한 번의 명령으로 32명의 아이들이 동시에 각자 자기 시험지를 풀게 만드는 방법이에요.
- 원리: 아이들은 자기가 몇 번인지(스레드 ID) 알고 있기 때문에, 똑같이 "더하기 해라!"라는 말을 들어도 각자 자기 번호에 맞는 숫자들을 쏙쏙 뽑아서 1초 만에 32개의 문제를 끝내버려요.
- 효과: 똑똑한 선생님이 32명에게 일일이 다가가서 설명하려면 너무 오래 걸리지만, 이 마이크 방송(SIMT) 한 번이면 수만 명의 아이들이 빛의 속도로 엄청난 수학 숙제(인공지능)를 뚝딱 해치울 수 있답니다.