임베디드 멀티코어 프로세서의 아키텍처와 병렬 처리 설계

임베디드 멀티코어 프로세서의 SMP·AMP 처리 모델, 병렬 프로그래밍, 캐시와 전력 최적화, 적용 분야를 정리한다.

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

하나의 칩에서 병렬 처리를 설계하는 방식

임베디드 멀티코어 프로세서는 하나의 칩에 두 개 이상의 처리 코어를 넣어 병렬 처리 능력을 제공한다. 단일 코어의 성능 한계를 넘어서면서도 전력 효율을 유지하려는 설계에 쓰인다.

여러 코어를 통합하는 것만으로 성능이 자동으로 늘어나는 것은 아니다. 작업을 동시에 수행할 수 있도록 나누고, 코어 사이의 메모리 접근과 동기화 비용을 함께 다뤄야 한다. 코어 수를 늘려 성능을 확장할 수 있다는 장점도 이 조건 위에서 성립한다.

코어 구성이 달라지면 작업 배치도 달라진다

동종 멀티코어는 모든 코어가 같은 아키텍처와 성능을 가진 구조다. 대칭적 멀티프로세싱(SMP)에 적합하며, 작업을 코어에 고르게 분배하는 방식으로 운영한다. ARM Cortex-A53 쿼드코어와 Intel Atom 듀얼코어가 예시다.

이종 멀티코어는 성능과 전력 특성이 다른 코어를 조합한다. 비대칭 멀티프로세싱(AMP)에서 작업 성격에 맞는 코어를 선택할 수 있으며, ARM big.LITTLE과 Qualcomm Snapdragon이 여기에 속한다.

ARM big.LITTLE은 고성능 처리와 저전력 효율을 분리한 구조다.

구분 big 코어 LITTLE 코어
목적 고성능 처리 저전력 효율
예시 Cortex-A72, A76 Cortex-A53, A55
사용 게임, 동영상 인코딩 백그라운드 작업, 센서 처리
전력 높음 낮음

부하에 따라 코어를 전환하고, 글로벌 태스크 스케줄링으로 작업을 적절한 코어에 할당한다. 필요한 성능만 사용하도록 설계할 수 있어 스마트폰과 태블릿에 적용된다.

운영체제와 메모리 공유 방식에 따른 처리 모델

SMP에서는 하나의 운영체제가 모든 코어를 관리한다. 모든 코어가 같은 메모리 공간을 공유하고, 운영체제가 작업을 동적으로 할당한다. 이 구조에서는 코어 사이의 캐시 일관성을 유지해야 하며, 리눅스 멀티코어와 Windows 서버에 적용된다.

AMP는 각 코어가 별도 OS 또는 베어메탈을 실행하는 방식이다. 코어별로 독립된 메모리 공간을 두고 특정 작업을 특정 코어에 정적으로 배치한다. 캐시 일관성 프로토콜이 필요하지 않아 오버헤드가 낮으며, 실시간 시스템과 산업 제어에 맞는다.

하이브리드 모델은 SMP와 AMP를 함께 사용한다. 일부 코어는 SMP로 운용하고 일부는 AMP로 분리해, RTOS와 Linux를 동시에 실행할 수 있다. Cortex-A와 Cortex-M 조합, 자동차 및 산업용 IoT가 대표적인 적용 대상이다.

프로세서와 가속기 구성

ARM Cortex-A Series는 고성능 애플리케이션 프로세서 계열이다. Cortex-A53은 저전력 쿼드코어, Cortex-A72는 고성능 쿼드코어, Cortex-A76은 최신 고성능 코어로 제시된다. Cortex-R Series의 Cortex-R52는 듀얼 또는 쿼드코어 실시간 프로세서이며, Cortex-M Series의 Cortex-M7은 듀얼코어 고성능 MCU다.

Intel Atom은 저전력 듀얼/쿼드코어이고, AMD Ryzen Embedded는 4~8코어 고성능 제품이다. Intel Xeon-D는 서버급 멀티코어에 속하며, 이런 계열은 네트워크 장비와 산업용 PC에 적용된다.

RISC-V에서는 SiFive U74가 쿼드코어 64비트 RISC-V 예시다. 오픈소스 ISA는 자유로운 커스터마이징을 제공하며, 멀티코어를 64코어 이상으로 확장하는 설계도 가능하다. IoT와 엣지 컴퓨팅은 이러한 구조의 신규 시장이다.

특수 목적 멀티코어에는 CPU와 GPU를 통합한 NVIDIA Tegra, 다중 ARM과 DSP를 결합한 TI KeyStone, ARM과 FPGA를 결합한 Xilinx Zynq, 듀얼/쿼드 Cortex-A 기반의 NXP i.MX가 있다.

병렬성은 작업과 데이터의 성격에 맞춰 나눈다

태스크 병렬성은 서로 다른 작업을 각 코어에 배치하는 방식이다. 데이터 병렬성은 동일한 작업을 서로 다른 데이터에 병렬로 수행한다. 파이프라인 병렬성은 단계별 작업을 연속적으로 처리하며, 필요한 경우 이 모델들을 조합할 수 있다.

공유 자원을 다룰 때는 뮤텍스, 세마포어, 스핀락, 배리어 같은 동기화 메커니즘이 필요하다. 뮤텍스는 상호 배제, 세마포어는 자원 풀 관리의 카운팅 동기화, 스핀락은 짧은 크리티컬 섹션의 바쁜 대기 락, 배리어는 모든 코어가 대기하는 동기화 지점에 사용한다.

// 뮤텍스를 이용한 공유 자원 보호
pthread_mutex_t lock;
int shared_counter = 0;

void* increment_task(void* arg) {
    for(int i = 0; i < 1000; i++) {
        pthread_mutex_lock(&lock);
        shared_counter++;
        pthread_mutex_unlock(&lock);
    }
    return NULL;
}

코어 간 통신에는 공유 메모리, 메시지 큐, IPC(Inter-Process Communication), 하드웨어 메일박스를 사용할 수 있다. 공유 메모리는 가장 빠른 통신 방법이고, 메시지 큐는 비동기 데이터 전달에 맞는다. 하드웨어 메일박스는 코어 사이의 인터럽트와 메시지를 전달한다.

RTOS 환경에서는 태스크를 특정 코어에 고정해 실시간 요구사항을 분리할 수 있다.

// FreeRTOS 멀티코어 태스크 할당
void vTaskStartScheduler(void) {
    // 코어 0에서 실행
    xTaskCreateAffinitySet(task1, "Task1",
        STACK_SIZE, NULL, PRIORITY, NULL,
        (1 << 0));  // 코어 0에 고정

    // 코어 1에서 실행
    xTaskCreateAffinitySet(task2, "Task2",
        STACK_SIZE, NULL, PRIORITY, NULL,
        (1 << 1));  // 코어 1에 고정

    vTaskStartScheduler();
}

성능은 스케줄링과 메모리 접근에서 갈린다

부하 분산은 컴파일 시점에 작업을 정하는 정적 분산과, 실행 중 부하에 맞춰 조정하는 동적 분산으로 나뉜다. 유휴 코어로 작업을 옮기는 작업 스티링과 중요 작업을 먼저 처리하는 우선순위 기반 배치도 함께 고려한다.

캐시 일관성은 MESI와 MOESI 프로토콜로 다뤄진다. False Sharing을 피하려면 캐시 라인 경계를 고려해야 하며, 데이터 지역성을 높이는 메모리 접근과 코어별 캐시 영역을 분리하는 캐시 파티셔닝도 사용한다.

메모리 계층은 코어별 L1 캐시, 코어별 또는 공유 L2 캐시, 공유 L3 캐시, 메인 메모리로 이어진다. NUMA(Non-Uniform Memory Access)에서는 코어별 로컬 메모리를 고려해야 한다. 캐시 친화 스케줄링으로 캐시 히트율을 높이고, 코어 간 메모리 대역폭 경쟁을 줄이며, DMA로 CPU 개입 없는 메모리 전송을 활용한다.

전력 관리에서는 DVFS(Dynamic Voltage Frequency Scaling)로 전압과 주파수를 동적으로 조정한다. 유휴 코어의 전원을 끄고, big.LITTLE 클러스터를 전환하며, 워크로드에 따라 활성 코어를 조정한다.

병렬화의 한계와 동시성 오류

암달의 법칙은 순차 실행 부분이 전체 성능 향상을 제한한다는 점을 보여준다. 성능 향상은 Speedup ≤ 1 / ((1-P) + P/N)으로 표현되며, 실제로 100% 병렬화는 어렵다. 코어 수보다 병렬화할 수 있는 비율이 중요해지는 이유다.

락 경쟁, 코어 간 전환 비용, 동기화로 인한 캐시 무효화는 동기화 오버헤드의 원인이다. 락 프리 알고리즘이나 세밀한 락 설계로 이를 줄일 수 있다.

공유 자원에 동시에 접근하면 경쟁 조건이 발생하고, 순환 대기가 형성되면 데드락으로 멈출 수 있다.

// 데드락 예시
// 코어 1
pthread_mutex_lock(&lock_A);
pthread_mutex_lock(&lock_B);  // 코어 2가 보유 중
// ...

// 코어 2
pthread_mutex_lock(&lock_B);
pthread_mutex_lock(&lock_A);  // 코어 1이 보유 중
// ...

락 순서를 일관되게 유지하고 타임아웃을 두는 방식이 예방에 쓰인다. 멀티코어 버그는 타이밍에 의존해 재현이 어렵고, 관찰하면 사라지는 Heisenbug 형태로 나타날 수 있다. 멀티코어 디버거와 추적 도구, 철저한 동기화와 단위 테스트가 필요하다.

병렬 처리가 필요한 임베디드 환경

네트워크 장비에서는 패킷 플로우를 코어별로 분산하고, 라우팅 경로 탐색과 암호화/복호화를 독립 코어에서 처리한다. QoS는 코어별 트래픽 우선순위로 관리할 수 있다.

자동차 시스템에서는 ADAS 센서 데이터를 병렬 처리하고, 인포테인먼트의 UI·미디어·네비게이션을 분리한다. 실시간 코어는 브레이크와 조향 같은 안전 제어를 맡고, V2X 통신용 코어도 분리할 수 있다.

산업용 IoT에서는 다중 센서 데이터를 동시에 융합하고, 엣지 AI 추론 작업을 코어별로 나눈다. 여러 통신 프로토콜의 변환과 백그라운드 상태 감시도 병렬화 대상이다.

의료기기는 실시간 바이오 신호 분석, 의료 영상의 고속 처리, 독립 코어의 안전 기능 감시, DICOM과 HL7 데이터 통신을 함께 처리한다.

개발과 분석에 사용하는 도구

병렬 프로그래밍에는 OpenMP의 병렬 처리 디렉티브, Pthreads의 POSIX 스레드 라이브러리, TBB(Threading Building Blocks)의 Intel 병렬 라이브러리, OpenCL의 이기종 병렬 컴퓨팅을 사용한다.

도구 기능 대상
Perf 리눅스 성능 분석 범용
VTune Intel 프로파일러 Intel 프로세서
ARM Streamline ARM 성능 분석 ARM 프로세서
Tracealyzer RTOS 태스크 추적 실시간 시스템

디버깅 도구로는 스레드별 중단점을 제공하는 GDB 멀티스레드 디버깅, 코어별 제어를 위한 JTAG 멀티코어 디버거, 고급 멀티코어 디버거인 Lauterbach TRACE32, 타이밍 분석용 오실로스코프가 있다.

매니코어와 적층, AI 가속기

매니코어는 수십~수백 코어로 대규모 병렬 처리를 수행하는 구조다. 코어와 메모리를 타일로 구성하고 NoC(Network-on-Chip)로 코어 사이를 고속 통신하며, AI 가속과 과학 계산에 적용된다.

3D 적층 기술은 코어와 메모리를 수직으로 배치하고 TSV(Through-Silicon Via)로 레이어를 고속 연결한다. 메모리 접근 대역폭을 늘리고, 짧은 연결을 통해 전력 효율을 높인다.

AI 가속기 통합은 AI 추론 전용 코어인 NPU(Neural Processing Unit)를 포함한다. CPU, GPU, NPU를 결합한 혼합 아키텍처는 온디바이스 머신러닝과 낮은 지연 시간의 실시간 AI를 지원한다.

임베디드 시스템멀티코어병렬 처리SMPAMP