SISD / SIMD / MISD / MIMD
Flinn(플린)의 컴퓨터 분류로 보았을 때 컴퓨터는 크게 4가지로 나뉜다.
* SISD(Single Instruction Single Data stream)
하나의 명령어가 하나의 데이터를 처리한다.
* SIMD(Single Instruction Multi Data stream)
하나의 명령어로 여러 개의 데이터를 처리한다. 예시에도 나오지만 배열이 존재할 때 주로 사용된다.
예시)
for(i=1; i<=20; i++) { a[i] = b[i] + c[i] // a,b,c는 배열 }
이렇게 하나의 반복문으로 20개의 데이터(상대주소 1부터 20까지)를 처리하는 경우를 SIMD라고 한다.
* MISD(Multi Instruction Single Data stream)
여러 개의 명령어로 하나의 데이터를 처리하는 방식이다. 교수님께서 이론적으로 존재는 하지만 거의 쓰지 않는다고 하셨다. 예시를 들어주시긴 하셨는데 내가 제대로 이해했는지는 모르겠다.
예시)
MOV A, B // B의 내용을 A로 옮김. MOV 연산이 하나의 명령
MOV ADD A, B // 두 개의 연산자로 A, B를 연산하는 방식. 이게 MISD의 예시.
* MIMD(Multi Instruction Multi Data stream)
'한 번'에 여러 개의 명령어로 여러 개의 데이터를 처리하는 방식이다. 여기서 말하는 '한 번'은 CPU의 실행 단위인 '한 클럭'을 의미한다. 슈퍼스칼라 구조(한 클럭에 두 개의 명령어를 실행)가 MIMD에 해당된다.
예시) <나무위키의 설명을 참고했습니다>
SIMD)
(10, 10, 10, 10) → (2, -4, 5, 3) → (4, 7, 2, 9)
첫번째 데이터 스트림 + 두번째 데이터 스트림 - 세번째 데이터 스트림 = (12, 6, 15, 13) → (8, -1, 13, 4)
즉, 여러 데이터에 대해 모두 동일한 연산만을 적용할 수 있다.
MIMD)
(10, 10, 10, 10) → (2, -4, 5, 3) → (4, 7, 2, 9)
(+, -, *, %) → (-, +, %, *) 적용 = (12, 14, 50, 1) → (8, 13, 0, 9)
MIMD를 활용하면 병렬로 적용할 수 있는 연산을 모두 다르게 줄 수 있는 것이다.