병렬처리와 Flynn 분류
동시성과 병렬성·파이프라인·벡터·멀티코어를 구분하고 Flynn 분류의 기준을 사례에 적용합니다.
사진 100장의 밝기를 바꾸는 작업은 여러 코어에 나눌 수 있습니다. 하지만 한 장의 다음 계산이 앞 결과를 기다려야 한다면 마음대로 나눌 수 없습니다. 병렬처리는 여러 작업을 실제로 겹쳐 수행하는 것이며 의존 관계와 공유 자원을 함께 봅니다.
명령과 데이터의 흐름으로 분류하기
Flynn 분류는 명령 흐름과 데이터 흐름의 개수로 SISD·SIMD·MISD·MIMD를 구분합니다. 흐름은 단순히 사용자 프로그램 파일 수를 세는 말이 아닙니다.
| 분류 | 뜻 | 학습 사례·주의 |
|---|---|---|
| SISD | 단일 명령·단일 데이터 흐름 | 한 처리 흐름의 기본 모델. 내부 파이프라인은 있을 수 있음 |
| SIMD | 단일 명령·다중 데이터 흐름 | 같은 연산을 여러 원소에 적용하는 벡터·SIMD 단위 |
| MISD | 다중 명령·단일 데이터 흐름 | 일반 범용 컴퓨터 사례는 흔치 않으며 모든 파이프라인을 이 이름으로 부르지 않음 |
| MIMD | 다중 명령·다중 데이터 흐름 | 독립 명령 흐름을 실행하는 멀티코어·멀티프로세서 |
GPU를 설명할 때 SIMD 분류만으로 전체 실행 모델을 끝내지 않습니다. 스레드 묶음의 명령 실행·분기 처리는 구현의 별도 모델이 필요합니다. 이 교재에서는 여러 데이터에 같은 계산을 적용하려는 이유까지 다룹니다.
파이프라인과 벡터는 다른 질문
파이프라인은 여러 명령의 단계를 겹칩니다. SIMD는 하나의 연산을 여러 데이터 원소에 적용합니다. 멀티코어는 여러 명령 흐름을 실행합니다. 하나의 프로세서에 이 기술들이 함께 존재할 수 있으므로 배타적인 제품 종류로 외우지 않습니다.
동시성(concurrency)은 여러 작업이 진행 중인 상태를 다루는 설계이며, 한 코어에서 번갈아 실행해도 성립할 수 있습니다. 병렬성은 같은 시간에 실행되는 처리에 초점을 둡니다. 코어 수가 두 개라고 하나의 프로그램이 자동으로 두 배 빨라지지 않습니다.
작업을 분할할 수 있는지 판단하기
길이 8 배열의 각 값에 3을 더하는 작업은 원소마다 독립입니다. 두 작업자가 앞 4개·뒤 4개를 맡을 수 있습니다. 모든 원소의 합은 각 부분 합을 계산한 뒤 마지막으로 합치는 단계가 필요합니다. x[i]=x[i-1]+a[i]처럼 이전 결과를 읽는 단순 실행은 의존 관계가 있어 같은 방식으로 동시에 처리하면 안 됩니다.
독립 문제: 분류와 의존 관계
A 장치는 하나의 연산을 8원소에 적용합니다. B는 두 코어가 서로 다른 프로그램을 실행합니다. 각각의 분류를 쓰세요. 이어 총합을 두 작업자가 계산할 때 각 부분 합을 같은 변수에 동기화 없이 쓰면 안전한지 판단하고, 안전한 병합 방법을 글로 설계하세요.
힌트
같은 변수의 읽기→더하기→쓰기 사이에 다른 작업이 들어올 수 있습니다.
풀이
A는 SIMD 사례, B는 MIMD 사례입니다. 공유 합계의 동기화 없는 갱신은 잃어버린 갱신을 만들 수 있습니다. 각 작업자가 별도 부분 합을 기록하고 둘이 끝난 뒤 하나의 단계에서 더하는 방법이 있습니다. 분류를 아는 것만으로 데이터 경쟁이 해결되지는 않습니다.
다음 NUMA·일관성은 여러 코어가 같은 데이터에 접근할 때의 거리와 값의 문제입니다.