병렬 컴퓨팅의 정의
- 여러 명령어가 동시에 실행되는 컴퓨팅의 한 형태. 주로 고성능 컴퓨팅(high performance computing)에서 수년간 사용되어 왔지만, frequency scaling의 물리적 제한으로 인해 근간에 들어 더욱 주목 받고 있다. 최근에는 병렬 컴퓨팅이 multicore processors로 인해 Computer Architecture에서 주된 패러다임으로 자리잡아가고 있는 실정.

병렬 컴퓨팅의 특징
- 병렬 컴퓨터 프로그램은 순차적(sequential) 프로그램보다 더 어려운데 동시성(concurrency)는 경쟁 조건(race condition)과 같은 새로운 종류의 잠재적 버그를 유발하기 때문이다..
- 서로 다른 작업 간의 통신(communication)과 동기화(synchronization)는 통상 뛰어난 성능을 이루는 데 가장 큰 장벽이 되곤하며 전력 소비 역시 병렬 컴퓨팅에서 주요 고려사항임.
- 병렬화에 의한 프로그램의 속도 향상은 암달의 법칙을 따른다.
- (순차를 포함한) 병렬 컴퓨터와 프로그램 분류에는 주로 Flynn의 분류 체계를 따른다(SISD, SIMD, MISD, MIMD).

병렬성(parallelism)의 종류
- 비트 수준 병렬성(Bit-level parallelism) : 프로세서가 사이클 당 처리하는 정보의 량, 즉 word 크기를 높이는 방법. 초기의 8bit 마이크로프로세서에서 시작해 8bit, 16bit를 거쳐 32bit가 20여년간 주로 사용되다가 근래에는 64bit로 넘어가는 실정.
- 명령어 수준 병렬성(Instruction level parallelism) : 다중 상태(multi-stage)의 명령어 파이프라인 뿐 아니라 (function unit을 통해) 동시에 하나 이상의 명령어를 실행하는 수퍼스칼라(superscalar) 프로세서를 나타냄. 주로 수퍼스칼라를 설명할 때 사용.
- 데이터 병렬성(Data parallelism) : 여러 프로세서에 액세스하는 형태.
- 작업 병렬성(task parallelism) : ...
메모리와 통신
- 병렬 컴퓨터에서 주기억 장치는 (단일 주소 공간 내에서 모든 프로세스 요소가 공유되는) 공유 메모리 형태와 각각의 프로세스 요소가 자신만의 지역 주소 공간을 갖는 분산 메모리(distributed memory) 형태로 분류된다. 분산 메모리란 메모리가 논리적으로 분산됨을 의미하지만 종종 물리적으로 분리됨을 암시하기도 한다. 분산 공유 메모리(distributed shared memory)는 이들 두 방식이 혼합된 것으로서, 프로세싱 요소는 자신만의 지역 메모리 뿐 아니라 비지역적 프로세서의 메모리에 에 액세스하기도 한다.

모든 주 메모리에 동일한 지연률(latency)와 대역폭(bandwidth)으로 액세스 가능한 컴퓨터 아키텍처는 Uniform Memory Access(UMA) 시스템이라 하며 통상 (물리적으로 분산되지 않은) 공유 메모리 시스템이 여기에 속한다. 또한 이러한 속성을 지니지 않은 아키텍처는 Non-Uniform Memory Access(NUMA)로 알려져 있다. 분산 메모리 시스템은 NUMA에 속한다.

병렬 컴퓨터에서는 하나 이상의 위치에 동일한 값을 저장하는 캐시(cache)를 구성하기가 어려우며, 이로 인해 잘못된 연산을 수행할 여지가 많다. 이러한 컴퓨터는 캐시 값을 추적하고 전략적으로 일소(purge)함으로 캐시 일관성을 이루는 cache coherency 시스템을 필요로 하며, Bus snooping(sniffing)은 이를 구현하는 가장 흔한 방법중 하나이다. 하지만 대규모의 고성능 캐시 일관성(cache coherence) 시스템 설계는 매우 어려우므로, 공유 메모리 컴퓨터 아키텍처는 분산 메모리 시스템에 비해 규모 확장이 어렵다.

프로세서 대 프로세서, 프로세서 대 메모리간 통신 H/W는 여러가지 방법으로 구현 가능하며, 그 방법으로서 공유(multiported, multiplexed) 메모리 기법 뿐 아니라 공유 버스 또는 star, ring, tree, hypercube, n-dimensional mesh 등의 여러 topology를 통해 상호 연결된 네트워크가 사용된다.

병렬 컴퓨터의 종류(classes of parallel computers)
- 병렬 컴퓨터는 하드웨어가 지원하는 병렬성의 수준에 따라 분류가 가능하다. 본 분류법은 기본 컴퓨팅 노드 간의 거리와도 얼마간 유사한 특징을 보이기도 하는데, mutually exclusive하지 않다는 데 주의하자. 예를 들어 SMP로 이루어진 클러스터가 있다.

1. 다중코어 컴퓨팅(multicore computing)
- 멀티코어 프로세서는 여러 실행 유닛(execution unit; core)로 이루어진 프로세서이다. 다중코어 프로세서는 수퍼스칼라 프로세서와는 다르다. 단일 사이클 당 여러 명령어를 실행하는 것은 동일하지만, 수퍼스칼라 프로세서는 하나의 명령어 스트림(thread)에서 처리하는 반면 다중코어 프로세서는 여러 명령어 스트림에서 명령어를 처리하기 때문이다. 각각의 코어는 잠재적으로 수퍼스칼라가 될 수도 있다.
(인텔의 HyperThreading으로 잘 알려진) 동시적 다중스래딩(simultaneous multithreading; SMT)은 가상 멀티코어(pseudo-multicoreism)의 초기 형식이다. 여러 명령어 스트림에서 명령어를 동시에 발송(issue)한다. 기본적으로 superscalar 구조를 요구한다. 반면 이에 대칭되는 형식을 가리켜 Temporal multithreading이라 하며 한번에 하나의 명령어 스트림에서 명령어를 발송한다.
참고) 이탤릭체의 내용은 Wikipedia의 내용이 잘못되어 수정한 것임. reference : William Stallings' 컴퓨터시스템구조론 7E, Simultaneous multithreading. Wikipedia
2. 대칭적 다중프로세싱(Symmetric multiprocessing: SMP)
SMP는 메모리를 공유하면서 버스를 통해 연결된 다수의 동일한 프로세서로 구성된 컴퓨터 시스템이다. 버스 경합(bus contention)으로 인해 버스 아키텍처는 확장이 어렵기 때문에, SMP는 일반적으로 32개 프로세서를 넘어서 구성되지 않는다.

분산 컴퓨팅(distributed computing)
(분산 메모리 다중 프로세서라고도 불리는) 분산 컴퓨터는 프로세싱 요소가 네트워크를 통해 연결된 분산 메모리 컴퓨터 시스템이다. 분산 컴퓨터는 확장에 매우 유리하다(highly scalable).

3. 클러스터 컴퓨팅(cluster computing)

사용자 삽입 이미지

클러스터는 가까이서 함께 동작하는 loosely coupled 컴퓨터의 그룹이지만 여러 면에서 보았을 때 이들은 단일 컴퓨터로 볼 수 있다. 클러스터는 네트워크로 연결된 여러 standalone 머신으로 구성된다. 클러스터 내의 머신은 대칭적일 필요는 없지만 이 경우 부하 분산(load balancing)이 더 어렵다.
가장 유명한 클러스터는 베오울프 클러스터(Beowulf cluster)로 이 클러스터는 TCP/IP 이더넷 랜으로 연결되어 있다. 또한 수퍼컴퓨터의 TOP500의 대다수가 클러스터이다.

4. 대규모 병렬 프로세싱(Massive Parallel Processing: MPP)
MPP는 네트워크로 연결된 매우 많은 수의 프로세서로 이루어진 단일 컴퓨터이다. MPP는 여러 면에서 클러스터와 비슷하지만 종종 프로세서 수가 100개를 훌쩍 넘어선다. MPP에서 각각의 CPU는 자신만의 메모리뿐 아니라 OS와 응용 프로그램의 복사본을 갖는다. 각각의 서브시스템은 high-speed interconnect를 통해 연결되어 있다.
TOP500의 수퍼컴퓨터 중 가장 빠른 Blue Gene/L이 바로 MPP이다.

5. 그리드 컴퓨팅(Grid computing)
그리드 컴퓨팅은 가장 분산된 형태의 병렬 컴퓨팅이다. 그리드 컴퓨팅은 특정 문제를 해결하기 위해 (수마일 이상 떨어진) 인터넷을 통해 연결된 컴퓨터를 사용한다. 인터넷은 낮은 대역폭과 극단적으로 높은 지연율이 생길 수 있으므로 통상 그리드 컴퓨팅은 오직 난해한 병렬 문제(embarrassingly parallel problem)를 다루는 데 사용한다. 많은 수의 그리드 컴퓨팅 응용이 만들어졌으며, SETI@home과 Folding@Home은 대표적인 예이다.
대부분의 그리드 컴퓨팅 응용이 미들웨어를 사용하여 네트워크 리소스 관리와 그리드 컴퓨팅 응용을 위한 소프트웨어 인터페이스의 표준화를 이룬다. 또한 그리드 컴퓨팅 소프트웨어는 CPU의 유휴 사이클(spare cycle)을 이용한다.

특화된 병렬 컴퓨터 - Vector Processors
벡터 프로세서(vectro processor)는 하나의 명령어로 큰 크기의 데이터 집합을 처리할 수 있는 컴퓨터 시스템 혹은 CPU로서, 수치 또는 벡터로 이루어진 선형 배열을 다루는 고성능 연산 시스템이다. 벡터 연산의 예로서, A = B x C에서 A, B, C 모두 64개의 64비트 소수점 수로 이루어진 벡터 연산이 되겠다. Flynn의 분류 체계 상 SIMD에 매우 가깝다.

소프트웨어
- 병렬 컴퓨터를 위한 여러 병행 프로그래밍 언어(concurrent programming language), 라이브러리, API, 병렬 프로그래밍 모델이 존재하며, 일반적으로 기반 메모리 아키텍처(공유 메모리, 분산 메모리, 공유 분산 메모리)에 따라 분류된다. 공유 메모리 프로그래밍 언어는 공유 메모리 변수를 통해, 분산 메모리의 경우는 메시지 전달(message passing)을 통해 통신을 이룬다. POSIX 스래드와 OpenMP는 공유 메모리 API에서, Message Passing Interface(MPI)는 메시지 전달 시스템 API에서 가장 폭넓게 사용된다.
reference:
Parellel Computing. Wikipedia
Posted by 어쨌건간에