멀티코어 프로그래밍
멀티코어 시스템의 개념
과거에는 연산 성능 향상을 위해 단일 CPU 시스템에서 다중 CPU 시스템으로 발전했으나, 최근에는 하나의 칩 위에 다수의 연산 코어를 배치한 구조로 진화하였다. 이러한 시스템을 멀티코어 시스템이라 하며, 운영체제는 각 코어를 별도의 CPU처럼 취급한다.
멀티스레드 프로그래밍은 이런 다중 코어를 효율적으로 활용하기 위한 기법이다.
하나의 애플리케이션이 4개의 스레드를 가진다고 할 때:
단일 코어 시스템에서는 스레드들이 시간 분할 방식으로 교대로 실행됨 (동시성, concurrency)
다중 코어 시스템에서는 여러 스레드가 병렬로 실행될 수 있음 (병렬성, parallelism)
병렬성(parallelism)은 실질적인 동시에 수행되는 것을 의미하고, 동시성(concurrency)은 논리적으로 동시에 실행되는 것처럼 보이는 상황을 의미함.
멀티코어 환경에서의 병렬 처리를 위해 다음과 같은 5가지 도전 과제가 존재한다:
작업 식별
프로그램 내 병렬 수행 가능한 부분을 식별
독립적인 작업으로 나누어 코어에 분산
작업 균형(Balance)
작업 간 처리량이 고르게 분포되어야 함
불균형하면 일부 코어는 낭비됨
데이터 분할(Data Splitting)
병렬 처리 시 각 스레드가 다룰 데이터도 분할되어야 함
데이터 의존성(Data Dependency)
서로 다른 작업이 동일 데이터를 다룰 경우 순서 제어 필요
동기화 문제가 발생할 수 있음
테스트와 디버깅
병렬 프로그램은 실행 경로가 다양해 예측이 어렵고 디버깅이 복잡함
Amdahl’s Law
병렬화가 불가능한 부분이 전체 성능 향상을 제한하는 구조를 수학적으로 설명한 법칙
공식:
Speedup≤1S+1−SN\text{Speedup} \le \frac{1}{S + \frac{1-S}{N}}
S: 병렬화 불가능한 비율
N: 코어 개수
예시:
S = 0.25일 경우, 2개 코어 → 1.6배 속도 향상
같은 조건에서 4개 코어 → 2.28배 향상
S가 0.5면 아무리 많은 코어를 추가해도 최대 속도 향상은 2배
병렬성의 종류
멀티코어 프로그래밍에서 병렬성은 다음 두 가지 형태로 나뉜다:
데이터 병렬성 (Data Parallelism)
같은 작업을 서로 다른 데이터 조각에 대해 병렬로 수행
예: 배열의 합계를 계산할 때, 절반은 A 스레드, 나머지 절반은 B 스레드
작업 병렬성 (Task Parallelism)
각 스레드가 서로 다른 작업을 수행
같은 데이터를 다루더라도 연산 내용이 다름
예: 하나는 평균, 다른 하나는 분산을 계산
두 방식은 서로 배타적이지 않으며, 하나의 애플리케이션이 **혼합형(hybrid)**으로 구현되기도 함
Last updated