전공/시스템프로그래밍

SISD / SIMD / MISD / MIMD

일로온 2020. 6. 8. 02:32

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를 활용하면 병렬로 적용할 수 있는 연산을 모두 다르게 줄 수 있는 것이다.