병렬 처리 기법은 고성능 컴퓨팅에서 매우 중요한 주제이다. 특히, SIMD (Single Instruction, Multiple Data)와 SIMT (Single Instruction, Multiple Threads) 구조는 병렬 처리에서 많이 사용되는 기법 중 하나이다. 여기서는 SIMD와 SIMT 구조에 대해 상세히 설명하겠다.

SIMD (Single Instruction, Multiple Data)

SIMD는 한 개의 명령어를 여러 데이터에 동시에 적용하는 방식이다. 이는 벡터 연산에 매우 효과적이며, 동일한 연산을 여러 데이터 포인트에 동시에 수행하므로 처리량(Throughput)을 극대화할 수 있다.

SIMD의 특징

SIMD의 구조

SIMD 구조는 각 데이터 요소가 독립적으로 병렬 처리되는 방식으로, 다음과 같은 형태로 표현될 수 있다.

\mathbf{y} = \mathbf{A} \cdot \mathbf{x} + \mathbf{b}

여기서:

SIMD 아키텍처에서는 위 연산이 한 번에 병렬로 처리된다. 이는 벡터 프로세서를 통해 각 요소별 연산이 독립적으로 이루어지기 때문이다.

SIMT (Single Instruction, Multiple Threads)

SIMT는 GPU에서 주로 사용되는 병렬 처리 기법으로, 단일 명령어 스트림이 여러 스레드에 의해 실행되는 방식을 의미한다. 이는 수천 개의 스레드가 동시에 동작하는 GPU의 특성에 맞추어 설계되었다.

SIMT의 특징

SIMT의 구조

SIMT에서는 많은 수의 스레드가 SP(Streaming Processors, 스트리밍 프로세서)에서 병렬로 실행된다. 이를 이해하기 위해 벡터의 내적 연산을 예로 들어보겠다.

내적 연산은 두 벡터 \mathbf{a}\mathbf{b} 벡터 사이의 연산으로, 각 요소의 곱을 모두 더하는 방식으로 이루어진다.

\mathbf{c} = \sum_{i=1}^{n} a_i \cdot b_i

이 연산은 SIMT 구조에서는 \mathbf{a}\mathbf{b} 벡터의 각 요소 곱셈이 각기 다른 스레드에서 동시에 수행된다.

SIMD 및 SIMT의 비교

처리 효율성

SIMD 구조는 동일한 연산을 여러 데이터에 동시에 적용하는 데 강점을 가지므로 데이터 병렬성이 높은 작업에서 매우 효율적이다. 예를 들어, 벡터 연산, 이미지 및 비디오 처리 등에서 탁월한 성능을 발휘한다. 반면, SIMT 구조는 대규모 병렬성을 가진 작업에서 효율적이다. 많은 스레드가 독립적으로 처리될 수 있으므로, 컴퓨터 그래픽, 물리 시뮬레이션 및 딥러닝 모델의 학습과 같은 응용 분야에서 성능이 뛰어난다.

주기억장치 접근 방식

SIMD 구조에서는 벡터 프로세서가 한 번에 다수의 데이터를 읽고 쓰므로 메모리 접근의 효율성이 높다. 반면, SIMT 구조에서는 각 스레드가 독립적으로 메모리에 접근할 수 있다. 이는 스레드 간 메모리 접근 충돌을 최소화하지만, 때로는 비효율적인 메모리 사용을 초래할 수 있다.

병렬화의 한계

SIMD 구조는 모든 데이터가 동일한 연산을 수행해야 하므로 조건문이 많은 코드에서 성능이 저하될 수 있다. 예를 들어, 조건문이 여러 데이터 요소에서 다른 결과를 초래할 경우, 일부 데이터 요소는 비활성화되거나, 마스크링(masking) 기술이 필요하다. 반면, SIMT 구조에서는 각 스레드가 독립적으로 동작하므로 다양한 조건문이 있더라도 성능 저하가 덜한다. 하지만 스레드 다이버전스(thread divergence)가 발생할 경우, 일부 스레드가 비활성화되어 성능 저하가 발생할 수 있다.

적용 사례


이 두 가지 병렬 처리 기법은 고성능 컴퓨팅에서 중요한 역할을 하며, 각각의 특성과 장점을 살려 다양한 응용 분야에서 사용된다.