[clearfix]
1. 개요
SMT는 여러 뜻의 약자로 쓰인다.1. Surface-mount technology
2. Sequential manual transmission
3. Simultaneous Multi-Threading
4. 국내 알뜰폰 통신기업 Smartel 스마텔의 다른 이름. SMT 알뜰폰
2. Surface-mount technology
표면 실장 기술 (surface-mount technology, SMT)은 인쇄 회로 기판 ( PCB)의 표면에 표면 실장 부품 (surface mounted components, SMC)을 전자 회로에 부착시키는 방법이다. 이렇게 만들어진 전자 소자는 표면 실장 소자(surface-mount devices, SMD)라고 하며, 사실상 반도체의 제조 과정 중 가장 중요한 공정 중 하나이다.전통적인 반도체 제조 방법 중 하나는 PCB에 구멍을 뚫어서 거기에 소자의 다리를 넣고 납땜하는 방법인, 스루홀 기술(through-hole technology)이 사용되었다.[1]
덕분에 SMT기술을 사용하면 스루홀에 비교해, 부품이 작고 가볍고, 더 적은 구멍으로 간단하게 자동으로 조립할 수 있다는 장점이 있다. 덕분에 QC 과정에서 양품의 비율이 크게 증가하고 스루홀을 사용한 기판의 크기와 무게를 1/4에서 1/10까지 줄일 수 있고 비용은 1/2에서 1/4까지 감소시킬 수 있지만, 초기비용은 SMT가 더 많이 든다는 단점이 있다.
현재 SMT로 유명한 회사로는 파나소닉, 야마하 모터 등이 있다.[2] 표면 실장 기술에서 가장 큰 업적을 남긴 기업은 IBM이며 삼성전자와 소니 등도 한때 투자를 하기도 했다.
3. Sequential Manual Transmission
(Sequential Manual Transmission: SMT)LuK사와 토요타가 공동 개발한 변속기의 명칭. 2000년 8월에 토요타 MR-S에 탑재된 세미 오토매틱 트랜스미션으로 유명하며, 매뉴얼 트랜스미션에 설치한 유압 기어 시프트 액추에이터에 의해 클러치 단속이나 기어 선택을 실시하는 시스템이 내장되었다.
4. Simultaneous Multi-Threading
Simultaneous Multi-Threading성능 참고하는 데 좋은 벤치마크. 아카이브
Simultaneous Multi-Threading(동시 멀티스레딩)의 약자로, 말 그대로 여러 개의 스레드들이 동시에 동작하는 멀티스레딩이다.
학계나 업계에서는 이미 1960년대 IBM의 ACS-360 프로젝트 시절부터 이 용어로 사용되고 있었으나, 2000년대 이후 인텔의 ' 하이퍼스레딩'이라는 상표명이 발표되면서 일반 사용자들에게는 하이퍼스레딩(Hyper-Threading)이나 약자인 HT라는 이름으로 더 많이 알려져 있다.
4.1. 스레드와 멀티스레딩
SMT를 이해하려면 스레드(Thread)와 멀티스레딩(Multi-Threading)부터 이해해야 이 문서의 내용을 이해할 수 있다.프로그램이 실행될 때, 빠른 데이터 처리를 위해 스토리지에 저장된 프로그램의 일부가 메모리에 상주하게 되는데 실행 중인 프로그램을 프로세스라고 부른다. 과거에는 프로세스가 곧 작업의 단위로 동작했으나 하드웨어의 자원 소모량이 많다보니 작업 전환에 필요한 컨텍스트 스위치의 오버헤드가 너무 커서 비효율적인 문제가 발생하게 되었는데, 이 문제를 해결하기 위해 프로세스를 여러 개의 '스레드'라는 작은 단위들로 쪼개서 동작하여 오버헤드를 줄이고 효율성이 개선되었다.
스레드는 일의 처리 흐름 단위이며 스레드가 여러 개이므로 '멀티스레드' 또는 다중스레드라고 부르며, 이러한 작업으로 수행하는 동작이 '멀티스레딩'이다. 1950년대부터 이러한 개념이 정립되었으며, 수 십년이 지난 지금도 '작업의 최소 처리 단위'를 스레드 단위로 취급하고 있다. 참고로 컴퓨터에서의 작업은 여러 명령어(Instruction)들로 구성되며, 명령어의 실행은 사이클(클럭) 단위로 처리한다. 이에 대한 자세한 내용은 CPU, 마이크로아키텍처, 파이프라인, 슈퍼스칼라 문서 참조.
사람으로 따지면 덩치 큰 한 사람(프로세스)이 제대로 일 하려면 식량을 많이 제공해줘야 하고 여러 작업들을 감당하려면 메모해야 할 분량이 많지만, 덩치 작은 여러 사람(스레드)들은 덩치가 작은 대신 식량을 많이 제공할 필요 없고 여려 명이라 개인당 메모해야 할 분량도 적으면서 협업할 수 있는 것과 비슷한 관계라고 보면 된다.
강력한 효율성으로 작업의 최소 처리 단위로써 정착되어 있지만, 여러 작업 주체들이 분담해서 처리하기 때문에 하나의 작업 주체일 때보다 흐름을 추적하기 어려우므로 소프트웨어 개발자인 프로그래머가 이를 주의하면서 프로그래밍해야 한다는 단점이 있다. 잘못하면 경쟁 상태(race condition)가 발생하여 원하는 결과 값을 도출할 수 없거나 기능을 제대로 수행할 수 없게 되기 때문. 운영체제 시스템 프로그래머들은 이러한 문제점을 파악해서 운영체제를 개발할 때 시스템의 엉망진창을 최대한 예방하면서 안정적인 멀티스레딩이 되도록 프로세스 스케줄링을 연구하면서 개발했다.
특히 소프트웨어의 관점에서 싱글코어 싱글스레드 프로세서나 싱글코어 멀티스레드 프로세서나 모두 논리 스레드의 관점에서 보이므로 0번째 물리코어의 2Way SMT인 Siblling 스레드는 두개 모두 논리 스레드이며 여기서 한쪽이 완전한 Idle상태이면 0-0나 0-1에서 프로그램이 동작하는 성능의 차이는 없다. (구분이 무의미)
4.1.1. 멀티스레딩의 종류
멀티스레딩에는 방식에 따라 크게 2가지로 구분한다.-
시간적 멀티스레딩 (TMT: Temporal Multi-Threading)
한 번에 하나의 스레드에서만 명령어를 실행하거나 작업을 수행할 수 있는 멀티스레딩으로, 대표적으로 협동형(비선점형) 멀티태스킹처럼 하나의 스레드가 맡고 있는 일련의 명령어들이 먼저 다 수행한 다음에 다른 스레드가 수행하는 Coarse-grained 방식이 있고, 선점형 멀티태스킹처럼 하나의 스레드가 맡고 있는 일련의 명령어들을 먼저 다 수행하기도 전에 다른 스레드가 끼어들어 또 다른 명령어를 수행하면서 결과적으로 서로 다른 스레드들이 각자 맡고 있는 별개의 명령어들을 번갈아 수행하는 Fine-grained 방식이[3]라는 하위 방식들이 있다. 프로세스 스케줄링에 따라 일정 시간 단위로[4] 여러 스레드들을 번갈아 가면서 동작하기 때문에 '시분할 멀티스레딩'이라고도 부르며, 싱글코어 싱글스레드 CPU에도 적용할 수 있는 방식이다. 쉽게 말해서 한 사람이 정해진 계획에 따라 여러 가지의 일들을 다 수행하는 방식이라고 보면 된다. 한 마디로 멀티태스커인 1인 개발자.
좋게 말하면 적은 하드웨어 자원으로도 구현할 수 있는 방식이지만, 나쁘게 말하면 자원이 한정되어 있어서 프로그램 개별적인 성능이 떨어지는 단점이 있을 수밖에 없다. 그 대신 싱글코어 싱글스레드 CPU밖에 없었던 일반 가정용 PC에서도 여러 프로그램들을 같이 실행할 수 있는, 이른바 멀티태스킹이 가능하여 멀티태스킹이 불가능했던 시절보다 비교가 안 될만큼 훨씬 더 나은 사용자 경험( UX: User Experience)을 제공할 수 있었다.
-
동시 멀티스레딩 (SMT: Simultaneous Multi-Threading)
시간적 멀티스레딩과는 다르게 SMT는 여러 스레드들을 한꺼번에, 동시에 명령어들을 실행하거나 작업들을 수행할 수 있다는 차이점이 있다. 쉽게 말하면 혼자가 아닌 여러 사람이 여러 가지 일들을 분담해서 수행하는 것과 같다고 보면 된다. 한 마디로 개발팀.
현재까지 가장 진보된 멀티스레딩 방식으로 '완전한 멀티스레딩'이라고 부르기도 하며, 이와 대비되는 시간적 멀티스레딩을 가짜 멀티스레딩이라고 부르기도 한다. 동시에 동작할 수 있으므로 시간적인 멀티스레딩에서 활용하지 못하던 유휴 자원을 활용할 수 있게 되어서 더 높은 성능을 보여준다.
하지만, 이를 구현하려면 CPU의 형태가 어떻든 여러 개의 스레드들을 한꺼번에 감당할 수 있는 자원이 필요하다는 단점이 있다. 하드웨어 자원의 문제는 곧 비용의 문제로 이어지기 때문. 하드웨어가 지원해도 소프트웨어도 이에 맞게 수행할 수 있게끔 프로그래밍해줘야 제대로 발휘할 수 있다. 거저먹을 수 있는 혜택이 아니라는 뜻이다.
4.2. SMT의 원리
4.2.1. 2000년대 이전의 SMT
현대 CPU는 슈퍼스칼라 구조와 파이프라이닝 기법이 담겨진 마이크로아키텍처를 기반으로, CPU 전체가 한 번에 하나의 명령을 처리하는 것이 아니라 명령어 몇 개를 동시에 처리함과 동시에 명령 하나를 또다시 여러 단계의 작은 명령으로 나누고 각 부분을 차례대로 처리한다. 즉 몇 개의 명령어가 몇분의 1로 나누어지고, 그런 명령어 몇 개가 한번에 돌아가는 것이다.이런 식으로 작동하는 이유는 많은 기계어 명령이 코드로는 하나로 되어 있어도 실제 처리해야 하는 일은 여러 단계로 나누어져 있고 각 단계는 이전 단계가 처리되기 전에는 수행이 불가능하기 때문이다. 예를 들어 메모리의 값을 증가시키는 명령이
1. 메모리의 값을 읽는다.
2. 읽은 값을 더한다.
3. 값을 메모리에 쓴다.
와 같이 작동한다면
1번이 끝나기 전에는 2번을 할 수 없고 2번이 끝나기 전에는 3번을 할 수 없다.2. 읽은 값을 더한다.
3. 값을 메모리에 쓴다.
하지만 파이프라인과 슈퍼스칼라를 동원한다고 해서 능사가 아니다. 명령어 자체에서도 한계가 있는데, 단일 코어에서 구현할 수 있는 명령어 수준의 병렬처리 능력(Instruction-Level Parallelism)은 명령어 종속성(Dependency)을 피할 수 없다. RAW(Read-After-Write), WAR(Write-After-Read), WAW(Write-After-Write) 등의 다양한 종속성이 있으며, 구조적으로 어느 정도 극복할 수 있다고 해도 근본적인 종속성은 해결되지 않는다. 이렇다보니 멀티 프로세서(여기서는 멀티 CPU)를 구축하면 레이스 컨디션 문제만 제외하고 명령어 종속성과 무관하게 동작할 수 있다.
실제로는 명령이 처리되기 위해 필요한 일이 명령마다 다르고 연계지 않을 수도 있는데, CPU의 예시는 아니지만 네트워크 비동기 처리의 예시를 들어보자. 네트워크에서 특정 값을 읽어 이를 처리하는 경우, 상당한 경우에는 네트워크의 대기 시간이 프로그램 전체 실행 시간의 대부분을 차지한다. 이 상황에서 위와 같이
1. 네트워크의 값을 읽는다.
2. 읽은 값을 처리한다.
3. 값을 저장장치에 쓴다.
로 코드를 작성한다면, 1번의 네트워크 대기 지연 시간에 의해 프로그램은 상당히 비효율적인 구조를 가지게 될 것이다. 네트워크에서 값을 읽어오는 데 걸리는 시간은 시스템의 자체 저장장치인 메모리나 하드디스크에서 데이터를 읽는데 걸리는 시간에 비해 몇십~몇천배는 되기 때문이다. 이때 CPU는 1번에서 값을 읽어올 때까지 대기하게 된다.2. 읽은 값을 처리한다.
3. 값을 저장장치에 쓴다.
하지만 CPU가 처리해야 할 일 중에는 이렇게 서로 연계된 일만 있는 게 아니다. 예를 들어 네트워크에서 값이 들어오길 하염없이 기다리는 저 컴퓨터에서 동시에 MP3 음원 파일도 하나 재생하고 있다고 하자. 그렇다면 네트워크에서 값이 들어올 때까지 MP3 음원 파일을 재생하고 있으면 효율이 올라가지 않을까? 멀티 CPU에서 하나의 CPU를 네트워크 처리에 할당하고 다른 하나의 CPU를 MP3 음원 파일 재생에 할당하는 것이 SMT를 구현하는 가장 확실한 방법이다.
이런 식으로 멀티 CPU 시스템에서 하나의 CPU 스레드에 성능을 더 이상 향상시킬 수 없을 경우, 남는 연산 능력을 다른 CPU 스레드의 명령어를 처리하는데 사용한다면 이렇게 놀고 있는 부분에 명령어 종속성이 없는 다른 스레드의 명령어를 투입하여 CPU 전체의 효율을 높이는 즉, 전체적인 명령어 병렬 처리 능력을 향상시킬 수 있다는 개념이다.
4.2.2. 2000년대 이후의 SMT
2000년대에 들어서 '하나의 CPU에 하나의 코어'를 넘어 "하나의 CPU에 여러 개의 코어"라는 멀티코어 프로세서와 '하나의 코어에 하나의 스레드'라는 개념을 넘어, "하나의 코어에 여러 개의 스레드"라는 '다대일(Multi-Way) SMT' 개념이 도입되었다.그 다대일 SMT 개념이라는 것부터 설명하자면 'CPU 전체의 효율을 최대한 높인다'는 목표로 탄생한 개념으로써, 목표 자체만 보면 기존 멀티 CPU 시스템에서나 볼 수 있었던 SMT와 똑같지만 구현 과정이 다르고 무엇보다도 그동안 가격 문제 때문에 멀티 CPU를 접하기 어려워서 싱글코어 싱글스레드 CPU만 접하는 일반 사용자들도 SMT를 경험할 수 있다는 점은 기존의 SMT와 가장 큰 차이점이라고 볼 수 있다.
이미 대중적인 IPC 향상 기법인 Superscalar와 Out-of-Order Execution을 구현한 하드웨어는 한 번에 1개 이상의 명령어를 issue[5]하고 dispatch[6]할 수 있기 때문에 다대일 SMT로 동작하기 위해서는 각 스레드의 context를 저장할 추가적인 레지스터 정도의 하드웨어 모듈이 추가되면 구현 가능하다. 내부에서 실질적으로 연산을 담당하는 ALU의 변화는 없기 때문에 CPU 코어 하나의 최대 성능 이상은 절대 발휘할 수 없지만, 서로다른 쓰레드의 의존성이 없는 명령어를 최대한 파이프라인에 우겨넣어 쓰지 못했던 CPU 전체의 남은 성능을 끝까지 쥐어 짜는 원리이다.
예를 들어 A,B 스레드가 각각 정수와 부동소수점 연산에 집중된 프로그램일 때, 프로세서 파이프라인에 산술연산기(ALU)와 부동소수점(FPU)가 함께 탑재된 프로세서의 경우 SMT가 없는 프로세서는 정수연산을 하고 있을 때 A 스레드가 파이프라인의 모든 클럭을 차지하게 된다. 그렇지만 실제로는 부동소수점 연산을 하고 있지 않으므로 FPU는 유휴상태인 상태임에도 불구하고 측정되는 점유율은 A 스레드가 파이프라인의 모든 클럭을 점유하고 있으므로 100%가 나오기 때문에 컨텍스트 스위칭 없이는 다른 연산 유닛을 사용할 수 없다.
이때 2Way SMT를 가지고 있고, 연산을 제외한 파이프라인 (프론트, 디코딩, 리타이어 등)에 병목이 없다는 가정 하에 한 코어의 모든 연산 유닛을 모두 동원하는 것이 가능하기 때문에 연산 유닛을 클럭 낭비 없이 100% 사용할 수 있게 된다.
코어 하나에 스레드 여러 개의 최초 구현체는
논리적, 즉 S/W의 관점으로는 하나의 코어에 2개의 스레드를 만들어서 CPU 2개로 인식된다.[7] 기본적으로 별개의 명령을 처리해야 하기 때문. 그래서 2대1 SMT가 지원되는 CPU를 Windows XP 이후 버전의 작업 관리자에서 보면 스레드 수가 2배로 뻥튀기 되는 것을 확인할 수 있다.
참고로 Windows NT 3.1부터 Windows 2000까지는 멀티 CPU 또는 멀티코어 CPU를 인식하지만 2대1 SMT까지 인식하지 못 하기 때문에 Windows XP부터 해당된다. DOS 커널 기반의 Windows 1.0부터 Windows Me까지는 멀티 CPU 또는 멀티코어 CPU조차 제대로 인식하지 못 한다.
예를 들어 1과 2라는 프로세스(스레드)에서 명령을 처리할 때 2대1 SMT를 지원하지 않는 CPU 의 경우,
(<int>는 다른 프로세스로 전환)
1
1
1
1 <int>
2
2 <int>
1
1 <int>
2 <end>
1 <end>
이런 식으로 한번에 하나의 명령만 처리 할 수 있다. 두 개의 작업을 재빠르게 전환하는 일시적인 멀티스레딩일 뿐, 진정한 멀티스레딩은 아니다.1
1
1 <int>
2
2 <int>
1
1 <int>
2 <end>
1 <end>
반대로 2대1 SMT를 지원하는 CPU일 경우엔,
1,(2)
1,(2)
1,(2)
1,(2)
1.(2)
1,(2)
1 <end>
2 <end>
[8]1,(2)
1,(2)
1,(2)
1.(2)
1,(2)
1 <end>
2 <end>
이런 식으로 처리할 내용을 우겨 넣어서 하드웨어 자원의 효율을 높이고 성능도 향상시키는 원리이다.
이해가 어려운 사람을 위해 쉽게 서류에 도장을 찍어 보내는 것으로 비유를 하자면 단일 코어, 단일 스레드일 때는 서류를 가져오고 - 도장을 찍어서 - 서류를 다시 보내는 과정을 거친다. 코어가 늘어나면 한 번에 n(코어 수) 장을 가져와 한 번에 n장의 서류에 도장을 찍고 한 번에 n장의 서류를 보내는 것으로 비유할 수 있다. 하이퍼스레딩은 한 번에 서류를 x(스레드 수)장 가져오는 것은 동일하되 하나의 코어는 한 번에 한 장의 서류에만 도장을 찍을 수 있으므로 각각의 서류에 일일이 도장을 찍고 도장을 다 찍은 서류를 한 번에 보내게 된다.[9] 이런 식으로 보면 2장의 서류를 처리한다고 가정했을 때 단일 코어, 단일 스레드는 받고-찍고-보내고-받고-찍고-보내고, 총 6번의 작업이 필요하다면 단일 코어, 하이퍼스레딩(여기선 2스레드)이라면 받고-찍고-찍고-보내고 이렇게 4번으로 작업이 줄어든다.
물론 물리적인 코어라는 자원 자체는 그대로이기 때문에 물리적인 코어 2개보다는 성능이 확실히 떨어진다. 이 논리로 2대1 SMT가 있어봤자 느려터졌다고 하지만, 그래도 단일 코어, 단일 스레드 환경에 비하면 멀티태스킹 사용 시에 한 처리가 많은 연산을 할 경우 상대적으로 다른 프로세스에 훨씬 많은 여유를 줄 수 있는 장점이 있다. 예를 들어 3D 렌더링을 할 경우 진가가 드러나는데, 3D 렌더러는 스레드 당 한 개의 렌더링 블록을 생성해 내는데, 2대1 SMT가 활성화된 쿼드 코어 CPU의 경우 8개의 스레드가 생성되어(즉 논리적인 8코어) 시간의 이점을 볼 수 있다. (20% 정도 차이가 난다)
애초에 2대1 SMT가 처음 나왔을 땐 일반 가정용 PC는 싱글코어가 전부였던 시기기도 하고, 인텔에 따르면 2대1 SMT의 구현체이자 상표명인 하이퍼스레딩 지원을 위한 추가 리소스(CPU의 다이 크기 증가 등)는 5% 정도에 불과하기 때문에 5% 주고 20%를 얻는 건 충분히 남는 장사이다. 물론 어디까지나 인텔에서 자사 기술의 장점을 설명한 것이니 덮어놓고 모든 경우에 적용된다고 맹신하는 것은 금물이다.
2001년에 CPU 안에 여러 개의 코어가 탑재된 형태의 멀티코어 프로세서가 IBM의 POWER4를 통해 처음 등장했는데 당시에 일반 가정용으로는 나오지 못 했고 여전히 메인프레임 이상급의 특수 분야에서만 볼 수 있었지만, 하드웨어 구성 자체는 멀티 CPU 구성이 어려운 일반 가정용에도 멀티코어 CPU를 구경할 수 있는 밑거름이 되었다.
2005년에 들어서야 멀티코어 CPU가 일반 가정에서도 대중화된 이후로 전체적인 SMT는 물론이고 코어 하나당 2대1 SMT까지 제대로 경험할 수 있게 되어 더 나은 멀티태스킹으로 처리 성능 향상이라는 장밋빛 전망이었으나,[10] CPU 제조사들이 코어를 때려박는 걸 S/W 개발자들이 못 따라가면서, 싱글 코어 시대에 비해서는 빛이 바랜 상황이다. 코어수가 S/W의 멀티스레드 지원을 이미 능가한 상황에서는 2대1 SMT까지 동원하면 약간이지만 무조건 성능이 떨어진다.
다만, 2017년에 보드나라에서 AMD의 라이젠 시리즈와 인텔 코어 i 시리즈의 2대1 SMT 효율을 비교한 벤치에서는 최대 39.14% 및 평균 26.6% (라이젠은 최대 48.16% 및 평균 35.85%)가 나왔으므로, 인텔이 20%를 얘기한 당시엔 어땠는지 몰라도, 현재는 '20%를 상회'한다고 볼 수 있다.
그리고 라이젠 시리즈와 8세대 코어 i 시리즈 출시 이후로 게임들의 멀티코어 지원 수준도 올라가서, 8코어에 (2대1) SMT를 켠다고 성능이 떨어지는 게임은 상대적으로 찾기 힘들게 되었다. #1( "라이젠 초기 논란 중에 같이 나왔다가 AMD측에서 사소한 코딩 문제로 쉽게 패치할 수 있다고 말한 적이 있지요. 지금 시점에서 HT끈다고 성능이 오르는 게임을 찾으려면 스텔라리스[11]처럼 싱글코어만 쓰는 수준인 게임들로 벤치해야 될 겁니다." 댓글 참고), #2
여기서는 인텔 8코어 이상 제품 + 램오버 상황에서 HT를 끈 쪽의 게임 성능이 가장 좋게 나왔다.
HT, SMT 자체는 끄기 싫다면 Process Lasso에서 해당 게임의 프로세스(exe 파일)만 SMT 금지로 해놓으면 하위 호환이긴 해도 비슷한 효과를 내준다(윈도우의 CPU 선호도 설정으로 0,2,4,...번 논리 코어만 지정하는 것과 똑같다. 단지 GUI로 사용하기 편한 프론트엔드일 뿐이다[12].)
4.3. 구현
실행 자원 | Intel NetBurst | Intel Nehalem |
AMD Bulldozer (CMT) |
AMD Zen | |
실행 상태 | duplicated | duplicated | duplicated | duplicated | |
분기예측 | shared | ? | shared | shared | |
ITLB | duplicated | tagged[13] | tagged | tagged | |
명령어 캐시 | - | shared | shared | shared | |
디코더 | shared | shared | shared | shared | |
마이크로옵 캐시 | shared | - | - | shared | |
마이크로옵 큐 | partitioned | ? | ? | partitioned | |
재정렬 버퍼 | partitioned | partitioned | duplicated | partitioned | |
실행 유닛 | 정수 | shared | shared | duplicated | shared |
부동소수점 | shared | ||||
로드 큐 | partitioned | partitioned | duplicated | tagged | |
스토어 큐 | partitioned | partitioned | duplicated | partitioned | |
DTLB | tagged | tagged | duplicated | tagged | |
데이터 캐시 | shared | shared | duplicated | shared |
- shared: 모든 스레드가 자원을 공유한다.
- tagged: 모든 스레드가 자원을 공유하되 필요상 스레드 구분을 위한 정보를 포함한다.
- partitioned: N개 스레드 실행 시 각 스레드에 자원을 1/N으로 나누어 할당한다.
- duplicated: 실행되는 스레드의 수와 무관하게 각 스레드에서 활용할 수 있는 자원은 동일하다.
4.4. 역사 및 사용 현황
4.4.1. 2000년대 이전
1950년대부터 등장한 멀티스레딩은 이후에 다양한 방식의 멀티스레딩이 등장했고, 그 중에 가장 진보된 방식인 SMT 개념은 1961년부터 1969년까지 진행했던 ACS(Advanced Computing Systems) 프로젝트를 통해 구현된 것이 시초로 알려져 있다.당시에는 SMT를 구현하려면 멀티 CPU밖에 없었으므로, 멀티 CPU가 필요한 슈퍼컴퓨터, 메인프레임, 고성능 워크스테이션에서는 이미 SMT를 활용하기 시작했다. 하지만 일반 가정용 PC에서는 멀티 CPU 시스템을 구하기엔 가격 문제부터 닥치게 되고, SMT를 활용한 운영체제와 응용 프로그램이 전무에 가까워서 여전히 싱글코어 싱글스레드라는 CPU로 일시적 멀티스레딩을 통해 멀티태스킹을 구현하는 정도에 그치고 있었다. 즉, 일반 사용자들에게는 듣보잡 내지는 딴 세상 이야기에 지나지 않았다.
4.4.2. 2000년대 이후
그러다가 2001년 인텔 개발자 포럼(IDF)에서 인텔이 2대1 SMT의 구현체이자 상표명인 '하이퍼스레딩(Hyper-Threading)'을 발표한 이후로, 이때부터 SMT는 사실상 다대일(Multi-Way) SMT라는 의미로 굳어졌다.서버용은 2002년 2월부터 투입된 Prestonia 기반의 제온 시리즈부터, 일반 가정용은 2002년 11월부터 투입된 펜티엄 4 HT 제품군에서 처음 사용되었다.[14] 출시 당시에는 최신 버전이었던 Windows XP에만 지원하는 바람에[15] 윈도우 XP의 보급율을 크게 늘렸지만 넷버스트 구조 때문에 효율은 그다지 좋지 못했다. 그래서 당시 농담으로 부르는 별명은 하이퍼쓰레기. 다만, 당시에도 멀티태스킹 상 이득은 분명하였기 때문에, 펜티엄 4 프레스캇이 애슬론 64를 상대로 나름 선전하던 분야도 있었다.
2001년 IBM의 POWER4, 2004년 썬 마이크로시스템즈의 UltraSPARC IV를 통해 멀티코어 프로세서가 등장했지만 일반 가정용으로 나오지 않아서 잘 알려지지 않았고, 2005년부터 일반 가정용에도 멀티코어 CPU가 출시되면서 대세가 되었다. 먼저 나온 펜티엄 4를 두 개 붙인 인텔 펜티엄D 시리즈에서는 사용되지 않았으나, 일명 펜티엄 XE라 불리는 익스트림 에디션은 펜티엄 D 코어에 하이퍼스레딩까지 지원되어 7세대 이전의 코어 i3 마냥 "2코어 4스레드"로 돌아가서 멀티태스킹 면에서는 애슬론 64 X2보다 우위에 있었다. 하지만 발열량은 넷버스트 마이크로아키텍처 기반 중에서도 문제의 프레스캇 기반이었으니 시궁창이었고, 2대1 SMT를 지원하지 않는 애슬론 64 X2와 실성능으로 비교하면 얄짤 없었다. 당시 AMD는 앞선 성능의 이득을 누리기 위해 듀얼코어 프리미엄을 포기하지 않았고, 동일 성능 제온 2 CPU 시스템을 기준으로 나름 싼 가격을 책정하는 등, 상대적으로 떨어지는 브랜드 파워와 시장 지배력을 생각하면 매우 쎈 가격을 유지했다. 심지어 PC용 듀얼코어 하위 라인이 워크스테이션용인 옵테론 160/165보다 비싸서 이들 옵테론 하위 라인 CPU를 사서 오버클럭하는 게 더 싸게 먹히던 시절도 있었다! 그래서 중저가형 PC에서 2쓰레드를 맛보려면 HT나 펜티엄D 805 같은거 밖에 선택지가 없는 상황이 꽤나 지속되었고 이는 싱글코어간 대결에서 인텔이 나름 이득이 있는 요소였다. 이후 2003년 P6 마이크로아키텍처 개량판 기반의 펜티엄M과 2006년 코어 시리즈, Sossaman 계열의 제온, 2006년 코어 마이크로아키텍처 기반의 코어2 시리즈와 제온에서는 하이퍼스레딩이 빠졌다.
2008년 본넬 마이크로아키텍처 기반의 아톰 시리즈와[16] 네할렘 마이크로아키텍처 이후의 코어 i 시리즈에서 다시 도입되면서 펜티엄 4 시절의 하이퍼스레딩보다 나아진 성능 효율을 보여준다. 6세대 코어 i 시리즈까지는 i3와 i7에만 사용되었다가 7세대부터는 펜티엄에도 사용, 8세대부터는 i3가 빠진 대신 4코어 4스레드로 상향되었으며, 9세대부터는 i7마저 빠진 대신 8코어로 상향되고 같은 8코어인 i9에서 도입되는 변화가 있었다.[17] 비록 논리 코어지만 과거의 오명을 벗을 만큼 성능 향상이 있다. 특히 4코어 지원 게임에서 2코어 4스레드인 i3와 2코어 2스레드인 펜티엄의 비교는 i3가 확실히 뛰어나다. i3 4130과 G3258을 4.5GHz로 오버클럭한 경우와 비교해 멀티 코어 지원 게임에서 G3258이 더 낮은 클럭의 i3에게 지는 것을 볼 수 있다. 단, 아톰 시리즈 한정으로 2013년 베이트레일부터는 설계 변경으로 하이퍼쓰레딩이 빠졌다.
다만, 펜티엄 4든 코어 i 시리즈든 하이퍼스레딩을 켜면 투입되는 작업량이 많아지고 하드웨어 자원 활용률도 높아지므로, 당연히 발열과 전력 소모가 증가한다. 위의 설명처럼 같은 시간에 더 많은 명령을 처리하므로 전력 소모량만 보면 개념은 다른 오버클럭과 마찬가지로 많아지는 셈. 풀로드 시 많게는 30~40W가량 더 소모한다.
2016년도까지 하이퍼스레딩의 최대 수혜자는 단연 가격 때문에 코어 수가 제한된 코어 i3 시리즈라 단언할 수 있다. 그 중에서도 CPU 하나당 성능이 낮은 샌디- 아이비브릿지 시스템이 가장 돋보인다. 프로그램이 코어 2개까지만 쓰는 상황에선 높은 IPC[18]빨로 AMD 6, 8코어들을 누르고, 멀티스레드를 잘 쓰는 프로그램에서도 듀얼코어 + 하이퍼스레딩의 가상 쿼드코어 효과로 나름 선방한다. 심지어 프로그램이 멀티스레드를 정말 잘 써서 순수 성능에선 AMD 8코어에게 밀리는 상황에서도 전성비 만큼은 항상 선방하는 편. 2016년 하반기에 모바일용 카비레이크 출시 후... 2017년 1월에 출시된 데스크탑용 제품군에도 하이퍼쓰레딩을 탑재한 펜티엄 3개가 나와 코어 i3가 위험에 처한 상황(본격 인텔의 i3 팀킬).
급기야는 AMD에서도 2011년부터 투입된 불도저 마이크로아키텍처에 도입되었던 부분적인 2대1 SMT 형태인 CMT(Clustered Multi-Thread) 구조를 버리고, 2017년 3월 초에 출시된 라이젠 시리즈 부터 전통적인 2대1 SMT 구조를 채용하면서 사실상 거의 모든 데스크탑 CPU에 적용되는 보편적인 기술이 되었다.
AMD의 밥캣, 재규어 등 모바일 CPU와 삼성의 몽구스 등 ARM CPU, 테슬라의 도조 등을 개발한 애릭 퀸넬 박사는 SMT가 CPU의 면적을 너무 많이 잡아먹어 차라리 좀더 간소화시킨 SMT 코어 두개가 나으며, 시끄러운 이웃 효과, 캐시 오염, CPU 게이트 사례와 같은 보안 문제를 단점으로 지적했으나 단순한 아키텍처에서 효율이 좋고 소프트웨어와 호환도 잘된다는 장점을 들면서 가난한자의 비순차적 실행이라고 칭했다. #
인텔, AMD뿐만 아니라 DEC도 여러 학자들과 함께 1990년대 후반부터 개발되어 2004년 출시를 목표로 했었던 Alpha 21464를 통해 인텔의 하이퍼스레딩보다 더 많은 4대1 SMT를 보여주었으나, Compaq이 DEC를 인수하고 그런 Compaq을 HP가 인수하면서 개발이 더 이상 진척되지 못 해 최종 완성되지 못 하고 드랍되었다. IBM도 2004년에 출시된 POWER5부터 2대1 SMT를, 썬 마이크로시스템즈도 2005년에 출시된 UltraSPARC T1을 통해 4대1 SMT를 도입했다. IBM은 여기서 그치지 않고 2014년에 출시된 POWER8 마이크로아키텍처부터는 무려 8대1 SMT까지 박아 넣기도 했다. x86 계열도 4대1 SMT를 박아넣은 제온 파이가 나오기도 했다.
물론 일반 가정용 CPU 시장에서 구현되는 정도는 2대1 SMT 뿐이다. 일반 가정용 PC에서 4대1 SMT 이상의 멀티코어 성능을 활용할 일이 잘 없기도 하고, 이런 CPU에도 물리 코어를 많이 박아넣을 수 있는 환경까지 되니 인텔은 코어 울트라 시리즈 2 부터는 좀비로드 취약점 해결, 전성비와 싱글코어 성능 증대를 위해 하이퍼스레딩 도입을 하지 않을 정도다.
4.5. 주의 사항
KVM을 제외한 가상머신에는 SMT를 뺀 코어 수로 카운트한다. 논리 코어를 인식하지 못하기 때문.2대1 SMT 기능을 BIOS/UEFI상에서 꺼놓은 상태로 Microsoft Windows를 설치한 경우 이를 다시 켜도 활성화되지 않는 경우가 있다. 4코어 8스레드 CPU 기준으로 장치관리자에는 8개 모두 제대로 뜨는데 시스템 정보나 작업 관리자에서 논리 프로세서가 코어 수와 같다면[19] 100%. 다행히 윈도우를 다른 컴퓨터로 옮길 때 사용하는 sysprep를 사용하면, 시스템 드라이버가 전부 다시 설치되기 때문에 이러한 현상은 해결된다.
5. 스마텔의 약자
국내 통신기업 Smartel, Smart Mobile Telecom 스마텔의 약자로 사용한다6. 진 여신전생 시리즈의 약자
Shin Megami Tensei의 약자로 사용한다.7. 관련 문서
[1]
즉, PCB의 구멍에 삽입하여 반대 패드를
납땜하는 방식의 실장 방법
[2]
일본 3사가 시장의 80퍼센트를 독점하고 있는 기술이다.
[3]
이런 특징 때문에 Interleaved 방식의 멀티스레딩이라고도 부른다.
[4]
크게는 어떤 스레드의 작업이 다 끝날 때까지의 걸리는 시간 단위부터 작게는 1사이클(1클럭)이라는 매우 세밀한 시간 단위까지 포함된다.
[5]
fetch + decode
[6]
decode된 명령어를 reservation state queue에 저장
[7]
소프트웨어인 OS 차원에서는 SMT가 없든 있든 모두 논리 스레드로 다룬다.
[8]
(2): 2 중, 1과 중복되지 않는 일부
[9]
한손, 양손 비유가 엄밀히 따지면 틀린 이유이기도 하다.
[10]
물론 2005년 당시 일반 가정에서 멀티코어이면서 2대1 SMT까지 둘 다 지원하는 CPU를 구하려면 CPU 하나만 100만원대까지 형성되어 있는 하이엔드 데스크탑 제품군인
펜티엄 XE 시리즈밖에 없었고, 50만원대 이내에 형성되는 일반 데스크탑 제품군에서는 2008년 코어 i7 시리즈가 되어서야 겨우 등장하게 되었지만 멀티 CPU가 아닌 싱글 CPU라는 점을 고려하면 그나마 살만한 가격대로 진입한 것에 의의있다고 볼 수 있다. 다시 말하지만 멀티코어 CPU 자체가 처음 나왔을 2001년 당시엔 일반 가정에서는 구하는게 거의 불가능에 가까웠던 시절이었다!
[11]
'전혀 없는 멀티코어 최적화와 렉 문제' 부분 참고
[12]
사실 최근일수록 트윅이나
최적화 프로그램 대부분의 실체가 이렇지만
[13]
Large Page ITLB는 duplicated
[14]
하이퍼스레딩을 지원하지 않는 펜티엄 4는 그냥 펜티엄 4 시리즈, 하이퍼스레딩을 지원하는 펜티엄 4는 펜티엄 4 HT 시리즈로 구분한다.
[15]
Windows 2000,
Windows Me 이전 버전에서는 하이퍼스레딩을 제대로 활용할 수 없다.
가상 머신에 올려서 쓴다고 해도 하이퍼스레딩이 있는
인텔 8세대(펜티엄, i7),
라이젠에서는 막힌다.
[16]
넷북,
넷탑에 사용됐던 아톰의 거의 대부분이 지원한다. 예외적으로 Z500/Z510 같은 초 저전력 프로세서는 전력 문제로 빼는 경우도 있다.
[17]
코어 i9 라인 자체는 2017년 HEDT CPU를 표방하는 코어-X 시리즈부터 처음 도입되었다.
[18]
한 클럭 당 명령어를 몇개를 수행할 수 있느냐를 나타내는 표준 수치로, 한마디로 클럭 대비 성능
[19]
4 코어 8 논리 프로세서로 떠야 하는데 4 코어 4 논리 프로세서로 뜨는 경우.