본문 바로가기

Lecture & Column/cpu_lec_col

하스웰의 모든 것 : 아키텍처편

Author : Daeguen Lee

(Any action violating either CCL policy or copyright laws is strictly prohibited)

 

 

 

 

오랜만에 새 글을 올립니다. 이 블로그의 시작이 된 글이기도 하고, 엄청난 손가락노동을 기꺼이 감수한 한 독자분 덕분에 국방망(군용 인트라넷) 내에까지 전파되어 여러 군인 독자들과 저를 연결해 준 글이기도 하며 (그러나 정작 제가 복무중이던 동안엔 한번도 본 적이 없었습니다-_-), 개인적으로도 가장 애착이 가는 시리즈인 '현대 CPU의 구조' 를 만 4년만에 처음으로 이어 쓰게 되었습니다. 괜히 감개무량하고 막 그러네요.ㅎㅎ

 

이 글 자체는 '현대 CPU의 구조 : 2014 증보판' 격인 동시에 제가 지금 구상해두고 있는 'All About Haswell' 시리즈의 첫 편이기도 합니다. 사실, 하스웰 아키텍처와 모든 -데스크탑, 워크스테이션, 서버까지 말 그대로 "모든"- 하스웰 기반 SKU를 다각적으로 분석해 보는 글을 기획하다 아키텍처 설명 파트를 '현대 CPU의 구조' 의 스핀오프로 뽑아 보면 어떨까 하는 생각에, 충동적으로 써 내려가기 시작한 것이죠. 아무쪼록 많은 분들께 부담 없이 읽히길 바라며, 제가 이 주제들을 구상하며 느꼈던 재미를 여러분도 글을 읽어 가며 함께 공유할 수 있기를 희망합니다. 그럼 서론은 이쯤 하고... 본론으로 들어가 보겠습니다.

 

사실 4년 전 처음 '현대 CPU의 구조' 를 집필할 당시 만들어 두었던 ppt 원본이 유실되어, 처음부터 그림을 새로 그려야 했습니다. 예전에 한번 만들었던 그림을 다시 만들려니, 뭔가 너무 달라져서는 안 될 것 같으면서도 이전보다 못한 그림이 되어서는 안 될 것 같은 복잡한 기분이 들어 별 것 아닌 그림을 만들면서도 꽤 오래 고민을 했었더랬죠. 아무튼 이제부터 보실 그림은 그 고뇌의 산물입니다.

 

자... 다들 이 그림, 익숙하시죠?

 

 

현존하는 거의 모든 CPU는 위와 같은 흐름을 거쳐 정보를 처리합니다. 메모리로부터 하위 계층 / 상위 계층 캐시를 거쳐 CPU에 당도한 명령어와 데이터는 각각 일련의 과정을 거쳐 연산유닛에서 연산되어 다시 메모리로 돌아가는 과정을 거치는데, 복잡한 x86 명령어를 CPU 내부에서 처리할 수 있는 작은 단위 (마이크로옵) 로 분절하는 데에 상당한 시간과 자원(=전력)이 소모됩니다. 물론 연산유닛 자체가 수행해야 하는 연산도 성능에 큰 영향을 주며, 그에 수반되는 소비전력 역시 무시할 수 없는 수준입니다. 결국 프로세서의 성능을 결정짓는 "결정적인" 단계를 둘로 압축하자면 아래와 같겠습니다.

 

1. 디코드

2. 연산

 

앞으로 살펴볼 프론트엔드/백엔드 구조 또한, 디코드와 연산 자체 및 전후의 작동 메커니즘을 바탕으로 살펴보게 될 것입니다. 오늘 이 글을 통해 살펴볼 대상은 인텔이 "코어" 라는 이름을 도입한 코어 마이크로아키텍처부터 하스웰까지의 5 세대입니다. (코어 이전을 넣자니 넷버스트 전후의 아키텍처적 연관성이 전혀 없어 글의 개연성이 해쳐지는 관계로 넣지 않았습니다.)

 

 

제일 먼저 살펴볼 그림은 코어 마이크로아키텍처의 프론트엔드 부분입니다. 사실 이 그림 자체가 오늘 설명할 내용의 기본형이 되는지라 여기서는 길게 드릴 말이 없고, 다만 코어 아키텍처 자체의 특징에 대해 기술하자면 다음의 몇 가지를 꼽을 수 있겠습니다 : 루프 탐지기의 도입, 매크토롭 퓨전, 마이크로옵 퓨전의 도입이 그것입니다.

 

우선 마이크로옵 퓨전은 과거의 디코드 메커니즘상 2개 이상의 마이크로옵으로 환산되던 x86 명령어를 1개의 '마이크로옵 덩어리'로 바꿀 수 있게 된 것입니다. 인텔의 디코더 운용 정책상 2개 이상의 마이크로옵이 될 x86 명령어는 복합 디코더에서만 처리할 수 있는데, 해당 x86 명령어가 지속적으로 공급될 경우 4개의 디코더 중 3개가 유휴 상태에 빠지는 비효율을 초래하게 됩니다. 마이크로옵 퓨전은 이를 해결하기 위한 것으로, 기존까지의 아키텍처에 비해 디코더가 '놀고 있는' 빈도를 성공적으로 줄였으며 결과적으로 클럭당 x86 명령어가 유입되는 수량을 증가시키는 데 일조하게 됩니다.

 

내친 김에, 클럭당 유입되는 x86 명령어의 수를 더욱 극대화하기 위해 도입된 것이 매크로옵 퓨전입니다. 마이크로옵 퓨전이 x86 명령어 분절화의 결과물로 생겨난 작은 단위를 하나로 묶어 취급하는 것인 데 비해, 매크로옵 퓨전은 복수의 x86 명령어 자체를 하나로 묶어 디코더로 보내 주는 기능으로 이로써 코어의 프론트엔드는 명목상으로는 4개의 x86 명령어를 받아들일 수 있는 반면 실질적으로는 클럭당 최대 5개씩의 x86 명령어를 받을 수 있게 되었습니다.

 

한편, 특정 명령어가 반복적으로 수행되는 루프에 진입할 경우를 대비에 코어 아키텍처는 이전까지 없던 새로운 하드웨어를 신설했는데, 이것이 바로 루프 탐지기입니다. 기존대로라면 묵묵히 L1 캐시로부터 새로 명령어를 받아 프론트엔드에 공급해야 했던 것을, 루프 탐지기는 미리 18개까지의 x86 명령어를 저장해 두었다가 루프를 감지하는 즉시 L1 캐시 접근 없이 명령어를 디코더로 전송합니다. 비록 L1 캐시가 CPU와 최단거리에 위치하고 속도 역시 빠른 편이긴 하나, 루프 탐지기로 인해 줄어든 레이턴시는 분명 파이프라인 버블을 최소화하는 데 도움이 됩니다.

 

이것만으로도 인텔이 CPU를 고속화하기 위해 얼마나 많은 아이디어를 짜냈는지 알 수 있지만, 네할렘을 도입하며 인텔은 다시 한번 프론트엔드에 많은 수정을 가했습니다. 다음 그림으로 한번 살펴보도록 하죠.

 

 

페치 버퍼가 절반으로 감소한 것은 의외이나, 그 외의 다른 많은 부분에서 이를 상쇄할만한 변화가 있었습니다. 사실 네할렘 아키텍처에서 가장 큰 변화라면 정작 CPU 내부 (프론트엔드, 백엔드) 보다도 '언코어' 부분에 해당하는 부분에 있는데, 바로 경쟁사인 AMD가 미리 도입한 바 있던 '내장 메모리 컨트롤러'의 도입과 캐시 계층을 한 단계 늘려 대용량 L3 캐시를 CPU와 같은 다이 위에 탑재했다는 점을 들 수 있을 것입니다. (다만 수율의 문제로 언코어 부분은 코어와 비동기적으로, 더 낮은 클럭으로 작동했습니다) 이 글이 언코어까지 다루지는 않는 관계로 그 부분은 어쩔 수 없이 생략하고 넘어가게 되었지만, 그렇더라도 네할렘의 프론트엔드에서 과거와 바뀐 부분을 찾기란 어렵지 않습니다. 바로 루프 탐지기와 재정렬 큐의 변화입니다.

 

코어 아키텍처에서는 페치 버퍼의 바로 뒤, 디코더의 바로 앞에 위치하던 루프 탐지기가 네할렘에서는 디코더 뒤로 자리를 옮겨 왔습니다. 그 결과 루프 탐지기에 저장되는 명령어의 종류도 날것 그대로의 x86 명령어에서 이미 디코딩을 거친 마이크로옵으로 바뀌게 되었는데, 이는 루프가 감지되었을 때 기존에 비해 디코드 단계까지 추가로 생략할 수 있게 되었음을 의미합니다. 그만큼 레이턴시가 줄고, 파이프라인 버블이 더욱 예방되는 효과가 있습니다.

 

재정렬 큐는 프론트엔드(의 디코더)가 숨가쁘게 만들어 내는 마이크로옵들을, 백엔드의 수많은 연산유닛에 최대한의 병렬성을 확보할 수 있는 방향으로 '재정렬' 해 보내 주는 역할을 수행합니다. 펜티엄 프로가 등장한 이래로 대세가 된 비순차 수행 (OoOE) 의 핵심 기능을 담당하는 하드웨어라고 할 수 있으며, 바로 이곳의 용량이 기존 96 엔트리보다 33% 증가한 128 엔트리가 되었습니다. 비유하자면 테트리스 게임에서 앞으로 나올 블록이 3개씩만 표시되다가 4개씩 표시되도록 바뀐 거랄까요. 이로써 (당연히) 연산유닛 역시 더 효과적으로 많은 마이크로옵을 병렬처리할 수 있게 됩니다.

 

자, 네할렘이 등장하고 어김없이 2년의 시간이 지났고, 다시 '톡'의 차례가 돌아왔습니다. 인텔은 이때 샌디브릿지란 이름의 차세대 아키텍처를 발표했습니다. 과연 샌디브릿지는 네할렘에 비해 무엇이 어떻게 달라졌을까요?

 

 

우선 위 그림에 나타나지 않은 변화를 꼽자면 언코어와 코어가 드디어 동기화되었다는 점을 꼽을 수 있겠습니다. 과거 네할렘 시절 2.13GHz(블룸필드)~2.66GHz(린필드)의 속도로 코어클럭보다 낮게 작동하던 언코어는 제조공정의 미세화에 힘입어 샌디브릿지부터는 코어와 같은 속도로 작동하게끔 조정되었는데, 샌디브릿지의 기본 클럭이 3.xGHz 정도에서부터 시작하는 것을 고려하면 외려 코어 부분보다도 더 큰 비율로 고속화된 것이라 할 수 있습니다. 먼 옛날 512KB 하프스피드 L2 캐시와 256KB 풀스피드 L2 캐시를 각각 달고 있던 펜티엄 III의 두 아종(카트마이, 카퍼마인)이 큰 성능 차를 보였음을 생각하면 언코어의 고속화가 성능 향상으로 직결되었으리라는 추측은 그리 어렵지 않습니다. 더군다나 오늘날의 언코어는 과거의 캐시 이상이기도 하니까요. (메모리컨트롤러가 묶여 있죠.)

 

그림상에 나타난 가장 큰 변화는 디코더와 재정렬 하드웨어 사이에 마이크로옵 캐시가 추가된 것입니다. 과거 넷버스트 아키텍처 시절 인텔이 도입했던 마이크로옵 추적 캐시 (트레이스 캐시) 와 매우 비슷해 보이지만, 굳이 '트레이스' 캐시라 명명되지 않은 데서 알 수 있듯 과거처럼 마이크로옵 단위로 추적까지 하지는 않고, 다만 담아 두기만 합니다. 그렇더라도 이미 디코딩된 마이크로옵을 1500여개나 미리 저장해둘 수 있다는 것은 캐시 미스 발생확률을 더욱 줄여 주며, 사실상 L0 캐시라 불러도 손색없을 기능을 수행한다고 할 수 있습니다. 이와 더불어 샌디브릿지에서는 재정렬 큐의 용량도 기존 128 엔트리보다 31% 가량 증가한 168 엔트리가 되었습니다.

 

 

하스웰 아키텍처는, 적어도 프론트엔드 부분에서는 외견상 많은 부분이 바뀌지는 않았습니다. 그간 스레드별로 28 엔트리씩이 할당되던 루프 탐지기가 (스레드 상관없이, 코어 단위로) 56 엔트리가 되어 보다 효율적인 관리가 가능해졌다는 것과 재정렬 큐가 재차 14%가량 증가해 192 엔트리가 되었다는 점 정도가 전부랄까요. 외려 코어 외적으로는 더 나빠진 부분도 있습니다. 바로 언코어가 도로 코어와 비동기화된 것입니다.

 

그 이면에 수율 문제가 있었을지, 다른 무언가가 있는지는 알 수 없으나 인텔이 하스웰의 언코어를 코어와 별도의 클럭 도메인에서 작동하도록 한 이유는 다음과 같습니다 : 바로 내장그래픽 코어와의 형평성 때문입니다. 아시다시피 샌디브릿지부터 인텔은 주력 CPU 다이상에 그래픽 코어를 함께 탑재해오고 있으며, 이 그래픽코어는 각 CPU 코어와 함께 L3 캐시를 공유해 사용하도록 설계되어 있습니다. 그런데 CPU가 제 속도로 작동하고 있을 때에는 문제가 없으나, GPU가 풀스피드로 작동중일 때 CPU가 아이들상태에 빠질 경우 GPU가 '부당하게' 역시 아이들상태에 빠진 L3 캐시를 액세스해야만 하는 문제가 발생한다는 것이죠.

 

아무튼 이에 대한 해결책으로 인텔은 CPU 코어 / 그래픽 코어 / 언코어를 모두 제각기 다른 클럭 도메인에서 작동하도록 만들었고, 그 결과 샌디브릿지 아키텍처보다 하스웰에서의 레이턴시는 전체적으로 높아질 것으로 예측되었으며 실제 벤치마크 결과 역시 그러합니다. 다만, 과거 네할렘처럼 CPU보다 터무니없이 낮은 속도로 작동하는 것은 아니고, CPU 기본클럭과 같은 속도로 작동하나 별도의 클럭 도메인이 된 만큼 레이턴시가 늘어나는 것만큼은 피할 수 없었던 것 같습니다.

 

자, 지금까지 코어-네할렘-샌디브릿지-하스웰의 프론트엔드를 살펴 보았습니다. 이제부터는 백엔드를 살펴 봅시다.

 

 

코어 아키텍처의 백엔드입니다. 앞서 프론트엔드 설명시와 마찬가지로, 코어 아키텍처는 뒤이어 설명할 후속 아키텍처들을 설명하기 위한 '기본형' 역할입니다. 최대한 간단히 설명하고 넘어갑시다.

 

프론트엔드의 재정렬 큐로부터 넘어온 명령어는 다시 32 엔트리의 '대기소'에 들어가 있다가 적절한 순서에 각 연산유닛에 포트를 통해 보내집니다(=이슈). 코어의 백엔드는 총 6개의 이슈 포트로 구성되는데, 이는 당대까지 발표되었던 모든 인텔 아키텍처 중 가장 넓은 대역폭이기도 하거니와 이후로도, 하스웰 등장 이전까지, 무려 5년간 깨지지 않은 수치이기도 하고, 코어의 등장 당시 인텔을 가장 괴롭게 하던 경쟁사 AMD의 K7 / K8이 취하고 있던 백엔드 대역폭과 같은 것이기도 합니다.

 

아무튼. 각 이슈 포트를 다시 크게 구분해 보자면, 산술연산유닛들에게 향하는 3개의 포트와 메모리 접근 유닛에 향하는 3개의 포트로 구분할 수 있겠습니다. 이론적으로 3개의 산술연산 명령어와 3개의 메모리 접근 명령어를 동시에 처리할 수 있으며, 산술연산 명령어 또는 메모리 접근 명령어로만 3개 이상의 포트가 점유될 경우 그만큼의 대역폭 손실이 발생합니다. 또한 산술연산 명령어 중에서도 정수 스칼라 연산 / 정수 SIMD 연산 / 부동소수점 스칼라/SIMD 연산이 각각 경합하는 경우 그만큼의 비효율이 발생하게 됩니다.

 

이 기본형을 마음 속에 담아 두고, 네할렘의 백엔드를 보러 갑시다.

 

 

네할렘은, 프론트엔드가 상당히 바뀌고 언코어는 더 큰 폭으로 바뀐 것과 별개로, 실질적인 연산유닛에 해당하는 백엔드는 거의 변화가 없었습니다. 다만 대기소의 용량이 32 엔트리에서 12.5% 증가한 36 엔트리가 되어 있기는 합니다.

 

...음. 설명할 내용이 별로 없으니 바로 넘어갑시다.

 

 

샌디브릿지는, 네할렘에 비해 백엔드 구조 자체가 많이 변하지는 않았습니다만 메모리 접근 유닛의 구성이 다변화되고 부동소수점 연산유닛이 AVX 명령어 세트를 처리할 수 있도록 개선되어 이론적으로 부동소수점 스루풋이 최대 두 배까지 증가하게 되었습니다.

 

구체적으로, 부동소수점 연산을 빡세게 수행하는 프로그램이 AVX에 최적화되어 있다면 100%의 성능 향상을 기대할 수 있을 것입니다. 이를 단계적으로 쪼개 보면 아래와 같겠죠.

 

1. 워크로드의 50%가 AVX 최적화 : 기존 대비 33% 성능 향상 (소요시간 50+50 -> 50+25. 즉 100 -> 75)

2. 워크로드의 20%가 AVX 최적화 : 기존 대비 11% 성능 향상 (소요시간 80+20 -> 80+10, 즉 100 -> 90)

 

AVX를 지원하는 어플리케이션이 많지 않은 초창기 환경을 2번 시나리오로 가정하고, AVX 생태계가 안정적으로 정착되어 비-AVX 어플리케이션과 대등하게 공존하게 되는 시점을 1번 시나리오로 가정하자면 샌디브릿지는 네할렘보다 최소 11%, 최대 33% 정도 더 나아진 "일상 어플리케이션 성능" 을 보일 것이라 가정해볼 수 있겠습니다. 이에 대해서는 뒤의 SKU별 분석에서 보다 심도 있게 다뤄 보도록 하고, 일단은 이론적으로 '그럴 수도 있겠다' 는 정도로 생각하고 넘어갑시다.

 

자, 다음 그림으로 넘어가기 전에 다들 심호흡 한번 크게 하고 갑시다.

 

오늘의 주인공, 하스웰입니다.

 

 

사실 하스웰 아키텍처의 가장 큰 변화는 언코어 로직이나 프론트엔드보다도 백엔드에 집중되어 있습니다. 재정렬 큐의 용량이 증대되었다는 점은 이미 프론트엔드 장에서 언급했고, 대기소의 용량 역시 샌디브릿지보다 11%가량 증가한 60 엔트리가 되었지만 이는 핵심이 아닙니다. 가장 주목할만한 & 주목해야 하는 부분은, 인텔이 코어 아키텍처 이후 무려 6년만에 처음으로 백엔드 대역폭을 늘린 것입니다. 코어부터 샌디브릿지에 이르기까지 6개로 고정되어 있던 이슈 포트 갯수는 하스웰에서 역사상 처음으로 8개가 되었습니다. 비단 6년만의 첫 변화일 뿐 아니라, 인텔/AMD 양사의 CPU사(史)를 통틀어 가장 넓은 대역폭을 갖는 아키텍처가 된 것입니다.

 

일단 늘어난 두 포트에 각각 정수연산유닛과 메모리 접근 유닛을 안배하여 연산유닛:메모리 접근 유닛 비율을 1:1로 유지해 오던 전통은 지켰고, 동시에 한 클럭당 수행 가능한 연산을 종류별로 나눠 보았을 때 하스웰 이전까지는 정수:부동소수점의 비율이 3:3으로 동률이던 것이 하스웰에서는 4:3이 되어 상대적으로 정수연산 성능의 보강에 공을 들였음을 알 수 있습니다. 일단 이 대목에서 마찬가지로 정수 성능에 역점을 둔 AMD의 불도저를 생각하지 않을 수 없는데, 인텔이 실제로 불도저를 염두에 두었든 두었지 않든, 하스웰의 존재 (구체적으로는 서버 시장에서의 하스웰의 존재) 가 AMD에 엄청난 압박이 되리란 점은 자명해 보입니다. 모듈 = 코어를 동격으로 보았을 때, 1 모듈(코어) 단위에서 가장 넓은 정수 파이프라인을 갖고 있다는 불도저의 유일한 장점에 물타기를 해 버렸으니 말이죠. (하스웰의 등장으로 인해 1 불도저 모듈과 1 하스웰 코어가 갖는 정수 파이프라인 갯수가 4개씩으로 동일해졌습니다.)

 

다시 인텔 이야기로 돌아와서, 그렇다고 부동소수점 연산유닛을 인텔이 방치해 두었느냐 하면 그렇지도 않습니다. 샌디브릿지에서 AVX를 도입하여 이론상의 스루풋을 두 배로 늘린 데 이어, 하스웰에서는 기존의 Multiply 연산과 Add 연산을 한 사이클에 수행 가능한 FMA(Fused Multiply-Add)를 도입해 역시 유닛 레벨에서 이론상의 스루풋을 재차 두 배 가까이 늘렸습니다.

 

구체적으로, 하스웰이 가진 세 개의 FPU 중 FMA연산을 수행하는 것은 두 개로 FMA-intensive한 코드가 지속적으로 공급될 경우(= 이상적인 경우) 전세대 대비 연산성능이 약 67% 향상될 것으로 보입니다. 앞서 AVX 최적화 시나리오와 유사한 방식으로 살펴보자면,

 

1. 워크로드의 50%가 FMA 최적화 : 기존 대비 25% 성능 향상 (소요시간 50+50 -> 50+30. 즉 100 -> 80)

2. 워크로드의 20%가 FMA 최적화 : 기존 대비 9% 성능 향상 (소요시간 80+20 -> 80+12, 즉 100 -> 92)

 

즉, FMA 최적화된 코드의 비중이 20% 정도일 경우 종합적으로 9%의 성능향상이 있고, 50%로 확대될 경우의 성능향상폭은 25% 정도일 것으로 예상되는데 추후 FMA의 저변이 넓어졌을 때 사용자들이 실제로 관측하게 될 성능향상폭이 그 정도쯤이리라 생각됩니다.

 

이렇듯 하스웰은 아키텍처 측면에서(역시, '톡' 답게)큰 진전을 이룬 아키텍처입니다. 이는 굉장한 센세이션을 불러일으켰던 코어->네할렘, 네할렘->샌디브릿지의 세대교체보다도 어찌 보면 더 근본적이고 큰 변화라 할 수 있는 것입니다. 그러나 사용자들에게 와닿기로는 앞선 두 '톡'의 등장에 비해 상대적으로 미미한 변화로 와닿는 게 또 지금의 하스웰이기도 합니다. 인텔의 역대 '톡' 중 가장 임팩트 없는 대접을 받고 있달까요. 그렇다면, 대체 어떤 상황 변화가 하스웰을 이토록 얕보이게 만들었을까요.

 

근본적인 원인은 인텔이 모처럼 (6년만에) 백엔드를 넓히는 대수술을 단행했고, 실제 이를 잘 활용하는 벤치마크 시나리오 하에서는 꽤 많은 성능향상을 이뤘음에도 불구하고 일상적인 사용환경 하에서의 성능향상이 고만고만한 수준이란 데 있습니다. 즉 오늘날의 '일상적 사용환경'을 구성하는 워크로드가 과거 어느 시점 이후 더 이상 발전하지 않고 정체되어 있다는 뜻으로, 특히 싱글스레드 성능은 샌디브릿지 이후 거의 포화상태에 가깝게 된 것으로 보입니다. 과거에는 CPU의 발전과 소프트웨어의 발전이 서로 쌍을 이루며 다른 한 쪽을 견인하는 역할을 수행했지만 오늘날 사용자들은 더 이상 가파른 업그레이드에 관심이 없어 보입니다.

 

프로세서의 풍부한 자원을 최대한 활용(fully utilize)하기 위해서는 멀티스레드화(化)밖에는 별로 선택의 여지가 없으나 '일상적 사용환경'이 많은 코어의 활용에 그리 우호적이지 않다는 사실을 깨닫고 보면 이것 역시 쉽게 택할 수 있는 길이 아니죠. 반면 서버/워크스테이션에서는 멀티스레드화가 가져다주는 이득이 상대적으로 큰 편인데, 바로 이 차이 때문에 오늘날 서버/워크스테이션과 일반 PC의 양극화가 눈에 띄게 진행 중입니다. 이와 관련된 내용은 다음 편으로 예정 중인 '제온 편'에서 다루도록 하고, 일단은 데스크탑용 하스웰로 다시 눈길을 돌려 보겠습니다.

 

지금부터 제가 풀어 볼 썰은 지금까지 설명한 내용의 '현실 버전' 쯤 되지 않을까 싶습니다. 휴리스틱한 벤치마크 결과 없이, 어떻게 이론적인 정량 분석과 정성적인 추측만으로 프로세서를 논할 수 있는지 한번쯤 다뤄 보고 싶었던, 말하자면 다소 실험적인 글입니다.

 

우선, 1세대부터 현 4세대까지, 코어 i7 (not Extreme) 시리즈의 플래그십들을 모아 본 계보입니다. 각각의 모델은 미리 부여된 기본클럭 외에, 1~4코어별 터보 작동 배수가 따로 설정되어 있으며, 이를 바탕으로 이론적인 성능을 아주 러프하게 구해 보면 아래와 같습니다.

 

 

위 표는 보시다시피 코어 갯수와 (각 갯수별 코어가 활성화되었을 때의) 클럭을 곱한 수치일 뿐입니다. 세대교체가 가져다 준 IPC 향상 등은 전혀 반영되어 있지 않죠. 여기에 무엇을 더 반영해 볼 수 있을까요?

 

일단, 백엔드 대역폭을 곱해 보았습니다. (※ 프론트엔드 레벨에서는, 우선 디코더 갯수의 변화가 없고, 루프 탐지기나 마이크로옵 캐시 등의 영향을 계량화하기 어려운데다, 재정렬 큐 확장이 가져다주는 병렬성 증대의 영향력 역시 계량화할 마땅한 방법이 생각나지 않아 이 글에서는 프론트엔드의 영향을 제외했습니다. 굳이 따지자면 이후 논할 수치들이 맞아떨어지기 위한 조건은, 파이프라인 버블이 발생하지 않고 프론트엔드로 인한 병목이 발생하지 않는 상황으로 가정해야 하겠지요.)

 

 

보시다시피 네할렘-샌디브릿지-아이비브릿지는 공통적으로 6 이슈 포트, 하스웰은 8 이슈 포트를 갖고 있으니 이전 표와 비교해 유일하게 하스웰만이 이득을 얻고 있습니다. 물론 모든 이슈 포트가 연산에 관여하는 것이 아니기에 이 수치 역시 전적으로 신뢰할 수 있는 것은 아닙니다.

 

여기서 다시 한번 가정이 들어갑니다. 현실에서는 정수 코드와 부동소수점 코드가 적정 비율로 혼합된 워크로드가 많겠지만, 일단 완전히 정수 연산으로만 구성된 워크로드를 돌린다고 가정해 봅시다. 이 경우 각 이슈 포트 중 정수연산유닛에 연결된 포트의 갯수만이 유효하게 반영될 것입니다. 그 결과는 아래 표와 같습니다.

 

 

...아, 제 생각이 짧았습니다. 어차피 총 이슈 포트 갯수와 정수연산유닛 갯수 비율이 같으니 이전 표와 변함이 없습니다.

 

그렇다면 일단 부동소수점 스루풋을 한번 살펴볼까요. 일단 AVX, FMA 등으로 얻을 수 있는 어드밴티지가 모두 반영되었다고 가정한 상황입니다. 이 경우 AVX가 적용된 샌디브릿지(+아이비브릿지)는 네할렘 대비 두 배의 동클럭 스루풋을 얻고, FMA가 적용된 하스웰은 다시 샌디브릿지 대비 1.67배를 추가로 얻게 됩니다.

 

 

물론 위 표만큼 성능이 벌어지면 얼마나 좋겠느냐만(그럼 모두가 하스웰을 쓰겠죠!!) 현실이 그렇지는 않습니다. 여러 이유가 있겠으나 AVX, FMA 등에 최적화된 어플리케이션의 저변이 그만큼 빠르게 증가하지는 않았기 때문일 것입니다.

 

그렇다면, 앞에서 살펴본 시나리오들이 도움이 될 수 있지 않을까요. 일단 AVX / FMA에 최적화된 코드의 비율이 각각 20%인 상황을 가정한 시나리오입니다. 이 경우 동 클럭에서 AVX로 얻는 성능 향상은 11%, FMA로 얻는 성능 향상은 9% 정도가 됩니다.

 

 

표에 나타난 결과가 상당히 우리들의 경험칙과 유사해 보입니다. 실제 샌디브릿지는 출시와 동시에 네할렘 대비 20% 정도 향상된 IPC를 보였으며, 아이비브릿지와 샌디브릿지의 성능 차가 5%, 하스웰과 아이비브릿지의 성능 차가 8% 정도인 것도 익숙한 수치이리라 생각됩니다. 그렇다면 이것을 시작점으로 두고, 과연 얼마나 더 올라갈 여지가 있을지 한번 살펴봅시다.

 

앞선 시나리오에서 AVX에 최적화된 워크로드의 비율만 50%로 상향 조정해 본 결과입니다.

 

 

이 경우 AVX를 지원하는 샌디브릿지 이후의 아키텍처들이 일제히 이득을 보고 있으며, 최소한 샌디브릿지로도 네할렘보다 40% 가까운 성능 향상을 얻고 있습니다. 물론 i7 2600K가 i7 875K보다 기본클럭이 높으니 이를 감안해야겠지만, 어쨌든 세대교체 (및 명령어 세트 업그레이드) 가 가져다줄 수 있는 혜택이 이만큼이라면 꽤나 솔깃한 조건입니다.

 

그렇다면 하스웰의 유니크한 장점, FMA의 이득은 어느 정도일까요. FMA에 최적화된 워크로드의 비율을 50% 늘려 봅시다.

 

 

네할렘과 비교하면 하스웰은 거의 두 배 가까운 성능향상을 보이게 되었습니다. 이전 세대 '톡' 인 샌디브릿지와 비교하더라도 30% 이상의 성능향상을 얻는 것으로 나타나, 네할렘->샌디브릿지의 변화보다 샌디브릿지->하스웰의 변화가 훨씬 더 큰 것임을 항변하고 있죠. 아무래도 지금의 현실이 우리가 하스웰의 진가를 못 알아보게끔 몰아 가고 있으나, FMA의 저변이 넓어져 갈수록 기존 아키텍처들보다 뚜렷한 장점을 보일 것만은 확실합니다.

 

이렇듯 인텔은 오늘날까지 '게으르지 않게' 자사의 CPU를 착실히 업데이트 해오고 있습니다. 저 역시 한때나마 (외견상) 샌디브릿지-아이비브릿지-하스웰로 이어지는 3개 세대의 변화가 미미하다고 생각해, 경쟁상대의 부재가 불러온 나태함의 결과 아닌가 하는 생각을 했었지만 외려 하스웰은 인텔로서는 모험에 가까운 변화였다고 할 수도 있겠습니다. 다만 이번의 '모험' 이 더 이상 현실의 성능 (그 중에서도 '일반적인 사용 환경에서의 성능')에 직결되지 않는 것을 모두가 알게 된 이상, 앞으로 어떤 획기적인 전기가 마련되지 않는 한 데스크탑 레벨에서의 격변은 보기 어려우리란 슬픈 예감이 들기도 합니다. 이와 동시에 서버/워크스테이션용 라인업과의 양극화가 한층 가속화되리란 생각도 드는군요.

 

다음 글에서는 (위의 표들과 비슷한 방식으로) i7 익스트림 라인업, 서버/워크스테이션 라인업의 분석을 소개해 드릴 예정입니다. 물론 저런 재미없는 표만 담을 건 아니고, (앞서 스쳐가듯 언급한 바 있는) 네할렘-샌디브릿지-하스웰의 메모리 계층 구조 차이에 따른 레이턴시 분석, 특히 같은 하스웰 아키텍처이면서도 별도의 크리스탈웰 칩으로 L4 캐시를 구현한 하스웰 "R" 시리즈와의 비교 등을 담아 보려 하니 많이들 오셔서 재미있게 읽어 주셨으면 좋겠습니다.

 

긴 글 읽어 주셔서 감사합니다.

 

모두 좋은 하루 되세요 :-D

 

//

 

아래 위젯은 일종의 크라우드펀딩 플랫폼인 티스토리 '밀어주기' 서비스 위젯입니다. 100원부터 3000원까지의 범위 내에서 소액기부가 가능하며, 이런 형태의 펀딩이 성공적일 경우 '이해관계자로부터 독립된 벤치마크' 의 지속 가능한 원동력이 되리라 생각합니다. 물론 후원 없이 제 글을 읽어 주시는 것만으로도 저는 독자 여러분께 감사합니다 :)