SIMD와 SIMT의 차이점 정리
SIMD와 SIMT는 모두 하나의 명령어로 많은 데이터에 같은 연산을 한다는 점은 같지만, 프로그램에서 보이는 방식이 다릅니다. SIMD는 CPU의 벡터 명령어로, 프로그래머나 컴파일러가 폭이 정해진 벡터 레지스터에 데이터를 나열하고 명시적으로 명령어를 사용합니다. SIMT는 GPU의 방식으로, 스레드 하나의 처리를 평범하게 작성하면 하드웨어가 32개 등의 스레드를 워프로 묶어 같은 명령어로 실행합니다. 스레드마다 분기도 작성할 수 있지만, 워프 안에서 분기가 갈리면 양쪽 경로를 차례로 실행하므로 효율이 떨어집니다.
| 비교 항목 | SIMD | SIMT |
|---|---|---|
| 실행 모델 | 하나의 명령어로 벡터 레지스터에 나열한 여러 요소를 동시에 처리합니다 | 하나의 명령어를 워프로 묶인 다수의 스레드가 동시에 실행합니다. 각 스레드는 자신의 레지스터를 가집니다 |
| 프로그램에서 보이는 방식 | 벡터 폭을 의식하고 작성합니다. 인트린직 함수, 어셈블리, 컴파일러의 자동 벡터화를 사용합니다 | 스레드 하나의 처리를 스칼라 코드로 작성합니다. 묶는 것은 하드웨어입니다 |
| 병렬 폭 | 레지스터 폭으로 결정됩니다. 예: 512비트라면 32비트 수 16개 | 워프 폭(32개 등). 칩 전체로는 수만 개의 스레드를 동시에 유지합니다 |
| 분기 처리 | 요소별 분기는 작성할 수 없습니다. 비교 결과의 마스크로 양쪽을 계산해 선택합니다 | 스레드마다 작성할 수 있습니다. 워프 안에서 갈리면 양쪽 경로를 차례로 실행하고, 해당하지 않는 스레드는 쉬게 합니다(다이버전스) |
| 유효한 요소의 관리 | 프로그래머나 컴파일러가 마스크 명령어나 블렌드 명령어로 명시합니다 | 하드웨어가 유효한 스레드를 자동으로 관리합니다 |
| 메모리 접근 | 연속된 주소를 한꺼번에 읽는 데 강합니다. 흩어진 주소는 개더·스캐터 명령어로 다루지만 느립니다 | 각 스레드가 자유롭게 주소를 지정할 수 있습니다. 이웃한 스레드가 이웃한 주소를 읽으면 하나로 묶을 수 있습니다(코얼레싱) |
| 메모리 지연을 숨기는 방법 | 큰 캐시, 비순차 실행, 프리페치 | 다수의 워프를 전환하여, 대기 중인 워프 사이에 다른 워프를 실행합니다 |
| 플린 분류에서의 위치 | SIMD 그 자체 | SIMD의 일종을 스레드 형태로 보여 주는 방식 |
| 대표적인 사용처 | CPU의 벡터 명령어. 영상·음성 처리, 암호, 행렬 연산 루프 등 | GPU의 워프. 그래픽스, AI 학습·추론, 과학기술 계산 등 대규모 병렬 계산 |
수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.