[목차] == 개요 == {{{+2 Superscalar}}}[* 영어 발음을 살려 [[슈퍼스케일러]]라고도 한다.] 일반적 [[파이프라인]] 기법의 확장을 통해 [[CPU]]의 속도를 향상시키기 위한 컴퓨터 구조 설계 방식을 지칭한다. == 상세 == === 구현 방식 === 가장 기본적인 파이프라인은 각 명령어를 처리 단계별로 작게 쪼갠 뒤 순차적 (in-order) 으로 처리하는 방식이다. 이때 명령어들 중에서 소수점 연산 명령어 혹은 메모리 읽기/쓰기 명령어 등 상대적으로 많은 클락 사이클을 필요로 하는 명령들이 있는데, 뒤따르는 간단한 명령들이 이런 긴 명령들의 결과에 종속성이 없어서 실제로는 먼저 처리될 수 있는 경우에도 순차적 방식에서는 해저드 방지를 위해 무조건 앞의 명령어의 결과가 확정될 때까지 기다려야 하기 때문에 처리 속도에서 손해를 보게 된다. 이를 개선하기 위해서 [[비순차적 실행|비순차적 (Out-Of-Order)]] 파이프라인 방식이 고안되었는데, 핵심은 재배열 버퍼 (Reorder Buffer) 라는 것을 도입, 여러 명령어들을 버퍼 안에 배열해 두고 종속성이 없어진 명령어들이면 순차와 관계 없이 바로바로 한꺼번에 처리될 수 있도록 하는 것이다. 그런데 이때 분기 명령어 (Branch Instruction) 의 결과 예측에 실패하는 경우 (Branch Prediction Failure) 재배열 버퍼에서 진행되고 있던 내용을 제거하고 새로 명령어를 읽어와야(인출) 하는데 (Instruction Fetch), 이때 명령어를 하나씩 읽어오는 기존 방식을 그대로 사용하면 충분히 빠르게 버퍼를 다시 채울 수 없어서 [[병목 현상]]이 심해진다. 이 회복 병목 문제를 해결하기 위해 여러 명령어를 한꺼번에 읽어오는 방식을 적용한 컴퓨터 구조를 슈퍼스칼라 구조라고 한다. 슈퍼스칼라의 규모는 학계에서는 주로 '방향(N-way)'으로 표현하지만, 업계에서는 보통 '폭(N-wide)'이나 '발행(N-issue)'으로 더 많이 표현하는 편이다. === 제약 조건 === 명령어 레벨 병렬화(Instruction-level Parallelism, ILP)를 위해서는 앞서 말했듯 명령어간의 종속성이 없어야 하고, 종속성을 최소화시키기 위한 복잡한 명령어 스케줄링이 필요하다. 이에 반해 서로 다른 스레드 안의 명령어는 기본적으로 종속성이 없거나 매우 적을 것이다. 이를 이용해서 하나의 코어 파이프라인에 여러 스레드에 포함된 명령어를 섞어서 집어넣으면 스케줄링의 복잡성을 억제하면서도 효율적인 파이프라인 활용이 가능해진다. === [[SMT]]와의 차이점 === 넓은 범위로는 [[SMT|동시 멀티스레딩(Simultaneous Multi-Threading)]], 좁은 범위로는 코어당 양방향(2-way) SMT의 최초 구현 기술인 인텔의 [[하이퍼스레딩]]과 비슷해 보이지만, 동시 멀티스레딩은 말 그대로 하나의 프로세스(메모리에 상주된 실행 중인 프로그램) 내에서 수행하는 스레드 레벨에서의 병렬화(Thread Level Parallelism, TLP)를 추구하는 것으로, 슈퍼스칼라는 ILP를 추구하는 기법이므로, 둘 다 병렬화를 통해 프로세서 자원을 최대한 알뜰하게 활용하려는 기본 취지는 같을지라도 서로 관점이 다르다. 현대의 CPU는 TLP와 ILP가 융합된 형태의 구조를 어플리케이션에 맞게 동시에, 혹은 취사적으로 추구하는 방식으로 설계되고 있다. === 역사 === 1966년 컨트롤 데이터 코퍼레이션사의 [[CDC]] 6600과 [[IBM]]의 System/360 Model 91라는 [[메인프레임]]을 슈퍼스칼라 프로세서의 시초로 보고 있다. 메인프레임이 아닌 상용 싱글 칩 프로세서 중에서는 1988년 [[모토로라]]의 MC88100, 1990년 [[AMD]]의 29050 프로세서부터 각각 도입되었는데 모두 [[RISC]] CPU라는 점. 인텔의 경우는 1989년 9월에 출시된 80960CA부터 도입되었으나 주력 아키텍처인 x86 계열이 아닌 RISC 계열이었고, [[CISC]] 방식의 [[x86]] CPU 중에서도 최초는 일반인들에게도 유명한 [[펜티엄]]이다. 당시에는 슈퍼스칼라 뿐만 아니라 '듀얼 파이프라인'이라는 이름으로도 널리 알려졌다. 아래는 주요 CPU 마이크로아키텍처의 규모이다. 디코드 칸의 괄호는 사이클당 생성 가능한 최대 마이크로옵의 수를 의미한다. ||<-7> 인텔의 마이크로아키텍처별 슈퍼스칼라 규모 || || 연도 || 마이크로아키텍처 || 디코드 || μOp 캐시 || 할당 || 실행 || 비고 || || 1971 || [[인텔 4004|4004]] || 1 || - || 1 || 1 || || || 1972 || [[인텔 8008|8008]] || 1 || - || 1 || 1 || || || 1974 || [[인텔 8080|8080]][br][[인텔 4040|4040]] || 1 || - || 1 || 1 || || || 1976 || [[인텔 8085|8085]] || 1 || - || 1 || 1 || || || 1978 || [[인텔 8086|8086]] || 1 || - || 1 || 1 || || || 1982 || [[인텔 80286|80286]] || 1 || - || 1 || 1 || || || 1985 || [[인텔 80386|80386]] || 1 || - || 1 || 1 || || || 1989 || [[인텔 80486|80486]] || 1 || - || 1 || 1 || || || 1993 || [[인텔 P5 마이크로아키텍처|P5]] || 2 || - || 2 || 2 || || || 1995 || [[인텔 P6 마이크로아키텍처|P6]] || 3(6) || - || 3 || 5 || || || 2000 || [[인텔 넷버스트 마이크로아키텍처|넷버스트]] || 1(4) || 3 || 3 || 4 || || || 2003 || [[인텔 P6 마이크로아키텍처|P6 개량판]] || 3(6) || - || 3 || 5 || || || 2006 || [[인텔 코어 마이크로아키텍처|코어]] || 4(4) || - || 4 || 5 || || || 2008 || [[인텔 네할렘 마이크로아키텍처|네할렘]] || 4(4) || - || 4 || 6 || || || 2011 || [[인텔 샌디브릿지 마이크로아키텍처|샌디 브릿지]] || 4(4) || 4 || 4 || 6 || || || 2013 || [[인텔 하스웰 마이크로아키텍처|하스웰]] || 4(4) || 4 || 4 || 8 || || || 2015 || [[인텔 스카이레이크 마이크로아키텍처|스카이레이크]] || 4(5)[* 5개로 잘못 알려져 있으나, 디코더에서 생성할 수 있는 uOp의 최대 개수가 4→5개로 증가한 것이지 디코더의 수가 늘어난 것은 아니다. [[https://twitter.com/trav_downs/status/1344585345053069315|#]]] || 6 || 4 || 8 || || || 2019 || [[서니 코브|서니 코브]] || 4(5) || 6 || 5 || 10 || || || 2021 || [[골든 코브|골든 코브]] || 6(6) || 8 || 6 || 12 || || ||<-7> AMD의 마이크로아키텍처별 슈퍼스칼라 규모 || || 연도 || 마이크로아키텍처 || 디코드 || μOp 캐시 || 할당 || 실행 || 비고 || || 1996 || [[AMD K5 시리즈|K5]] || 4(4) || - || 4 || 4 || || || 1997 || [[AMD K6 시리즈|K6]] || 2(4) || - || 4 || 6 || || || 1999 || [[AMD K7 마이크로아키텍처|K7]] || 3(6) || - || 3 || 9 || || || 2003 || [[AMD K8 마이크로아키텍처|K8]] || 3(6) || - || 3 || 9 || || || 2007 || [[AMD K10 마이크로아키텍처|K10]] || 3(6) || - || 3 || 9 || || || 2011 || [[AMD 불도저 마이크로아키텍처|불도저]] || 4 || - || 4 || 4+4(2) || || || 2014 || [[AMD 스팀롤러 마이크로아키텍처|스팀롤러]] || 4 || - || 4 || 4+3 || || || 2017 || [[AMD ZEN 마이크로아키텍처|Zen 1]] || 4 || 8 || 5 || 10 || || || 2019 || [[AMD ZEN 2 마이크로아키텍처|Zen 2]] || 4 || 8 || 5 || 11 || || || 2020 || [[AMD ZEN 3 마이크로아키텍처|Zen 3]] || 4 || 8 || 6 || 14 || || || 2022 || [[AMD ZEN 4 마이크로아키텍처|Zen 4]] || 4 || 9 || 6 || 14 || || === 한계 === 다만 비순차적 파이프라인 + 슈퍼스칼라를 활용한 구조라고 해도 명령어 패턴이나 [[분기 예측]] 방식에 따라 속도가 개선되는 정도에 차이가 있을 수 있다. 예외 처리나 해저드 방지를 위해 필요한 추가적인 하드웨어와 복잡성 (면적 및 소비 전력 면에서의 손해) 에 비해 일반적으로 성능 개선 폭에 한계가 지적되어 최근에는 이보다는 단순한 순차 코어를 쓰는 대신 코어 여러개를 사용하여 성능 개선을 추구하는 멀티코어 처리가 조금 더 각광을 받는 추세다. 다만 멀티코어를 제대로 활용하기 위한 병렬 프로그래밍의 어려움, 메모리 동시성 문제 등의 이유로 그 역시 한계는 있다. 명령어 자체를 여러개씩 묶어서 처리하고 이렇게 묶을 때 아예 스케줄링을 해서 보내는 방식인 [[VLIW]] (very long instruction word) 를 통해 하드웨어 오버헤드를 소프트웨어로 옮기려는 시도 또한 있었으나 ([[인텔]] [[아이테니엄]] 제품군) 그에 필요한 컴파일러 설계의 어려움으로 일반목적 프로세서 분야에서는 거의 사장된 상태이다. == 관련 문서 == * [[CPU/구조와 원리]] * [[파이프라인]] * [[비순차적 실행]] * [[분기 예측]] * [[SMT]] * [[멀티코어 프로세서]] [[분류:컴퓨터 시스템 및 구조]] [[분류:중앙처리장치]]