멀티코어 프로세서의 병렬 처리와 확장성

멀티코어 프로세서의 구조, 캐시 일관성, 암달의 법칙과 병렬 프로그래밍의 성능 제약을 정리한다.

2026-08-14 · 최초 발행 2026-01-03

하나의 칩에 2개 이상의 독립 처리 코어를 넣으면 여러 작업을 동시에 실행할 수 있다. 멀티코어 프로세서는 이 방식으로 클럭 속도를 계속 높이기 어려워진 상황에서 처리 성능과 전력 효율을 함께 확보한 CPU 아키텍처다.

각 코어는 별도의 명령어 흐름을 실행하고, 캐시·메모리 컨트롤러·I/O 인터페이스 같은 자원은 함께 쓴다. 운영체제와 애플리케이션은 여러 스레드를 동시에 배치해 스레드 수준 병렬성(TLP)을 활용한다. 일반적인 구조는 모든 코어의 기능과 성능이 같은 대칭형이다.

클럭을 높이는 대신 코어를 늘리게 된 배경

주파수 상승은 전력 소비와 발열 문제에 부딪혔다. Dennard Scaling이 끝난 뒤에는 클럭을 올리는 방식만으로 성능을 높이기 어려워졌고, 멀티태스킹과 멀티스레딩 애플리케이션의 증가도 병렬 처리 수요를 키웠다.

저주파수 다중 코어는 고주파수 단일 코어보다 전력 면에서 효율적일 수 있다. 제조 측면에서도 코어를 추가하는 방식이 주파수 향상보다 비용 효율적이어서, 멀티코어는 데스크탑·서버·모바일 전반의 기본 구조가 됐다.

코어와 공유 자원이 만나는 방식

각 코어는 ALU, FPU, 레지스터처럼 독립적으로 명령어를 처리할 수 있는 실행 유닛을 가진다. L1 캐시는 보통 코어 전용이며 I-Cache와 D-Cache로 분리된다. L2는 코어 전용이거나 일부 코어가 공유하고, L3는 모든 코어가 함께 쓰는 대용량 캐시로 배치될 수 있다. 코어와 캐시 사이, 코어 사이의 통신은 온칩 인터커넥트가 담당한다.

듀얼코어 프로세서Core 1ALUFPUL1 I-CacheL1 D-CacheCore 0ALUFPUL1 I-CacheL1 D-CacheL2 Cache (Shared)(수 MB)L3 Cache (Shared)(수십 MB)Memory ControllerI/O ControllerMain Memory(DRAM)

코어 수가 늘어난 구조에서는 L2를 코어 묶음별로 공유하고, 모든 코어가 L3와 메모리 컨트롤러로 이어지는 구성이 가능하다. 링 버스나 메시 같은 온칩 인터커넥트는 이 연결을 담당한다.

쿼드코어 프로세서Core 0L1 CacheL2 Cache(Core 0,1 공유)Core 1L1 CacheCore 2L1 CacheL2 Cache(Core 2,3 공유)Core 3L1 CacheOn-Chip Interconnect(Ring Bus / Mesh)L3 Cache (모든 코어 공유)Memory Controller

병렬 실행은 작업·스레드·데이터에서 일어난다

서로 다른 프로세스를 각 코어에 배치하는 방식은 Task-Level Parallelism이다. 하나의 프로세스가 가진 여러 스레드를 나누어 실행하면 Thread-Level Parallelism이 되고, 같은 연산을 여러 데이터에 적용하면 Data-Level Parallelism으로 SIMD와 결합할 수 있다.

코어는 독립적으로 명령어를 실행하지만, 공유 메모리를 함께 쓰므로 통신과 동기화가 필요하다. 이 지점부터 병렬화의 이점과 비용이 함께 나타난다.

메모리 계층은 가까운 전용 캐시에서 시작해 공유 캐시와 DRAM으로 이어진다. 아래 구조에서는 L1 캐시가 32KB, L2 캐시가 256KB이며, 공유 L3는 8MB ~ 64MB, 주 메모리는 수 GB ~ 수백 GB 범위로 나타난다. 접근 지연은 L1에서 약 1 cycle, L2에서 약 10 cycles, L3에서 약 40 cycles, 주 메모리에서 약 200 cycles로 달라진다.

~1 cycle~1 cycle~1 cycle~1 cycle~10 cycles~10 cycles~10 cycles~10 cycles~40 cycles~40 cycles~40 cycles~40 cycles~200 cyclesCore 0Core 1Core 2Core 3L1 Cache(32KB)L1 Cache(32KB)L1 Cache(32KB)L1 Cache(32KB)L2 Cache(256KB)L2 Cache(256KB)L2 Cache(256KB)L2 Cache(256KB)L3 Cache (Shared)(8MB ~ 64MB)Main Memory(DRAM)(수 GB ~ 수백 GB)

공유 데이터가 캐시에 복제되면 캐시 일관성도 관리해야 한다. MESI 프로토콜은 Modified, Exclusive, Shared, Invalid 상태를 다루며, 스누핑은 코어 간 캐시 상태를 감시한다. 디렉토리 기반 방식은 캐시 라인의 위치와 상태를 추적한다. 쓰기 시 다른 코어의 캐시를 무효화하는 Write Invalidate와, 다른 코어의 캐시를 갱신하는 Write Update도 이 문제와 관련된다.

같은 코어를 반복할지, 역할을 나눌지

동종 멀티코어는 모든 코어가 같은 아키텍처와 성능, 동일 ISA를 사용한다. 캐시와 실행 유닛도 균등하게 제공할 수 있어 운영체제가 코어의 차이를 고려하지 않고 스케줄링하기 쉽다. Intel Core i5/i7, AMD Ryzen이 이 유형의 예다.

이종 멀티코어는 성능이 다른 코어를 결합한다. ARM의 big.LITTLE은 고성능 코어와 저전력 코어를 함께 두고, 작업 부하에 따라 적절한 코어를 사용한다. 부하 변화에 따라 코어 간 마이그레이션도 일어난다. ARM Cortex-A78(Big) + A55(Little), Apple M 시리즈가 예에 속한다.

이종 멀티코어 (big.LITTLE)고부하 작업저부하 작업Little Cluster(저전력)Little Core 0Little Core 1Little Core 2Little Core 3Big Cluster(고성능)Big Core 0Big Core 1Cache CoherentInterconnectShared L3 Cache작업 부하

SMT와 하이퍼스레딩은 물리적 코어를 여러 논리적 코어로 보이게 하는 방식이다. 실행 유닛과 캐시는 공유하지만, 레지스터와 PC 같은 자원은 스레드별로 분리한다. 코어의 유휴 시간을 줄여 활용률을 높이는 것이 목적이다. Intel Hyper-Threading은 2-way SMT, AMD SMT도 2-way SMT의 예다.

Simultaneous Multi-Threading (하이퍼스레딩)물리적 코어 1개명령어 제공명령어 제공Fetch/Decode(공유)논리적 코어 0(Thread 0)논리적 코어 1(Thread 1)Execution Units(공유)L1 Cache(공유)Register File(분리)

코어를 추가해도 선형으로 늘지 않는 이유

병렬 프로그램의 속도 향상은 암달의 법칙으로 표현할 수 있다.

  • Speedup = 1 / ((1-P) + P/N)
  • P: 병렬화 가능 비율
  • N: 코어 수

병렬화할 수 없는 순차 부분이 전체 성능의 상한을 만든다. 예를 들어 전체 프로그램에서 순차 부분이 10%, 병렬 부분이 90%라면, 단일 코어에서는 순차 실행 10 시간과 순차 실행 90 시간으로 총 100 시간이다. 쿼드 코어에서는 순차 실행 10 시간에 병렬 실행 22.5 시간(90/4)이 더해져 총 32.5 시간이 걸린다. 이때 속도 향상은 3.08배이며 이론적 최대 10배에는 도달할 수 없다.

쿼드 코어속도 향상3.08배단일 코어순차 실행10 시간순차 실행90 시간 100 시간구성순차 부분(10%)병렬 부분(90%)전체 프로그램(100%)순차 실행10 시간병렬 실행22.5 시간(90/4) 32.5 시간이론적 최대10배 불가

확장성을 볼 때는 문제 크기를 고정한 상태에서 코어 수를 늘리는 Strong Scaling과, 코어당 문제 크기를 유지하면서 전체 문제 크기를 키우는 Weak Scaling을 구분한다. 병렬 효율은 실제 성능을 이론적 성능으로 나눈 값이다.

동기화, 통신, 캐시 일관성 유지는 오버헤드가 된다. 작업을 코어 사이에 고르게 배분하는 Load Balancing도 필요하다. 어느 코어에는 일이 몰리고 다른 코어가 쉬면 코어 수가 많아도 처리량을 충분히 얻지 못한다.

메모리 벽도 중요한 제약이다. 코어 성능 증가를 메모리 대역폭이 따라가지 못하면, 여러 코어가 공유 캐시와 메모리 버스를 두고 경쟁한다. NUMA 환경에서는 코어와 메모리 사이의 거리에 따라 접근 시간이 달라지고, 코어 수가 증가하면 대역폭 포화가 발생할 수 있다. 대용량 캐시, 넓은 메모리 버스, HBM은 이 병목에 대응하는 수단이다.

경쟁병목 현상메모리다수의 코어(동시 메모리 요청)On-Chip Interconnect(대역폭 제한)Memory Controller(채널 제한)DRAM(대역폭 레이턴시)성능 저하

병렬 프로그램에서 관리할 대상

멀티스레딩에는 Pthreads, C++11 std::thread, Java Thread를 사용할 수 있다. OpenMP는 #pragma omp parallel 같은 지시어 기반 병렬화를 제공하고, MPI는 주로 클러스터에서 쓰는 분산 메모리 병렬 프로그래밍 모델이다. Intel TBB와 OpenMP Tasks는 작업 기반 모델에 속하며, async/await, Future/Promise는 비동기 프로그래밍 방식이다.

공유 상태를 다룰 때는 뮤텍스로 임계 영역을 보호하고, 세마포어로 자원 개수를 제한한다. 조건 변수는 스레드 간 신호를 전달하며, Atomic 연산은 읽기-수정-쓰기를 원자적으로 수행한다. 메모리 배리어는 메모리 연산 순서를 보장한다.

성능 최적화에서는 캐시 라인 단위의 False Sharing을 피하고 코어당 적절한 작업량을 배정해야 한다. 데이터 지역성을 높여 각 코어가 로컬 데이터에 주로 접근하게 하고, Fine-grained locking이나 Lock-free 자료구조로 락 경쟁을 낮춘다. NUMA 환경에서는 코어와 가까운 메모리를 쓰는 NUMA Awareness가 필요하다.

제품군에서 보는 멀티코어 구성

데스크탑과 서버에서는 Intel Core i3가 2-4코어, i5가 4-6코어, i7이 6-8코어, i9가 8-18코어로 제시된다. AMD Ryzen은 Ryzen 3이 4코어, Ryzen 5가 6코어, Ryzen 7이 8코어, Ryzen 9가 12-16코어다. 서버용 Intel Xeon은 최대 60코어 이상, AMD EPYC은 최대 96코어 구성을 제공한다.

모바일과 임베디드 영역에서는 ARM Cortex-A가 big.LITTLE 구조에 쓰이고, Apple M 시리즈는 M1(8코어), M2(8코어), M3(8-16코어)로 구성된다. Qualcomm Snapdragon과 Samsung Exynos는 8코어 모바일 SoC로 제시된다.

특수 목적 제품으로는 SMT-8을 지원하는 고성능 서버용 IBM POWER, 48코어 + 4 어시스턴트 코어를 갖는 슈퍼컴퓨터용 Fujitsu A64FX, 클라우드 서버용 ARM 프로세서인 AWS Graviton이 있다.

처리량의 이점과 병렬성의 비용

멀티코어는 병렬 작업의 처리량을 높이고 여러 애플리케이션을 동시에 실행할 수 있게 한다. 저주파수 다중 코어는 고주파수 단일 코어보다 전력 효율 측면에서 유리할 수 있으며, 코어 수 증가로 성능을 확장할 여지도 있다. 제조 비용도 주파수 향상보다 효율적일 수 있다.

반대로 병렬 프로그래밍 자체가 복잡해진다. 단일 스레드 성능은 단일 코어 고주파수 CPU에 미치지 못할 수 있고, 스레드 동기화와 코어 간 데이터 공유는 각각 동기화 오버헤드와 캐시 일관성 비용을 만든다. 코어별 동적 전력 관리도 설계와 운영의 복잡성을 높인다.

프로세서 구조가 향하는 방향

멀티코어는 수백 개 코어를 쓰는 매니코어 방향으로 확장되고 있다. 여러 칩 레이어를 수직으로 쌓는 3D 적층, HBM·HMC를 이용한 고대역폭 메모리, CPU·GPU·AI 가속기를 함께 넣는 이종 통합도 메모리 병목과 처리 요구에 대응하는 흐름이다. 모바일과 에지 디바이스를 위한 저전력 설계 역시 계속 요구된다.

Chiplet 아키텍처는 작은 칩을 조합해 대형 프로세서를 구성한다. RISC-V 기반 멀티코어, 메모리 가까이에서 연산하는 Near-Memory Computing, 뇌 구조를 모방하는 Neuromorphic 코어, 양자 코어와 클래식 코어를 결합하는 Quantum-Classical Hybrid도 새로운 처리 구조로 언급된다.

멀티코어CPU 아키텍처병렬 처리캐시 일관성운영체제