Multiprocessor
다중 프로세서란 컴퓨터 시스템 한 대에 둘 이상의 CPU를 이용하여 병렬로 처리하는 것을 가리킨다
다중 프로세서를 사용하는 이유는 여러대의 CPU를 연결하여 더 높은 성능을 내기 위함이다. 구체적으로는 프로세스나 쓰레드 레벨의 병렬화를 통해 각각의 CPU에서 다른 프로그램들이 동시에 실행되는 것을 목표로 한다
Processor의 종류
프로세서의 종류는 instruction과 data stream에 따라 4가지로 나눌 수 있다.
- SISD : Single Instruction Single Data stream. 하나의 명령이 하나의 프로세서에서 실행되고 하나의 데이터를 처리하는 경우
- 하나의 제어장치와 프로세서로 구성
- Uniprocessor
- MISD : Multiple Instruction Single Data stream. 여러 명령이 여러 프로세서에서 실행되지만 모든 프로세서가 하나의 데이터를 처리하는 경우
- SIMD : Single Instruction Multiple Data stream. 하나의 명령이 여러 프로세서에서 처리되고, 각 프로세서는 서로 다른 데이터를 처리하는 경우
- 하나의 제어장치와 여러개의 프로세서로 구성
- GPU
- MIMD : Multiple Instruction Multiple Data stream. 여러 명령이 여러 프로세서에서 처리되고, 각 프로세서는 서로 다른 데이터를 처리하는 경우
- 여러개의 제어장치와 프로세서로 구성
- Multiprocessor
Shared Memory Multiprocessor
다중 프로세서 환경에서 각 프로세서는 하나의 물리적 메모리를 공유한다. 일반적으로 각 프로세서는 자신만 사용하는 캐시를 가지고, 각 프로세서의 캐시가 Interconnection network를 통해 메모리와 I/O장치에 접근하는 구조를 가진다
Parrallel Programming
다중 프로세서를 활용하여 최적의 성능을 내기 위해서는 병렬 프로그래밍이 필요한데, 이는 순차적 프로그래밍에 비해 여러가지 경우를 고려해야 한다.
- 작업을 어떻게 분산시킬 것인지
- worker간 부하를 어떻게 분산시킬 것인지
- 데이터를 어떻게 동기화할 것인지
- worker사이에 소통은 어떻게 할 것인지
이러한 문제들을 처리하기 위한 방법으로는 크게 프로그래머가 명시적으로 병렬처리를 지시하거나, 하드웨어와 OS에서 병렬처리를 지원하는 방법이 있다
- OpenMP와 같이 병렬처리를 지원하는 API를 사용하여 코드상에서 명시적으로 병렬처리를 지시하는 방법
- OS와 하드웨어를 통해 병렬처리를 지원하는 방법
- 다중프로세서 환경에서 OS는 쓰레드를 스케줄링하여 각 프로세서에게 부여되는 부하를 관리한다
- 메모리가 공유되는 다중프로세서 환경에서 write invalidate protocol과 lock을 이용하여 공유변수를 동기화한다
- write invalidate protocol : 캐시 일관성을 유지하는 기술로 한 프로세서의 캐시에서 write가 일어나면 브로드캐스팅을 통해 다른 캐시에 저장된 데이터를 무효화하는 방법
- 하드웨어는 interconnection network를 통해 프로세서 사이에 메세지를 주고받을 수 있도록 지원한다