티스토리 뷰

Study/Architecture

[Computer Architecture] SuperScalar Processor

생각많은 소심남 2013. 11. 25. 10:43

컴퓨터 구조 수업을 듣다보면 갑자기 실생활에선 잘 들어보지도 못한 MIPS Architecture를 배우다가 끝난다. 물론 요즘 나오는 Patterson 책은 ARM 버전으로 나오기 때문에 ARM 만 열심히 배우다가 학기가 끝나지 않을까 생각한다. 그런데 문득 우리가 대부분 쓰고 있는 Intel이나 AMD에서 나오는 x86 CPU는 언제 배우나 싶은 사람도 있을 듯하다. 이렇게 생활상에서 많이 접하는 CPU구조를 배우려면 고급 컴퓨터 구조 수업을 수강해야 조금더 접할 수 있지 않을까 생각한다. 뭐 아무튼 몇 개의 포스트들을 통해서 가장 기본적인 구조인 SuperScalar 구조에 대해서 조금 다뤄보려고 한다. 


 컴퓨터 구조시간에 가장 중요하게 다뤄지는 주제중에 하나가 바로 Hazard에 관한 내용이 아닐까 생각한다. 그도 그럴 것이 컴퓨터를 연구하는 사람들의 목적이 어떻게 하면 컴퓨터의 성능을 극대화시킬 수 있을까 하는 것이고, 이걸 조금더 자세히 표현하면 CPU의 기본 처리 속도, 즉 cycle당 instruction을 한번 처리하는 것을 목적으로 했다. (IPC = 1) 당연한 이야기이겠지만 한 cycle에 instruction이 한개 이상 처리되면 CPU는 그만큼 한번에 여러개의 연산을 처리할 수 있으므로 우리가 느끼는 체감 속도는 훨씬 빨라질 것이다. 그런데 이게 가능할까?

 만약 CPU의 ALU를 통해서 덧셈과 곱셈의 연산결과를 뽑으라는 instruction을 줬다고 가정했을때 앞에서 말한 IPC = 1인 환경에서는 한 cycle이 지나면 곱셈의 결과를 얻을 수 있어야 한다. 그런데 만약 곱셈의 결과가 덧셈의 결과를 바탕으로 나오는 것이라면 한 cycle이 지나기 전에 곱셈의 결과를 얻기 어려울 것이다. 왜냐하면 덧셈의 instruction을 수행하는데도 1 cycle이 소비되기 때문이다. 사실 이렇게 컴퓨터 성능 향상을 막는 요소 중 하나가 바로 instruction간의 dependence  이다. 이 부분은 다른 포스트에서도 언급했었기에 생략하려고 한다.

2013/03/18 - [About School/About Architecture] - [Study] Pipeline Hazard

이걸 극복하려면 어떻게 할까? 간단히 이야기하자면 instruction이 처리되는 path를 여러개 만들고 각각의 instruction을 해당 path를 통해서 처리하게 하면된다. 물론 지금까지 생각한 MIPS구조의 pipeline을 그대로 따라가면서 그것과 비슷한 line을 하나 더 생성하자는 것이다. 물론 완전히 똑같으면 의미가 없으니까 하나는 data만 처리할 수 있게, 다른 하나는 instruction만 처리할 수 있게 구성하면 instruction을 읽어오면서 data pipeline을 통해서 결과를 뽑을 수 있게끔 한다. 이 모든 작업을 parallel하게 처리하면 앞에서 말했던 가장 이상적인 구조인 IPC = 1인 형태를 넘어서서 성능향상을 구현할 수 있게된다. 이 구조가 바로 SuperScalar구조고, 앞에서 잠깐 언급한 path를 SuperScalar에서는 way로 표현된다. 참고로 2000년대 초창기에 나왔던 pentium celeron processor는 내가 알기로는 2-way superscalar 구조였던 걸로 기억한다. 뭐 아무튼 내부구조는 이렇게 생겼다.


사실 MIPS구조에서 pipeline을 유심히 본사람이라면 위의 구조가 매우 익숙할 것이다. 그냥 pipeline이 두개가 놓여져 있는 형태인 것이다.물론 어떤것을 처리하냐에 따라서 중간에 Memory를 거치는 여부가 달라지겠지만 중간에 pipeline register가 있고 이전 Stage에서 처리된 data가 이 register에 저장될 거라는게 느껴질 것이다. 그러면 이렇게 Path가 두개이기 때문에 당연히 이전에 다루던 구조에서 한 cycle 당 instruction 을 한개 읽어오던것에 반해 여기서는 2개를 한번에 읽게 될 것이다. 당연한 이야기이겠지만 위아래가 Asymmetric하게 배치되어 있으므로 각각 하는 역할이 다를 것이다. 참고로 위 그림에서 pipeline A가 하는 역할은 Pipeline때 내부적으로 처리해야할 Branch Prediction을 처리하는 line이고, 밑은 우리가 알고 있는 전형적인 Pipeline구조다.

 그러면 기존의 Pipeline 과 뭐가 다른 걸까? 물론 앞에서 언급한 것처럼 2 instruction을 한번에 처리할 수 있다는 것, 이때문에 Register File을 들어가는 in/out port의 수가 달라졌다. 참고로 RF로 표현된 부분은 위 그림에서는 따로 분리된 것처럼 보이지만 실제로 같은 영역이다. 즉 ReadPort 는 4개인 것이고, WritePort는 2개이다. 기존에 컴퓨터 구조시간에 배웠던 기초적인 Pipeline 구조는 ReadPort가 2개였고, writePort가 한개였었다.

 자, 그러면 instruction을 두개를 처리해야 되니까 PC의 구조도 기존에 PC만 가져와야 되는게 아니라 다음 instruction이 저장되어 있는 PC+4의 값도 읽어와야 된다. 그런데 위와 같이 되어 있는 형태에서 첫번째 instruction이 Load나 Store와 같은 Memory Access가 필요한 작업이면 어떻게 될까.당연히 첫번째 instruction이므로 IR0에 저장될 것이고, 그러면 pipeline A를 통해서 처리될 것이다. 그런데 보다시피 Pipeline A에는 Memory에 Access하는 stage가 없다. 결국 문제가 되는 것이다. 그래서 사실은 위와같이 Line A와 Line B가 명확하게 나눠진 것이 아니라, instruction별로 유동적으로 처리할 수 있게끔 ALU stage이전에 MUX를 달아둔다.


이 부분을 Instruction steering Logic이라고 한다. Steering이라는 단어자체가 의미하는 것처럼 instruction의 흐름을 움직이게끔 하는 역할을 한다. 그러면 당연히 이렇게 instruction이 어떤 Path를 써야할지를 미리 아는 과정도 필요할 것이다. 그래서 IR0와 IR1에 저장된 instruction을 decode해서 분별하는 작업을 거치게 된다. 그래서 통짜로 그리면 이렇게 된다.


간단한 2-way superscalar processor를 살펴보았다. 말이 super라는 말이 붙어있는 것이지 기존의 scalar processor의 개념을 그대로 가져오면서 pipeline을 늘린 것이다. 물론 이런 way를  여러개 만들면 더 성능이 좋아진다. 실제로 지금 intel의 하이엔드급 라인인 core i7도 4-way로 구현되어있기도 하고.. 그런데 무작정 way를 늘리면 좋은게 아니라 이제 생산할때 cost도 고려요소로도 작용하기 때문에 적정한 정도를 찾아야 한다. 아마 다음 포스트에서는 내부적으로 어떤식으로 instruction이 처리되는지를 소개할 수 있을 것 같다.


Reference:

Computer Architecture(Coursera) - https://www.coursera.org/course/comparch

댓글