최근 수정 시각 : 2017-09-20 14:31:25

SMT

하이퍼스레딩에서 넘어옴
Simultaneous Multi-Threading

파일:external/blogs.technet.com/3566.image_5F00_6.png
성능 참고하는 데 좋은 벤치마크. 아카이브

1. 개요

SMT라는 명칭은 동시 멀티스레딩을 뜻하며, 학계에서 주로 지칭하는 용어로 사용되고 있다. 시장에서는 인텔이 이 기술을 부르는 이름인 하이퍼쓰레딩으로 더 유명하지만, 이 기술이 인텔 독점인 것은 아니며 AMD에서도 기존의 불도저에 적용한 CMT[1] 구조를 버리고 2017년 3월 초에 출시된 RYZEN에 이 구조를 채용하면서 사실상 거의 모든 데스크탑 CPU에 적용되는 기술이 되었다. 메인프레임에 주로 적용되었던 SPARC이나 IBM의 프로세서에서도 적극 활용된 바 있는데 특히 IBM에서는 이 기술로 자사 CPU의 단일 코어에 8스레드를 박아넣기도 했다.[2].

2. 원리

단일 코어에서 구현할 수 있는 명령어 수준의 병렬처리 능력(Instruction-Level Parallelism)은 명령어 종속성(Dependency)으로 인해 구현에 한계가 있다.[3] 그렇다면 이를 증가시킬 수 없다면 남는 연산 능력을 다른 스레드의 명령어를 처리하는데 사용한다면, 양 스레드간의 명령어 종속성은 거의 없을 것이기에 단일 코어에서 전체적인 명령어 병렬처리 능력을 증가시킬 수 있다는 개념의 기술이다. 현대의 CPU는 슈퍼스칼라 구조와 파이프라이닝 기법이라고 해서

CPU 전체가 한 번에 하나의 명령을 처리하는 것이 아니라 명령어 몇 개를 동시에 처리함과 동시에 명령 하나를 또다시 여러 단계의 작은 명령으로 나누고 각 부분을 차례대로 처리한다. 즉 몇 개의 명령어가 몇분의 1로 나누어지고, 그런 명령어 몇 개가 한번에 돌아가는 것이다.

이런 식으로 작동하는 이유는 많은 기계어 명령이 코드로는 하나로 되어 있어도 실제 처리해야 하는 일은 여러 단계로 나누어져 있고 각 단계는 이전 단계가 처리되기 전에는 수행이 불가능하기 때문이다. 예를 들어 메모리의 값을 증가시키는 명령이
1 메모리의 값을 읽는다.
2 읽은 값을 더한다.
3 값을 메모리에 쓴다.
와 같이 작동한다면 1번이 끝나기 전에는 2번을 할 수 없고 2번이 끝나기 전에는 3번을 할 수 없다.

그런데 실제로는 명령이 처리되기 위해 필요한 일이 명령마다 다르다. CPU의 예시는 아니지만 네트워크 비동기 처리의 예시를 들어보자. 네트워크에서 특정 값을 읽어 이를 처리하는 경우, 상당한 경우에는 네트워크의 대기 시간이 프로그램 전체 실행 시간의 대부분을 차지한다. 이 상황에서 위와 같이
1 네트워크의 값을 읽는다.
2 읽은 값을 처리한다.
3 값을 저장장치에 쓴다.
로 코드를 작성한다면, 1번의 네트워크 대기 지연 시간에 의해 프로그램은 상당히 비효율적인 구조를 가지게 될 것이다. 네트워크에서 값을 읽어오는 데 걸리는 시간은 시스템의 자체 저장장치인 메모리나 하드디스크에서 데이터를 읽는데 걸리는 시간에 비해 몇십~몇천배는 되기 때문이다. 이때 CPU는 1번에서 값을 읽어올 때까지 대기하게 된다.

하지만 CPU가 처리해야 할 일 중에는 이렇게 서로 연계된 일만 있는 게 아니다. 예를 들어 네트워크에서 값이 들어오길 하염없이 기다리는 저 컴퓨터에서 동시에 MP3 파일도 하나 재생하고 있다고 하자. 그렇다면 네트워크에서 값이 들어올 때까지 MP3을 재생하고 있으면 효율이 올라가지 않을까? 하이퍼스레딩은 이렇게 놀고 있는 부분에 명령어 종속성이 없는 다른 스레드의 명령어를 투입하여 CPU의 효율을 높이는, 일종의 우회책이다. CPU의 최대 성능 이상은 절대 낼 수 없지만, 프로그램의 한계 때문에 쓰지 못했던 CPU의 남은 성능을 끝까지 쥐어짜는 셈이다.

논리적으로는(즉 S/W의 관점으로는) 하나의 코어에 하나의 가상의 코어를 만들어서 CPU 2개로 인식된다. 기본적으로 별개의 명령을 처리해야 하기 때문. 그래서 HT가 지원되는 CPU를 작업 관리자에서 보면 코어 수가 2배로 뻥튀기 되는 것을 알 수 있다.

예를 들어 1과 2라는 프로세스(스레드)에서 명령을 처리할 때 하이퍼 스레딩이 없는 CPU 의 경우,
(<int>는 다른 프로세스로 전환)
1
1
1
1 <int>
2
2 <int>
1
1 <int>
2 <end>
1 <end>
이런 식으로 한번에 하나의 명령만 처리 할 수 있다. 두 개의 작업을 재빠르게 전환할 뿐, 진정한 멀티태스킹은 아니다.

반대로 하이퍼 스레딩이 있을 경우엔,
1,(2)
1,(2)
1,(2)
1,(2)
1.(2)
1,(2)
1 <end>
2 <end>
[4]
이런 식으로 처리할 내용을 우겨넣어서 성능을 향상시키는 원리다.

물론 2개의 물리적인 코어보다는 성능이 확실히 떨어진다. 이 논리로 하이퍼스레딩이 있어봤자 느려터졌다고 하지만, 그래도 단일 코어 환경에 비하면 다중 작업 사용시에 한 처리가 많은 연산을 할 경우 상대적으로 다른 프로세스에 훨씬 많은 여유를 줄 수 있는 장점이 있다. 예를 들어 3D 렌더링을 할 경우 진가가 드러나는데, 3D 렌더러는 스레드당 한 개의 렌더링 블록을 생성해 내는데, 하이퍼스레딩이 켜진 쿼드 코어 CPU의 경우 8개의 스레드가 생성되어(즉 논리적인 옥타코어) 시간의 이점을 볼 수 있다. (20% 정도 차이가 난다) 애초에 하이퍼스레딩이 처음 나왔을 땐 PC용으로는 싱글 코어가 전부였던 시기기도 하고, 인텔에 따르면 하이퍼스레딩 지원을 위한 추가 리소스(CPU의 다이 크기 증가 등)는 5% 정도에 불과하기 때문에 5%주고 20%를 얻는 건 충분히 남는 장사이다. [5]
다만, 보드나라에서 라이젠와 인텔의 SMT 효율을 비교한 벤치에서는 최대 39.14% 및 평균 26.6% (라이젠은 최대 48.16% 및 평균 35.85%)가 나왔으므로, 인텔이 20%를 얘기한 당시엔 어땠는지 몰라도, 17년 현재에는 '20%를 상회'한다고 볼 수 있다.

3. 사용 현황

오래전 하이퍼쓰레기 라고도 불린 하이퍼스레딩 사실 게이밍에서는 아직도 하이퍼쓰레기 SMT....

Pentium 4 Northwood 중 이름 뒤에 B가 붙은 최상급과(3.06GHz)와 뒤에 C가 붙은 제품에서 처음 사용되었으며 윈도우 XP에만 지원을 하는 바람에 윈도우 XP의 보급율을 크게 늘렸지만 넷버스트 구조 때문에 효율은 그다지 좋지 못했다. 그래서 당시 농담으로 부르는 별명은 하이퍼쓰레기. 다만, 당시에도 멀티태스킹상 이득은 분명하였기 때문에, 프레스캇애슬론64상대로 나름 선전하던 분야도 있었다.[6] 펜티엄 4를 두 개 붙인 인텔 펜티엄D 시리즈에서는 사용되지 않았으나, 일명 펜티엄 X라 불리는 익스트림 에디션은 펜티엄 D 코어에 하이퍼스레딩을 탑재해 코어 i3 마냥 2코어 4스레드로 돌아간다. 당연히 발열량은 시궁창. 코어 시리즈에서는 빠졌다가 인텔 아톰 시리즈에서 적용했고, 넷북, 넷탑에 사용됐던 아톰의 거의 대부분이 지원한다. Z500/Z510 같은 초 저전력 프로세서는 전력 문제로 빼는 경우도 있다. 아톰 베이트레일부터는 설계 변경으로 하이퍼쓰레딩이 빠졌다. 그리고 하이퍼 쓰레딩이 모바일에서 전혀 필요 없다는 걸 증명했다. 이후 인텔 코어 i 시리즈에서도 등장했다. i3와 i7에 사용되고 있으며 성능은 많이 나아졌다. 비록 논리 코어지만 과거의 오명을 벗을 만큼 성능 향상이 있다. 특히 4코어 지원 게임에서 2코어 4스레드인 i3와 2코어 2스레드인 펜티엄의 비교는 i3가 확실히 뛰어나다. i3 4130과 G3258을 4.5GHz로 오버클럭한 경우와 비교해 멀티 코어 지원 게임에서 G3258이 더 낮은 클럭의 i3에게 지는 것을 볼 수 있다.

다만 펜티엄 4든 코어 i시리즈든 하이퍼스레딩을 켜면 당연히 발열과 전력 소모가 증가한다. 위의 설명처럼 같은 시간에 더 많은 명령을 처리하므로 개념은 다르지만 오버클럭과 비슷한 원리인 셈. 풀로드 시 많게는 30~40W가량 더 소모한다.

2016 년도까지 하이퍼스레딩의 최대 수혜자는 단연 가격 때문에 코어 수가 제한된 코어 i3 시리즈라 단언할 수 있다.[7] 프로그램이 코어2개 까지만 쓰는 상황에선 높은 IPC[8]빨로 AMD 6, 8코어들을 바르고, 멀티스레드를 잘 쓰는 프로그램에서도 듀얼코어 + 하이퍼스레딩의 가상 쿼드코어 효과로 나름 선방한다. 심지어 프로그램이 멀티스레드를 정말 잘 써서 순수 성능에선 AMD 8코어에게 쳐발리는 상황에서도 전성비 만큼은 항상 선방하는 편. 이 때문에 컴퓨터 부품을 취급하는 인터넷 쇼핑몰의 FX 시리즈 댓글란은 몇년째 FX vs i3 떡밥으로 피터지게 싸우고 있다. 최상위 라인업 모델이 i3에게 비교당하는 AMD 안습 가격대가 같으니 비교할수밖에 없지 않나? 그러니 APU를 사자.... 2017년 1분기 인텔 카비레이크 출시 후.. 데스크탑용 제품군에도 하이퍼쓰레딩을 탑재한 펜티엄 3개가 나와 코어 i3가 위험에 처한 상황 (본격 인텔의 i3 팀킬). 급기야는 AMD 측에서도 AMD ZEN 마이크로아키텍처에 도입했다.


[1] Cluster Multi-Threading. 상세한 내용은 불도저 마이크로아키텍쳐 참조.[2] 물론 현재 일반 시장에서 구현되는 SMT의 정도는 1코어에 2스레드꼴이며, 이렇게 된 이유는 아래에 후술한다.[3] RAW(Read-After-Write), WAR(Write-After-Read), WAW(Write-After-Write) 등의 다양한 종속성이 있으며, 일부는 구조적으로 극복할 수 있다고 해도 근본적인 종속은 해결되지 않는다.[4] (2): 2 중, 1과 중복되지 않는 일부[5] 물론 어디까지나 인텔에서 자사 기술의 장점을 설명한 것이니 덮어놓고 모든 경우에 적용된다고 맹신하는 것은 금물이다. 오히려 멀티코어 프로세서가 대중화 된 이후로 CPU 제조사들이 코어를 때려박는 걸 SW 개발자들이 못 따라가면서, 싱글 코어 시대에 비해서는 빛이 바랜 상황이다. 코어수가 SW의 멀티스레드 지원을 이미 능가한 상황에서는 하이퍼스레딩을 쓰면, 약간이지만 무조건 성능이 떨어진다.[6] 물론 애슬론64X2 뜨면 얄짤없지만, 당시 AMD는 앞선 성능의 이득을 누리기 위해 듀얼코어 프리미엄을 포기하지 않았고, 동일성능 제온 2 CPU 시스템을 기준으로 나름 싼 가격을 책정하는 등, 상대적으로 떨어지는 브랜드 파워와 시장 지배력을 생각하면 매우 쎈 가격을 유지했기 때문에 (심지어 PC용 듀얼코어 하위라인이, 워크스태이션용인 옵테론 160/165보다 비싸서 이들 옵테론 하위라인 CPU를 사서 오버클럭하는게 더 싸게 먹히던 시절도 있었다!), 중저가형 PC에서 2쓰레드를 맛보려면 HT나 펜티엄D 805 같은거 밖에 선택지가 없는 상황이 꽤나 지속되었고 이는 싱글코어간 대결에서 인텔이 나름 어드벤티지를 받는 요소였다.[7] 그 중에서도 CPU하나당 성능이 낮은 샌디-아이비브릿지 시스템이 가장 돋보인다.[8] 한 클럭 당 명령어를 몇개를 수행할 수 있느냐를 나타내는 표준 수치로, 한마디로 클럭 대비 성능