SIMD와 SIMT의 차이점 정리

SIMD와 SIMT는 모두 하나의 명령어로 많은 데이터에 같은 연산을 한다는 점은 같지만, 프로그램에서 보이는 방식이 다릅니다. SIMD는 CPU의 벡터 명령어로, 프로그래머나 컴파일러가 폭이 정해진 벡터 레지스터에 데이터를 나열하고 명시적으로 명령어를 사용합니다. SIMT는 GPU의 방식으로, 스레드 하나의 처리를 평범하게 작성하면 하드웨어가 32개 등의 스레드를 워프로 묶어 같은 명령어로 실행합니다. 스레드마다 분기도 작성할 수 있지만, 워프 안에서 분기가 갈리면 양쪽 경로를 차례로 실행하므로 효율이 떨어집니다.

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

수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.

상황별 선택 기준

SIMD
CPU에서 배열의 요소마다 같은 계산을 하는 루프를 빠르게 하고 싶을 때. 데이터가 연속으로 나열되어 있고 반복 사이에 의존이 없으면 효과가 크며, 컴파일러의 자동 벡터화로도 사용할 수 있습니다.
SIMT
수천~수백만 개의 독립된 요소에 같은 처리를 하는 대규모 병렬 계산. GPU에서 스레드별 프로그램을 작성해 실행합니다. 워프 안에서 분기와 메모리 주소가 맞춰지도록 만들면 효율이 올라갑니다.
함께 사용
GPU 내부에서는 워프 단위의 SIMT 실행이 SIMD 연산기 위에서 이루어집니다. CPU와 GPU를 함께 쓰는 시스템에서는 전처리와 제어를 CPU의 SIMD로, 큰 병렬 계산을 GPU로 분담합니다.

자주 묻는 질문

SIMT는 SIMD와 완전히 다른 구조인가요?

하드웨어 내부에서는 비슷한 구조입니다. 워프의 각 스레드는 SIMD 연산기의 한 레인에 대응하며 같은 명령어로 동작합니다. 차이는 보여 주는 방식으로, SIMT에서는 스레드별 레지스터, 주소, 분기를 하드웨어가 처리하므로 프로그래머는 벡터 폭을 의식하지 않고 작성할 수 있습니다.

워프 다이버전스를 줄이려면 어떻게 해야 하나요?

같은 워프의 스레드가 가능한 한 같은 쪽 분기를 지나도록 합니다. 예를 들어 조건 결과가 맞춰지도록 데이터를 재정렬하거나, 워프 단위로 조건이 바뀌도록 스레드 번호를 할당하거나, 짧은 분기는 선택 연산으로 바꾸는 등의 방법이 있습니다.

SIMD에서 if 문이 있는 처리는 어떻게 작성하나요?

비교 명령어로 요소별 조건을 마스크로 만들고, 양쪽 결과를 계산한 뒤 마스크에 따라 요소별로 선택합니다. 마스크 명령어가 있는 명령어 세트에서는 조건을 만족하는 요소만 연산·저장할 수 있습니다. 양쪽 경로를 계산하므로 분기 내용이 무거우면 효율이 떨어진다는 점은 SIMT의 다이버전스와 비슷합니다.

컴파일러의 자동 벡터화가 잘 되지 않는 것은 어떤 경우인가요?

반복 사이에 의존이 있을 때(이전 결과를 다음에 사용할 때), 포인터가 같은 영역을 가리킬 가능성이 있을 때, 데이터가 연속으로 나열되어 있지 않을 때, 루프 안에 복잡한 분기나 함수 호출이 있을 때 등입니다. 의존이 없음을 컴파일러에 알리는 지정이나 데이터 배치 변경으로 벡터화할 수 있는 경우가 있습니다.

이해도 확인

하나의 명령어로 여러 데이터에 같은 연산을 동시에 수행하는 방식은?

  1. ASISD
  2. BSIMD
  3. CMISD
정답과 해설 보기

정답: B. SIMD

SIMD는 하나의 명령어로 여러 데이터에 같은 연산을 병렬로 수행하는 방식으로, 예를 들어 512비트 레지스터라면 32비트 수치 16개를 한 번에 계산할 수 있습니다. x86의 SSE·AVX, ARM의 NEON·SVE 등이 있으며 이미지 처리, 동영상 압축, 행렬 연산 등에서 수 배 이상의 고속화를 얻을 수 있습니다. 플린의 분류에는 이 밖에 SISD(일반적인 순차 처리), MIMD(멀티코어) 등이 있습니다.

NVIDIA GPU에서 32개의 스레드를 하나의 묶음으로 하여 같은 명령을 일제히 실행하는 단위를 무엇이라 하는가?

  1. A워프
  2. B그리드
  3. C페이지
정답과 해설 보기

정답: A. 워프

블록 안의 스레드는 하드웨어 내부에서 32개씩 워프로 나뉘며, 하나의 워프의 32개 스레드는 같은 명령을 동시에 서로 다른 데이터에 대해 실행합니다. 이처럼 스레드로 작성한 프로그램을 묶어서 같은 명령으로 실행하는 방식을 SIMT라고 합니다. AMD GPU에서는 비슷한 단위를 웨이브프런트라고 하며 64개 또는 32개입니다. 블록 크기는 32의 배수로 하는 것이 기본입니다.

GPU의 SIMT(단일 명령·다중 스레드) 방식과 CPU의 SIMD 명령의 차이로 올바른 것은?

  1. ASIMT는 하나의 데이터에 여러 명령을 동시에 수행하고, SIMD는 하나의 명령을 하나의 데이터에 수행한다
  2. BSIMT와 SIMD는 완전히 같은 것이며 이름만 다르다
  3. CSIMT에서는 각 스레드를 독립된 프로그램으로 작성할 수 있고 분기도 하드웨어가 처리하지만, SIMD에서는 프로그래머나 컴파일러가 폭이 정해진 벡터 명령을 명시적으로 사용한다
정답과 해설 보기

정답: C. SIMT에서는 각 스레드를 독립된 프로그램으로 작성할 수 있고 분기도 하드웨어가 처리하지만, SIMD에서는 프로그래머나 컴파일러가 폭이 정해진 벡터 명령을 명시적으로 사용한다

CPU의 SIMD에서는 4개나 8개의 데이터를 묶은 벡터 레지스터에 하나의 명령을 적용하므로, 프로그램은 벡터 폭을 의식하여 작성합니다. GPU의 SIMT에서는 프로그래머가 하나의 스레드 처리를 평범하게 작성하면 하드웨어가 32개씩 묶어 같은 명령으로 실행합니다. 스레드별로 분기해도 되며 하드웨어가 갈라진 경로를 차례로 실행하지만, 이때는 효율이 떨어집니다.

  1. 하나의 워프 안에서 조건 분기에 의해 스레드의 절반이 if 쪽, 나머지 절반이 else 쪽으로 갈라졌다(워프 다이버전스). 일반적으로 어떻게 실행되는가?
  2. GPU의 메모리 병합 접근(코얼레싱)에 대한 설명으로 올바른 것은?
  3. 컴파일러의 자동 벡터화에서 사용되는 명령의 종류로 올바른 것은 무엇인가?

GPU 프로그래밍 문제 풀기

주요 용어 설명

SIMD
Single Instruction, Multiple Data의 약어. 하나의 명령으로 여러 데이터에 같은 연산을 동시에 수행하는 방식. 영상 처리와 AI 연산을 고속화한다.
SIMT
단일 명령·다중 스레드 방식. 프로그램은 스레드별로 작성하지만 하드웨어는 워프(NVIDIA에서는 32개) 단위로 스레드를 묶어 같은 명령으로 실행한다.
워프 다이버전스(Warp Divergence)
하나의 워프 안에서 조건 분기로 스레드가 가는 경로가 갈라지는 것. 갈라진 경로를 차례로 실행하므로 효율이 떨어진다.
메모리 코얼레싱(Memory Coalescing)
워프 안의 인접한 스레드가 인접한 주소에 접근할 때 이를 묶어 적은 횟수의 메모리 접근으로 처리하는 것. 병합 접근.
벡터화(vectorization)
루프 안에서 요소마다 하는 같은 계산을 SIMD 명령을 사용해 여러 요소를 한꺼번에 처리하는 형태로 바꾸는 최적화. 반복 간에 데이터 의존이 없어야 한다.

관련 비교