원점에서 새로 설계하는 ZEN
AMD는 차세대 CPU 마이크로 아키텍처 ZEN"에서 IPC (Instruction-per-Clock)를 크게 향상시키고 소비 전력을 억제합니다. 사실 ZEN의 마이크로 아키텍처는 높은 IPC와 낮은 전력 사용량을 달성할 요소를 갖고 있습니다. 물론 그 원인은 정수 파이프라인을 분할한 기존의 AMD 퍼포먼스급 CPU 방식을 버리고, 표준적인 싱글스레드 성능 위주로 돌아갔다는 것입니다. 하지만 그 이상으로 이미 입증된 성능/전력 향상 기술을 도입한 점도 큽니다.
AMD는 ZEN에서 성능과 전력 효율이 모두 극적으로 향상됐다고 설명합니다.
ZEN 아키텍처의 개선 포인트
ZEN 마이크로 아키텍처는 인텔도 도입한 내부 명령(마이크로 OPs : Micro-OPs) 캐시인 OP 캐시 등, 고성능과 저전력에 큰 효과가 있는 기술을 도입했습니다. 또한 인텔과 마찬가지로 SMT(Simultaneous Multithreading)도 도입합니다. 이렇게 보면 AMD CPU가 인텔 아키텍처에서 성공의 요소를 도입한 것으로 보입니다.
그러나 ZEN은 이런 기술을 원점에서부터 새로 구현한 아키텍처란 장점이 있습니다. ZEN은 전체적으로 깔끔하게 정리된 마이크로 아키텍쳐입니다. 이렇게 새로 설계하면 설계에 위험은 있으나 성능 향상은 큽니다.
물론 기존의 것을 유지하는 부분도 있습니다. 부동 소수점 연산 유닛을 보조 프로세서로 스케줄러 레벨에서 분리한다는 점이나, 빅 시스템 캐시의 채용 등 AMD의 기존 설계 사상이 계승됩니다. x86 명령을 복합형의 내부 명령(마이크로 OPs : Micro-OPs)에 일단 변환한 후 개별 작업 단위의 세밀한 마이크로 OP로 변환하는 점도 기존의 AMD 아키텍처와 닮았습니다. 그러나 세부 사항을 보면 새로 설계하면서 새로운 기술에 최적화한 부분이 보입니다.
AMD ZEN 마이크로 아키텍처의 블럭 다이어그램
기존 설계의 계승이 강한 인텔 CPU 마이크로 아키텍처
이는 인텔 아키텍처 개발과는 큰 차이가 납니다. 인텔의 고성능 CPU 마이크로 아키텍처는 Core Microarchitecture (Merom 메롬) 아키텍처를 보충한 것으로, 한번도 새로 설계한 적이 없습니다. 원래 메롬 자체가 펜티엄 3 아키텍처의 확장입니다. 따라서 지금의 인텔 CPU 코어의 구조는 매우 복잡합니다.
인텔은 설계 사상에 대해 네할렘(Nehalem)에서 설명을 했었습니다. 2010년에 미국 스탠포드 대학의 공개 강의 EE380에서 당시 인텔의 메인 아키텍트였던 Glenn J. Hinton은 설계 기간과 위험이 늘어나는 걸 피하기 위해 기존 설계에 의존하기로 했다고 설명했습니다. 완전히 새로 설계하면 10~20%의 단일 스레드 향상 효과를 볼 수 있으나, 그보다 설계 기간을 줄이고 튜닝하는 방법을 선택했다고 합니다. 그리고 인텔은 네할렘 이후에도 그 방법을 유지했습니다.
네할렘부터 단계적으로 확장을 계속한 인텔 마이크로 아키텍처
반면 AMD는 6~7년마다 한번씩 마이크로 아키텍처를 새로 만들어 원점부터 다시 개발하는 스타일입니다. 아래 그림은 AMD 마이크로 아키텍처의 변화를 나타낸 것으로 오른쪽에서 두번째가 2003년의 K8, 가운데가 2011년의 불도저, 왼쪽에서 두번째가 불도저를 개량한 스팀롤러, 왼쪽이 이번에 나오는 ZEN입니다. 오른쪽은 다른 개발 팀이 설계한 저전력 코어 밥캣(Bobcat)입니다. 이렇게 보면 각각의 세대마다 상당히 성격이 다른 마이크로 아키텍처가 나오는 것을 알 수 있습니다.
AMD CPU 마이크로 아키텍처의 변화
사실 K8의 기반은 K7 마이크로 아키텍처의 계승입니다. 또 K8 이후에 새로 설계한 K9가 있었지만 취소했습니다. 따라서 6~7년 주기의 구조 개편이라 말할 순 없어도 인텔과 비교하면 꽤 자주 설계를 새로 한다고 볼 수 있습니다.
두 회사의 설계 방식에는 장점과 단점이 있습니다. AMD의 원점 설계 방식은 설계에 노력이 필요하며 새로운 문제와 무자할 위험이 큽니다. 따라서 개발과 수정에 쫓기며 튜닝에 시간을 투자하지 못하거나, 출시되도 예상대로 성능을 내지 못할 위험이 있습니다. 반면 새로 설계한 아키텍처니 대담한 방법으로 성능을 높이기 쉽습니다.
이에 비해 인텔의 방식은 기존 아키텍처를 수정해나가는 형태니 과감하기 변화하기가 어렵습니다. 인텔이 한때 지적한대로 원점에서 설계하면서 얻게 되는 10~20%의 성능 향상을 포기해야 합니다. 그러나 기존 설계를 확장하니 위험이 낮고 소프트웨어 최적화도 바꿀 게 적습니다. x86 계열 CPU에서 중요하게 여기는 디자인 튜닝에 걸리는 시간도 많이 투자할 수 있습니다.
이렇게 보면 ZEN이 얼마나 큰 도전인지를 알 수 있습니다. 새로 CPU를 설계하면서 아키텍처에서 기대되는 대로의 성능을 발휘할 수 있을지 의문도 듭니다. 또한 아키텍처의 선택이 옳았는지도 중요합니다. 실제로 불도저 마이크로 아키텍처는 이 두가지가 모두 빗나갔습니다.
불도저는 싱글 스레드 성능보다 다이 면적당 스레드 실행 성능을 추구한 결과, 최종 사용자가 요구하는 성능에 영향을 주는 싱글 스레드에서 인텔에게 크게 뒤졌습니다. 싱글 스레드 성능을 요구하는 시장 자체는 계속되고 있음을 간과한 것입니다. 또 첫 세대는 튜닝도 충분하지 않았습니다. 그러나 이번 ZEN에서 AMD는 그러한 점을 반성하고 시장 요구에 맞춰 개발하고 있습니다. 성능 튜닝이 얼마나 충분할지는 시장에 나오기 전까지는 알 수 없으나, 이번에 AMD는 위험을 피하고 도입이 쉬운 방법을 최대한 쓸 것으로 보입니다. 앞서 말한대로 OP 캐시는 인텔의 방법과 비슷해 보입니다.
ZEN 마이크로 아키텍처의 우수성
AMD ZEN에서 크게 달라진 파이프라인은 명령어 인출부터 디코드 디스페치까지의 프론트 엔드 부분입니다. 분기 예측은 신경망 기반의 분기 예측 로직을 채용, 명령 디코더는 4 명령 디코드에서 디코딩된 내부 명령 마이크로 오퍼레이션 (마이크로 OP : Micro-OP)를 캐시하는 OP 캐시를 추가했습니다. 높은 정밀도로 명령 스트림 분기를 예측해 디코딩된 마이크로 OP를 캐시하고 재사용합니다. 분기 실수의 손실을 줄이고 명령 디코드를 생략하여 성능을 끌어올림과 동시에 소비 전력을 줄입니다.
ZEN 프론트 엔드
프론트 엔드를 더 자세히 보면 변화를 확실하게 알 수 있습니다. AMD의 기존 아키텍처와 비교하면 불도저 아키텍처의 명령 디코드는 4 명령 디코드지만, 2 스레드 파이프라인이 공유합니다. 불도저를 개량한 스팀롤러에서 명령 디코드는 2배 확장됐지만 실행 파이프가 좁고 페치도 제한돼 효과에도 한계가 있었습니다. 아래 그림에서도 알 수 있듯이 명령 디코더의 균형이 무너졌습니다. ZEN에서는 4 명령 디코드에서 4 정수 연산 또는 4 부동 소수점 명령 실행의 균형잡힌 아키텍처가 됐습니다. K10 세대까지 AMD는 3 명령 디코딩이었습니다.
그에 비해 인텔은 스카이레이크 이후 5 명령 디코드(명령 퓨전을 포함하면 6 명령)입니다. 그러나 x86 / x64 명령 세트의 경우는 운이 좋으면 3명령 이상을 병렬 수행하나, 같은 레벨에서 최대 5명령을 실제 병렬 처리하는 기회는 그리 많지 않습니다. 즉 인텔이 명령 디코딩 대역은 25% 이상 넓으나 이를 통해 단순히 IPC (Instruction-per-Clock)가 25% 높아지진 않습니다.
ZEN의 프론트 엔드에서 눈에 띄는 건 OP 캐시의 존재입니다. OP 캐시는 x86 / x64 계열 CPU 특유의 약점을 극복 할 수 있는 매우 효과적인 기법입니다. 기존에는 인텔 CPU만 갖고 있었던 마이크로 OP 캐시를 AMD CPU도 갖추게 됩니다.
인텔과 AMD의 마이크로 아키텍처 비교
ZEN의 전체 아키텍처
x86 / x64의 가장 큰 약점은 명령 디코드
x86 / x64 명령은 명령 디코드가 설계의 가장 큰 장애물이었습니다. 그건 x86 / x64가 CISC (Complex Instruction Set Computer) 형 명령에서 더 오래된 명령 확장이 더해져 매우 복잡한 명령 세트 아키텍처 (ISA : Instruction Set Architecture)가 됐기 때문입니다. x86 / x64 명령은 원래 가변 길이 명령어로, 명령 앞에 붙이는 접두사가 늘어나면서 명령 길이가 복잡해졌습니다.
복잡하기 그지없는 x86 / x64 계열 명령 포맷
따라서 x86 / x64 명령은 명령을 구분하기가 매우 어렵습니다. 명령 길이가 정해진 RISC (Reduced Instruction Set Computer) 계열 CPU는 32비트마다 명령이 달라지니 이를 구분하기가 쉽습니다. 그러나 x86 / x64는 명령 길이의 변화가 너무 많기에 쉽게 명령을 분리할 수가 없습니다. 따라서 x86 / x64 명령의 CPU는 명령 디코드 로직이 복잡해지고 디코딩 단에서의 전력 소비가 커져 디코딩 대기 시간이 길어집니다.
명령 디코드는 x86 / x64 명령의 가장 큰 약점입니다. 즉 x86 / x64 계열 CPU에서 명령을 병렬로 실행시키는 것보다 병렬로 실행하는 명령을 해독하는 것이 어렵습니다. 그래서 x86 / x64 계열 CPU는 명령 디코드의 부담을 줄이는 연구가 중요합니다. 가장 바람직한 건 명령 디코드 자체를 하지 않도록 만드는 것입니다.
원래 고성능 x86 / x64 CPU는 x86 / x64 명령을 일단 내부 명령 마이크로 OP로 분해합니다. 마이크로 OP는 가변 길이 명령어 형식이 복잡한 x86 / x64 명령과는 달리 일반적으로 길이가 정해진 고정 포맷입니있다. RISC와 마찬가지로 취급이 간단하고 쉽게 실행할 수 있습니다. 그렇다면 이 마이크로 OP를 캐시하면 좋을 거란 발상이 당연히 나오게 됩니다.
그래서 x86 / x64 명령을 디코딩한 마이크로 OP를 저장하는 캐시와 루프 버퍼의 구현이 이루어졌습니다. 마이크로 OP를 재사용하면 복잡하고 대기 시간이 길고 전력 소모가 많은 x86 / x64 명령 디코드를 생략할 수 있습니다. 성능도 오르고 전력도 줄어듭니다. 그러나 AMD는 이러한 기능을 갖추지 않았습니다. ZEN은 이 부분을 개선해 명령 디코딩의 전력과 성능 개선에 주력했습니다.
마이크로 OP 캐시의 장점