Yeon's 개발블로그

지식을 전파하는 개발자가 되고싶습니다.

Cloud Computing

3. 병렬 하드웨어 (Parallel Hardware)

Dev.yeon 2020. 10. 20. 23:18

* 병렬 하드웨어란? 

병럴컴퓨터는 다수의 CPU가 다수의 프로그램 혹은 분할된 프로그램을 동시에 처리하는 컴퓨터를 말한다. 특히 병렬 하드웨어는 프로그래머가 소스코드를 수정하여 하드웨어의 병렬 특성을 이용할 수 있는 경우로 국한한 것을 의미한다.  명령어 스트림의 개수와 동시에 처리가능한 데이터 스트림의 개수를 기준으로 하드웨어들을 분류한다. 병렬하드웨어는 크게 SIMD와 MIMD로 나눌 수 있다. 

병렬 컴퓨터 분류 (Flynn's Taxonomy)

1. SIMD 시스템 

-명령 1개가 여러 데이터를 대상으로 동시에 처리된다. 

-하나의 CU와 여러대의 ALU로 구성되고, CU에서 ALU들로 broadcast된다. ALU는 명령을 실행하거나 idle상태로 기다릴 수 있다. 다만 같은 시각에 서로 다른 명령을 실행하는 ALU들은 없다. (명령하나, 여러개의 데이터가 기본원칙)

-단점: 모든 ALU들을 동일한 명령을 처리하거나 IDLE상태에 있게되고, ALU에는 명령들을 저장할 곳이 없다. data parallel 특징을 가졌기때문에 처리할 데이터가 방대한 경우에는 적합하지만, 복잡한 구조를 가지는 병렬 문제 처리에는 적합하지 않다. 

EX) 벡터 프로세서, GPU

 

2. MIMD 시스템

-다중 데이터 스트림에 다중 명령어 스트림이 동작한다. 

-완전히 독립적인 프로세스 유닛들로 구성되며, 각 core는 자신만의 CU와 ALU를 갖는다. 

-SIMD시스템과는 달리 비동기적이여서 global clock이 없고, 각 core가 동일한 명령을 실행한다고 해도 각자 실행속도가 다를 수 있다. 

-MIMD시스템에는 공유메모리 시스템(Shared-memory system)과 분산메모리 시스템(Distributed-memory System)이 있다. 

2-1. 공유메모리 시스템 (Shared-Memory System)

자율적으로 동작하는 프로세서들이 인터커넥션 네트워크를 통해 메모리 시스템에 연결되어 있고, 프로세서들은 메모리를 공유한다. 프로세서들은 공유 데이터 구조에 의해서 서로 통신하는 것이지, CPU사이의 연결을 하지는 않는다. 가장 널리 사용되는 공유 메모리 시스템들은 하나이상의 멀티코어 프로세서들을 사용한다. (하나의 칩에 여러개의 core). 멀티코어 시스템에는 UMA와 NUMA가 있다.  

UMA 멀티코어 시스템
NUMA 멀티코어 시스템

UMA멀티코어 시스템은 모든 core에서 메모리에 액세스 하는데 걸리는 시간이 같지만, NUMA 멀티코어 시스템은 메모리에 직접 연결된 core의 메모리 액세스 속도가 더 빠르다. 

 

2-2. 분산메모리 시스템 (Distributed-Memory System)

여려대의 컴퓨터들이 인터커넥션 네트워크로 연결되어 하나의 시스템처럼 동작한다. MIMD의 일종인 클러스터는 CPU사이의 통신을 Ethernet을 이용한다.

분산메모리 시스템

 

3. SPMD와 MPMD

SPMD는 single program multiple data 로 실행할 프로그램이 1개이다. MPMD는 multiple program multiple data 로 실행할 프로그램이 일반적으로 master용과 worker용 2개이다. MPMD는 SPMD도 변환이 가능하다. 병렬 프로그램 작성시 프로그래머는 프로세스(혹은 쓰레드)간의 작업량 균등화, 동기화, 통신 3가지를 신경써야한다. 

공유메모리 프로그램에서 쓰레드 사이 통신을 보면, 변수들은 공유(shared)또는 프라이빗(private)으로 선언된다. 공유 변수들은 모든 쓰레드가 읽고 쓸 수있는 변수이고, 프라이빗 변수들은 대체로 하나의 쓰레드 만이 접근할 수 있다. 쓰레드 사이의 통신은 주로 공유 변수를 통해 묵시적으로 이루어진다. 

분산메모리 프로그램에서 쓰레드 사이 통신을 보면, 프로세스들은 자신만이 쓸 수 있는 private메모리를 가지고 있기 때문에, 메시지 패싱을 이용한다.  

각 프로세서들은 프라이빗 파일을 열 수 있지만, 여러 프로세스가 동일한 파일을 열수는 없다. 보통 프로세스 0만이 stdin을 액세스하고, stdout과 stderr는 모든 프로세스가 액세스할 수 있다.