[Architecture] Flynn's Taxonomy

2024. 4. 28. 18:02분산 ML

참고 자료 :

 

Summarizing Multiprocessors

 

www.edwardbosworth.com

Flynn's Taxonomy

1966년, 마이클 플린(Michael J. Flynn)이 제안한 분류법에 따르면 Computer Architecture는 다음 4가지로 나눌 수 있다. 

Flynn's Taxonomy

  • SISD : 한 processor가 하나의 memory에 저장되어 있는 한 data stream을 이용해, 한번에 하나의 명령어(instruction)를 처리.
    • ex) 가장 기본적인, 폰 노이만 구조. 옛날(Flynn 시절) 컴퓨터 아키텍처. 
    • -) 각 데이터를 처리하기 위해서 매번 명령어를 읽어야 하기 때문에 효율 $\downarrow$ => pipelining과 같이 동시 처리를 함으로써 성능을 향상시킴.
  • MISD : 각기 다른 instruction를 처리하는 processor 여러 개가 동일한 data stream을 처리하는 병렬 컴퓨팅 아키텍처. 
    • ex) 무정지 컴퓨터 (처리 오류를 발견하고 막기위해서 동일한 명령어를 중복해서 실행) 
    • 근데 보통은 MISD가 필요한 경우가 잘 없다. 같은 data stream을 서로 다른 CPU가 처리해야 할 일이 잘 없지 ...??
  • SIMD : 하나의 명령어(instruction)로 여러 개의 값(data stream)을 동시에 계산하는 방식.
    • Single Instruction : 하나의 CPU와 하나의 program counter를 가지고 있어 한 번에 하나의 명령어만 처리할 수 있다.
    • Multi Data stream : 각 연산장치(ALU)는 자체적인 범용 레지스터가 있고 공유 메모리를 일정 부분 할당 받기 때문에 각자 서로 다른 data stream이 가능하다. 
    • 보통 병렬화를 하고 싶지만 CPU 비용을 절감하고 싶을 때 쓴다. 
    • ex) Vector Computer / GPU 연산 방식. 
    • ex) 두 벡터 [1, 2, 3]과 [4, 5, 6]을 더하려면, 일반 CPU(scalar processor)에서는 덧셈 연산을 3번 반복(1+4 / 2+5 / 3+6)해야 하지만, SIMD 방식은 각 processor에 서로 다른 data(1,4 / 2,5 / 3,6)를 전달한 뒤에 동일한 명령어(+ 연산)를 주어 병렬 연산이 가능하다. 
  • MIMD : 여러 개의 processor가 각각 서로 다른 data stream을 받아서 서로 다른 명령어를 처리. 
    • ex) Parallel Computing. 요즘(2013~) multi-core processor. 
    • ex) distributed memory MIMD machines : 각 processor가 자기만의 독립적인 memory를 가지는 경우. 따라서 각 processor는 다른 processor의 memory에 뭐가 들었는지 잘 모른다. data를 공유하고 싶으면 서로 다른 processor들 간 message passing이 필요하다.

위 그림을 좀 더 현실적으로 적어보자면,

  • Instruction pool / Data pool : pool 그 자체는 그냥 memory로 볼 수 있다. 다만 memory 내부에 instruction이 저장된 section과 data가 저장된 section이 나누어져 있겠다. 
  • Instruction pool에서 나오는 가지 수 : control unit의 수라고 볼 수 있다. program counter(PC)가 instruction의 주소를 가리키면, 그 주소에 있던 명령어를 instruction register(IR)가 저장하고 있다가 제 때 Control unit에 전달해준다. 즉, control unit + program counter + instruction register가 한 묶음인데, 이 묶음의 수라고 볼 수 있다. 
  • Data pool에서 나오는 가지 수 : register set 수를 의미하겠다. multi-core CPU의 경우 각 core 별로 register set이 존재한다. 
  • PU(Processing Unit) : 말하자면 CPU, 또는 multi-core의 경우 한 core를 의미한다. 

 

Von Neumann Architecture

존 모클리(John William Mauchly), 프레스퍼 에커트(John Presper Eckert), 폰 노이만(Von Neumann)은 1945년에 First Draft of a Report on the EDVAC에서 컴퓨터 구조를 설계했다. 

이는 현재의 CPU, memory, program 구조를 갖는 범용 컴퓨터 구조를 최초로 확립했다는 점에서 높이 평가 받는다. 

Flynn's Taxonomy에 따라 분류하면, 이는 가장 기본적인 구조, SISD이다. 

폰 노이만 컴퓨터 구조

  • Central Processing Unit (CPU)
    • Control Unit : instruction register, program counter 포함.
    • Arithmetic/Logic Unit (ALU) : 산술 논리 장치와 processor register 포함.
  • Memory Unit : data와 instruction 저장.
  • 외부 대용량 storage
  • 입출력 매커니즘 

Multi-core CPU Architecture

MIMD 구조. 

각 Core에는 CPU, registers, L1(또는 L2까지도) cache가 존재하여 process나 thread의 병렬처리(context switch를 통한 multi-tasking 말고 multi-processing)가 가능하다. 

multi-core 구조
cache 관점을 자세히 그린 multi-core 구조

GRGPU Architecture

참고자료 :

원래 GPU(Graphics Processor Unit)는 graphics에 심하게 의존하는 application(ex. Game, 3D modeling, ...)을 돌릴 때 사용되었는데, 요즘 나오는 GRGPU (General Purpose GPU)는 CPU의 computational workload를 병렬 처리해서 가속화시키는 용도로 많이 쓰인다(특히 벡터 연산이 많은 일들. ex. machine learning). 

 

CPU는 각  core가 process의 순차적인 직렬 처리를 효율적으로 하기 위해 (low latency) 만들어졌다면, 

GPU는 벡터 연산을 병렬적으로 수월하게 하기 위해 (high throughput) SIMD 구조를 극대화시켰다고 볼 수 있겠다.

(그리고 그 SIMD 구조를 또 병렬화해서 사실상 MIMD 구조임.)

 

CPU가 보통 8개 내의 core (Apple M2 칩: 8 core)를 갖는다면, 

GPU는 보통 수백~수천 개의 core를 가진다. 

단, GPU의 각 core는 더 작은 용량의 cache, 작은 instruction set (ISA), 낮은 clock rate을 가진다. 

초록색 네모 = core (=processing unit)

 

GPU 내부에는 여러 processor clusters가 있고, 각 processor cluster 안에는 또 여러 개의 streaming multiprocessors(SM)가 있다. 

예를 들어 NVIDIA의 Tesla V100은 80개의 streaming multiprocessor을 가지고 있고, 각 SM 안에는 64개의 core가 있다 (=> 총 5120개 cores!)

하나의 task는 core 하나에 수행되지 않고 보통 processor cluster 단위나 SM 단위로 수행된다. 

즉, SM 하나가 SIMD 구조인거고, 전체 GPU는 MIMD 구조인 셈. 

 

NVIDIA의 GPU core는 기능에 따라 여러 종류가 있는데, 

  1. CUDA cores : fp32 연산 수행 (느리지만 정확한 연산)
  2. Tensor cores : mixed precision 연산 수행 (CUDA cores보다 4배 이상 빠름. AI 연산용)
    • Matrix Multiply-Accumulate 연산 : 4x4 fp16 matrices A x B + 4x4 fp32 matrix C
    • NVIDIA Volta Architecture에서 최초 적용됨. (ex. Titan V: CUDA cores 5120개 + Tensor cores 640개)
  3. Ray-Tracing cores
  4. Shader Cores

 

SPMD

SPMD(Single Program, Multiple Data)는 SIMD와 MIMD의 중간 단계(?)라고 볼 수 있겠다. 

SIMD는 한번에 하나의 연산만 (물론 여러 데이터에 대해) 처리할 수 있지만, SPMD는 한번에 여러 연산을 처리할 수 있다.

MIMD는 한번에 여러 program을 동시에 처리할 수 있는 좀더 general한 개념이라면, SPMD는 한번에 하나의 program만 병렬처리할 수 있다. 

Flynn's Taxonomy에 따르면 SPMD도 MIMD로 분류할 수 있겠다. 

ex) CUDA machines (ex. NVIDIA GeForce 8800)

SIMD <-> SPMD

예를 들어, 4개의 processor를 가지고 4개의 값 (1, –3, 2, –4)에 대해 아래와 같은 if 문을 처리하고 싶을 때,

if (x > 0) y = y + 2 ;
else y = y – 3;

SIMD는 한 번에 하나의 명령문만 가능하니까 아래와 같이 두 번에 쪼개서 계산해야 한다.

SIMD 방식

반면 SPMD는 각 processor가 서로 다른 명령어 처리가 가능해서 한 번에 계산이 가능하다. 

SPMD / MIMD 방식

 

if/else 문이나 switch/case 문에서는 SPMD가 SIMD보다 빠르지만, for loop이나 while loop에서는 같은 연산을 반복처리하는 거라 SIMD나 SPMD나 똑같다. 

'분산 ML' 카테고리의 다른 글

DeepSpeed 문제 분석  (0) 2024.05.16
Collective Communication  (0) 2024.04.28
DeepSpeed 소스 코드 분석  (0) 2024.04.24