Flynn 분류로 보는 병렬 컴퓨터 아키텍처

Flynn 분류의 SISD, SIMD, MISD, MIMD 구조와 병렬성, 메모리 모델을 비교해 현대 컴퓨팅 시스템의 계층적 구성을 이해한다.

2026-08-15 · 최초 발행 2025-12-28

명령어와 데이터의 흐름으로 나누는 병렬성

Michael J. Flynn은 1966년에 병렬 컴퓨팅 시스템을 명령어 스트림과 데이터 스트림의 수로 구분하는 틀을 제안했다. 이 기준은 전통적인 폰 노이만 컴퓨터부터 GPU와 슈퍼컴퓨터까지, 시스템이 어떤 형태의 병렬성을 제공하는지 파악하는 출발점이 된다.

분류 결과는 SISD, SIMD, MISD, MIMD로 나뉜다. 핵심은 처리 장치의 개수 자체가 아니라, 실행되는 명령어 흐름과 처리 대상 데이터 흐름이 단일인지 다중인지다.

Flynn's Classification 1:명령어 스트림(Instruction Stream) 2:데이터 스트림(Data Stream)Single(단일)Multiple(다중)Single(단일)Multiple(다중)SIMISDMDSISDSIMDMISDMIMD

명령어 스트림은 CPU가 실행하는 명령어의 흐름이다. Single은 하나의 명령어 시퀀스, Multiple은 서로 독립적인 여러 명령어 시퀀스를 뜻한다. 데이터 스트림은 명령어가 다루는 데이터의 흐름이며, 하나의 데이터 집합이면 Single, 독립적인 여러 데이터 집합이면 Multiple이다.

순차 실행을 대표하는 SISD

SISD(Single Instruction, Single Data)는 하나의 명령어와 하나의 데이터를 다루는 전통적인 폰 노이만 컴퓨터 모델이다. 하나의 제어 유닛과 처리 유닛, 메모리 시스템이 순차적으로 동작한다.

SISD 구조제어 유닛(Control Unit)처리 유닛(Processing Unit)메모리(Memory)단일 명령어스트림단일 데이터스트림

한 번에 하나의 명령어를 실행하고 하나의 데이터를 처리하므로 실행 순서가 명확하다.

"메모리""ALU""제어 유닛""메모리""ALU""제어 유닛"순차적 실행명령어 1 인출명령어 1데이터 A 처리결과 저장명령어 2 인출명령어 2데이터 B 처리결과 저장

초기 PC의 Intel 8086, Motorola 68000 계열, 단일 코어 프로세서, 단순한 임베디드 마이크로컨트롤러가 이 범주에 속한다.

// SISD 실행 예시
int a = 5;
int b = 10;
int c = a + b;  // 단일 명령어로 단일 데이터 처리

구조와 구현, 프로그래밍 방식이 단순하고 비용도 낮다는 장점이 있다. 반면 성능 확장성이 제한되며 병렬 처리를 할 수 없어 현대의 대용량 데이터 처리에는 적합하지 않다.

같은 연산을 여러 데이터에 적용하는 SIMD

SIMD(Single Instruction, Multiple Data)는 하나의 제어 유닛이 동일한 명령어를 여러 처리 유닛에 전달하고, 각 유닛이 서로 다른 데이터를 처리하는 방식이다. 벡터 프로세서와 GPU의 데이터 병렬성을 설명할 때 중심이 되는 모델이다.

SIMD 구조제어 유닛(Control Unit)처리 유닛 1처리 유닛 2처리 유닛 3처리 유닛 4메모리 1메모리 2메모리 3메모리 4단일 명령어스트림다중 데이터스트림

모든 처리 유닛은 같은 명령어를 동시에 수행하지만, 입력 데이터는 각기 다르다.

"처리 유닛 4""처리 유닛 3""처리 유닛 2""처리 유닛 1""제어 유닛""처리 유닛 4""처리 유닛 3""처리 유닛 2""처리 유닛 1""제어 유닛"par[동시 실행]par[서로 다른 데이터 처리]단일 명령어로 다중 데이터 동시 처리명령어: ADDADDADDADDADD1 + 2 = 34 + 5 = 97 + 8 = 1510 + 11 = 21

Cray 슈퍼컴퓨터와 NEC SX 시리즈 같은 벡터 프로세서, NVIDIA CUDA와 AMD ROCm 기반 GPU가 대표 사례다. GPU는 수천 개의 코어에 동일한 연산을 적용할 수 있다. CPU에서도 Intel SSE, AVX, AVX-512, ARM NEON 같은 SIMD 확장이 벡터화 연산을 지원한다.

// SIMD 실행 예시 (AVX 사용)
#include <immintrin.h>

// 8개의 float를 동시에 더하기
__m256 a = _mm256_set_ps(8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
__m256 b = _mm256_set_ps(8.0, 7.0, 6.0, 5.0, 4.0, 3.0, 2.0, 1.0);
__m256 result = _mm256_add_ps(a, b);  // 단일 명령어로 8개 덧셈 동시 수행

행렬 연산, 이미지·비디오 처리, 딥러닝 텐서 연산, 신호 처리는 SIMD에 잘 맞는다. 제어 유닛 하나로 여러 처리 유닛을 제어하므로 하드웨어 효율도 높다. 다만 모든 유닛이 같은 명령어를 실행해야 하므로 조건 분기가 많거나 데이터 구조가 균일하지 않은 작업에서는 비효율적일 수 있다.

실용적 사례가 드문 MISD

MISD(Multiple Instruction, Single Data)는 여러 처리 유닛이 하나의 데이터 스트림에 서로 다른 명령어를 실행하는 구조다.

MISD 구조 (이론적)메모리(단일 데이터)제어 유닛 1제어 유닛 2제어 유닛 3처리 유닛 1처리 유닛 2처리 유닛 3명령어스트림 1명령어스트림 2명령어스트림 3단일 데이터스트림

동일 데이터에 서로 다른 연산을 동시에 적용할 필요가 거의 없고, 나온 결과를 어떤 방식으로 통합할지도 불명확하다. 하드웨어 복잡도에 비해 효율도 낮다.

MISD의 문제점같은 데이터에다른 연산을동시 수행할필요성 거의 없음결과 값들을어떻게 통합할지불명확하드웨어 복잡도대비 효율 낮음실용적 사례거의 없음

제한적으로는 동일 데이터를 여러 알고리즘으로 처리해 결과를 비교하는 결함 허용 시스템, 우주선·항공기처럼 안전이 중요한 시스템, 여러 암호화 알고리즘을 병렬로 적용하는 보안 강화 목적의 시스템을 떠올릴 수 있다. 일부 문헌은 파이프라인 구조를 MISD로 분류하기도 하지만, 일반적으로 인정받는 분류는 아니다.

MISD는 정의상 가능하지만 실용적 가치는 거의 없는 범주다. Flynn 체계를 완전하게 구성하는 역할에 가깝다.

독립적인 작업을 병렬로 수행하는 MIMD

MIMD(Multiple Instruction, Multiple Data)는 여러 프로세서가 각각 독립적인 명령어와 데이터를 처리하는 방식이다. 멀티코어 프로세서, 클러스터, 슈퍼컴퓨터처럼 현대 병렬 컴퓨팅에서 널리 쓰이는 구조가 여기에 속한다.

MIMD 구조프로세서 3프로세서 2프로세서 1제어 유닛 1처리 유닛 1제어 유닛 2처리 유닛 2제어 유닛 3처리 유닛 3공유 메모리또는상호 연결망명령어스트림 1명령어스트림 2명령어스트림 3데이터스트림 1데이터스트림 2데이터스트림 3

각 프로세서는 독립적으로 실행하고 별도의 데이터를 다룬다. 따라서 작업 병렬성(Task Parallelism)과 데이터 병렬성을 함께 지원한다.

"메모리/네트워크""프로세서 3""프로세서 2""프로세서 1""메모리/네트워크""프로세서 3""프로세서 2""프로세서 1"par[독립적 실행]par[독립적 데이터 처리]필요 시 동기화 및 통신명령어 A 실행명령어 B 실행명령어 C 실행데이터 X 처리데이터 Y 처리데이터 Z 처리결과 공유결과 공유결과 공유

Intel Core i7, i9는 416 코어, AMD Ryzen은 864 코어를 제공하며 Apple M 시리즈도 이 범주에서 볼 수 있다. LAN으로 연결한 클러스터, 데이터센터와 클라우드 인프라, TOP500 순위의 대부분을 차지하는 슈퍼컴퓨터도 MIMD 구조를 사용한다. 슈퍼컴퓨터는 수만~수백만 개의 코어를 활용한다. SETI@home, Folding@home, 블록체인 네트워크 같은 분산 컴퓨팅 사례도 포함된다.

공유 메모리를 사용하는 방식

공유 메모리 방식의 대표적인 구현으로는 SMP(Symmetric Multi-Processing)가 있다. 프로세서가 하나의 메모리 영역을 함께 사용하므로 프로그래밍은 상대적으로 간단하지만 확장성에는 제약이 있다. 일반적으로 8~64 코어 범위에서 쓰이며, 데스크톱·서버 멀티코어 CPU와 워크스테이션에 적용된다.

Processor 1공유 버스Processor 2Processor 3Processor 4공유 메모리

노드별 메모리를 사용하는 방식

분산 메모리 방식에서 쓰이는 대표적인 구조로는 MPP(Massively Parallel Processing)가 있으며, 각 노드가 자신의 메모리를 보유하고 네트워크로 통신한다. 메시지 패싱 방식으로 MPI 등을 사용하며 수천~수만 노드까지 높은 확장성을 제공한다. 슈퍼컴퓨터, 클라우드 클러스터, 빅데이터 처리 시스템이 적용 대상이다.

노드 3노드 2노드 1네트워크네트워크네트워크ProcessorMemoryProcessorMemoryProcessorMemory

MIMD는 작업과 데이터 병렬성을 모두 활용할 수 있고 확장성과 적용 범위가 넓다. 대신 동기화와 통신 오버헤드가 발생하며, 디버깅과 프로그래밍의 복잡도도 높다. 경쟁 조건(Race Condition) 같은 동시성 문제를 관리해야 한다.

프로그래밍 모델로는 Pthreads, OpenMP 같은 스레드 기반 방식, MPI(Message Passing Interface) 메시지 패싱 방식, OpenMP + MPI 하이브리드 방식이 있다.

분류별 차이

분류 제어 유닛 처리 유닛 메모리 병렬성 실제 사례 사용 빈도
SISD 1개 1개 1개 없음 전통적 단일 CPU 낮음 (레거시)
SIMD 1개 다수 다수 데이터 GPU, 벡터 프로세서 높음 (특화)
MISD 다수 다수 1개 ? 거의 없음 거의 없음
MIMD 다수 다수 공유/분산 작업+데이터 멀티코어, 클러스터 매우 높음 (주류)

계층적으로 섞여 있는 현대 시스템

실제 컴퓨팅 시스템은 하나의 분류만으로 고정되지 않는 경우가 많다. 데이터센터는 다수의 서버가 MIMD로 동작하고, 각 서버의 멀티코어 CPU도 MIMD 구조를 이룬다. 서버에 연결된 GPU는 SIMD 방식으로 연산하며, CPU 코어는 AVX 같은 SIMD 확장을 지원할 수 있다.

현대 시스템(예: 데이터센터)MIMD 레벨(다수의 서버)서버 1서버 2멀티코어 CPU(MIMD)GPU(SIMD) 코어는SIMD 확장(AVX 등) 지원

딥러닝 훈련 시스템을 예로 들면, 클러스터 상위 레벨에서는 여러 서버가 독립적으로 작업하는 MIMD 구조가 나타난다. 서버 내부의 멀티코어 CPU도 MIMD이며, GPU에서는 수천 개 코어가 동일 연산을 수행하는 SIMD가 사용된다. CPU 코어의 최하위 레벨에서는 AVX-512 같은 SIMD 확장이 동작한다.

분류 체계가 제공하는 기준과 경계

Flynn 분류는 복잡한 병렬 시스템을 명확하게 구분하고, 시스템 설계에서 아키텍처 선택과 알고리즘·하드웨어 매칭의 기준을 제공한다. 60년 가까이 사용된 프레임워크이며 컴퓨터 구조와 병렬 처리 개념을 학습하는 기초이기도 하다.

다만 현대 시스템을 4가지 범주로만 설명하는 데에는 한계가 있다. 하이브리드 구조를 명확하게 다루기 어렵고, GPU의 SIMT(Single Instruction, Multiple Threads), SPMD(Single Program, Multiple Data), CPU + GPU + FPGA 등의 이질적 컴퓨팅처럼 새로운 패러다임도 존재한다. 일부 연구에서는 더 세분화한 분류를 제안하지만, Flynn의 원래 분류는 여전히 가장 널리 사용된다.

Flynn 분류컴퓨터구조병렬처리GPUMIMD