용어 설명

병렬 처리 프로그래밍의 필요성

효율적인 병렬 처리 알고리즘을 직접 설계하고 구현해야 할 필요성을 살펴보자. 아래 예제 코드가 있다.

int sum = 0;
for (int i=0; i<N; i++)
{
	int x = ComputeNextValue();
	sum += x;
}

위 코드를 병렬로 할 경우, 아래처럼 생각해 볼 수 있다.

  1. 전체 N개 작업을 N/P개씩 P개 작업그룹으로 분할
  2. 각 스레드 or 코어는 작업 그룹을 하나씩 할당
  3. 각각의 값을 계산하고, 그 합을 대표 스레드에게 전달
  4. 모든 스레드가 작업을 마칠 때까지 대기
  5. 대표 스레드가 결과를 취합한 후, 하나로 더해 return

위의 과정에서는 연산에 걸리는 시간과 데이터를 전송 받는 시간 사이의 trade-off를 잘 고려해야 한다. 연산이 진행되고 취합하는 과정을 최적화 하는 것도 성능 개선에 도움이 된다.

병렬 처리 하드웨어

플린의 분류법 (Flynn’s taxonomy)

Micheal J. Flynn이 1966년에 제안한 컴퓨터 아키텍처 구분법이다. 기준은 1. 데이터에 대해 한 번에 수행하는 명령어(instruction)의 개수와 2. 명령어가 수행되는 데이터(data) 개수이다.

Untitled

MIMD

여러 명령을 여러 개의 데이터에 적용하는 컴퓨팅 아키텍처. 명령어와 데이터가 1:1로 연결되며, 다수의 SISD가 하나의 칩 안에 들어있는 구조라고 생각하면 된다. 멀티코어 CPU가 한 예이다. 각 산술논리장치 (Arithmetic Logic Unit, ALU)가 각각의 Control Unit을 가지고 있다. 각 스레드에 독립된 작업(task)들을 분배하는 경우가 많으며, 이러한 병렬 처리 기법을 taks-level parallelism이라고 부른다.