멀티코어 프로그래밍 : 개요
멀티코어의 등장
- 컴퓨터의 진화 : 싱글코어 프로세서 ⇒ 멀티코어 프로세서
- 싱글코어의 클럭만 늘리면 발열과 전력소모가 너무 심해짐.
- 결국 여러 개의 코어를 붙이는 방향으로 선회.
다중 쓰레드와 멀티코어
다중 쓰레드 프로그래밍은 이러한 다중 코어를 보다 효율적으로 사용하고,
병행성(concurrency)를 향상할 기법을 제공한다.
싱글 코어에서는 1개의 코어가 1번에 1개의 쓰레드만 처리.
- 병행성 = 시간에 따라 쓰레드가 잘 정렬됨(interleaved)을 의미.
반면 멀티 코어에서는 각 코어를 통해 각 쓰레드를 처리.
- 병행성 = 여러 개의 쓰레드가 동시에 처리될 수 있음을 의미
병행과 병렬의 차이
다중 쓰레드를 다루기 위해 자주 나오는 용어를 짚고 넘어가자.
💡 병행성 : 프로세서가 여러 프로세스를 번갈아 처리해 마치 동시에 실행 되는 것처럼 보이는 것 병렬성 : 실제로 여러 프로세서를 사용해 여러 프로세스를 동시에 처리
멀티코어 개발 전에도 병행성은 구현할 수 있었다.
- CPU 스케쥴러로 하여금 프로세스 사이의 전환(=문맥 교환)을 굉장히 빠르게 처리하도록 함.
- 병행성은 구현된 것이나, 병렬성은 구현되지 않음.
멀티코어 프로그래밍 : 특징
멀티코어 시스템의 발전은 시스템 설계자 뿐만 아닌 App 개발자에게도 영향을 미침.
더 많은 App 개발자들이 멀티코어를 활용해야 할, 즉 다중 쓰레드를 처리해야 할 상황에 처해있음.
5가지 포인트
일반적으로 다중 코어 시스템을 처리하기 위해서는 5가지 봐야 할 점이 있음.
💡 1. task 인식 2. 균형 3. 데이터 분리 4. 데이터 종속성 5. 시험 및 디버깅
- task 인식
- 무엇을 병렬적이고, 독립적인 task로 나눌지 결정해야 함.
- task : 각각의 코어에서 병렬적으로 실행할 수 있는 일.
- 균형
- 각 task들이 전체 작업에 균등한 기여도를 가지는지 판단해야 함.
- 일부 task는 전체 프로세스에 별로 기여를 하지 못할 수도 있음.
- 이러한 task에 한 코어를 별도로 쓰는 것은 자원낭비임.
- 데이터 분리
- App을 task로 분리했으면, task에 딸린 data도 분리해야 됨.
- 데이터 종속성
- 한 task에 딸린 data는 다른 task와도 연관이 없는지 체크해야 함.
- 연관이 있다면, task끼리 data를 동기화하도록 설계해야 함.
- 테스트 & 디버깅
- 멀티코어로 작동하는 프로그램은 실행 경로가 다양함.
- 테스트와 디버깅 작업이 좀 더 어려워 질 수 있음.
이러한 이유 때문에 멀티코어에 관한 교육을 늘려야 한다고 주장하는 사람이 많음.
병렬 실행의 유형
병렬성(parallelism) 실행에는 2가지 유행; 데이터 병렬성과 태스크 병렬성이 존재.
꼭 둘 중 하나만 실행해야 하는 것은 아니며, 둘을 섞어서 App을 만들 수도 있음.
데이터 병렬 실행
동일한 데이터를 쪼갠 뒤, 각 부분집합을 연산하는데 초점을 맞춘다.
예를 들어, 다음과 같은 배열 : [0, 1, 2, 3, … n] 의 합을 구한다고 쳐보자.
싱글코어 ⇒ [0, 1, 2, 3, … n]의 합을 그냥 구한다.
반면, 듀얼코어라면 다음과 같이 동작한다.
- 코어1 :
[0, 1, 2, … n/2 - 1]의 합을 구한다. - 코어2 : 나머지의 합을 구한다.
- 두 결과를 서로 더한다.
태스크 병렬 실행
각각의 태스크를 코어에 분배한다.
다음과 같은 배열 : [0, 1, 2, 3, … n] 관련 작업을 한다고 쳐보자.
- 코어 1 :
[0, 1, 2, 3, … n]의 합을 구한다. - 코어 2 :
[0, 1, 2, 3, … n]의 평균을 구한다.