동시 멀티스레딩

동시 멀티스레딩(Simultaneous multithreading, SMT)은 하드웨어 멀티스레딩을 지원하는 슈퍼스칼라 CPU의 전반적인 효율성을 개선하기 위한 기술이다. SMT는 하나의 실행에 여러 개의 독립 스레드를 허용함으로써 현대의 프로세서 아키텍처가 제공하는 자원을 더 잘 활용할 수 있다. 멀티스레딩은 선점형 멀티태스킹과 개념이 비슷하지만, 현대의 슈퍼스칼라 프로세서에서 스레드 수준의 실행 단계로 제공된다. 동시 멀티 스레딩, 곧 SMT는 두 개의 주요 멀티스레딩 기능 가운데 하나이다. 나머지 하나는 시간적 멀티스레딩(temporal multithreading)이며 이것은 특정 시간대에 제공된 파이프라인 단계에서 여러 명령어를 지닌 하나의 스레드만 실행할 수 있다. 동시 멀티스레딩에서는 하나 이상의 스레드로부터의 명령어들을 특정 시간대에 제공된 파이프라인 단계에서 실행할 수 있다. 이는 기본 프로세서 구조에 큰 변화를 주지 않아도 이용할 수 있다.: 특별히 요구되는 것으로는 한 사이클 안에서 여러 스레드로부터 명령어를 호출할 수 있는 능력과, 여러 개의 스레드로부터 온 데이터를 보유할 수 있는 더 큰 레지스터 파일이 있다. 동시 스레드의 수는 칩 설계자가 결정하지만 칩이 복잡한 까닭으로 현실적으로는 대부분의 SMT에서 최대 두 개까지로 제한을 받는다. 그러나 울트라스팍 T2(UltraSPARC T2)와 같은 경우 많으면 8개의 스레드를 코어 하나에서 처리할 수 있는 것이 있기는 하다. 이 기술이 효율성을 위한 해결책인데다가 공유 자원 상에 충돌이 일어나는 정도가 심하다 보니 이러한 해결책에 대한 효력을 측정하거나 이를 준수하는 것이 쉽지는 않을 수 있다. 어떠한 연구가들은 특별한 스레드를 사용하여 캐시와 같은 공유 자원을 적극 공급할 수 있으며 여기에서 다른 단일 스레드의 성능을 높일 수 있다는 사실을 입증하였다. 또, 이러한 사실을 통하여 SMT는 효율성을 위한 해결책 이상의 효과가 있다고 주장하고 있다. SMT를 사용하여 어느 정도 수준의 오류 감지 및 복구를 위한 번거로운 계산을 제공할 수 있다. 그러나 현재 대부분의 경우 SMT는 메모리 레이턴시를 보이지 않게 하고, 효율성을 높이며, 사용되는 하드웨어의 양마다 계산 처리량을 늘리는 데에 와 있다. 프로세서 설계에서 자원을 거의 요구하지 않게 하면서 칩 상의 병렬화를 높이는 방법이 두 가지 있다. 하나는 슈퍼스칼라 기술로 ILP(명령어 수준 병렬화)를 높이게 하는 것이고 다른 하나는 멀티스레딩 접근으로 TLP(스레드 수준 병렬화)를 활용하는 것이다. 슈퍼스칼라는 칩 수준 멀티스레딩(CMT)이 하나의 프로세서에 위치한 여러 개의 스레드로부터 명령어를 실행하는 동안 여러 개의 명령어를 한꺼번에 실행하는 것을 뜻한다. 칩 안에서 하나 이상의 스레드를 지원하는 방법에는 여러가지가 있다. 인터리빙 멀티스레딩: 각기 다른 스레드로부터 여러 개의 명령어를 인터리빙으로 처리하여 만들어내며 이를 시간적 멀티스레딩이라고도 한다. 그 다음에는 세밀한 멀티스레딩이나 세밀하지 않은 멀티스레딩으로 나뉘며 이는 인터리빙을 만들어내는 주기에 따라 달라진다. 곧 배럴 프로세서에서와 같은 세밀(fine-grain)한 멀티스레딩은 모든 사이클이 끝난 뒤에 여러 개의 스레드를 위한 명령어를 만들어내지만 세밀하지 않은(coarse-grain) 멀티스레딩은 현재 실행 중인 스레드가 조금 긴 레이턴시 이벤트(페이지 실패 등)를 일으키면 다른 스레드로부터 명령어를 만들어내도록 전환하기만 한다. 세밀하지 않은 멀티스레딩은 스레드 간에서 덜 문맥 교환적인 환경에 더 일반적이다. 이를테면 인텔의 몬테시토 프로세서는 세밀하지 않은 멀티스레딩을 이용하지만 썬의 울트라스팍 T1은 세밀한 멀티스레딩을 이용한다. 이러한 프로세서에는 하나의 코어에 하나의 파이프라인만 있으며, 사이클마다 많으면 하나의 명령어만 만들어낼 수 있기 때문에 인터리빙 멀티스레딩만 사용할 수 있다. 동시 멀티스레딩(SMT): 사이클 하나의 여러 개의 스레드로부터 여러 개의 명령어를 만들어낸다. 이때 프로세서는 슈퍼스칼라여야 한다. 칩 수준 멀티스레딩(CMP, 멀티코어): 두 대 이상의 프로세서가 한 칩에 내장되어 있으며 각각은 스레드를 독립적으로 실행한다. 멀티스레딩/SMT/CMP를 합친 어떠한 것 이들을 구별하는 주 요인은 사이클 하나에 얼마나 많은 명령어를 프로세서가 만들어낼 수 있는지를, 또 명령어들로부터 얼마나 많은 스레드가 나오는지를 살펴보는 것이다. 이를테면 썬 마이크로시스템즈의 울트라스팍 T1(2005년 12월 14일까지는 나이아가라-Niagara-로 알려져 있었음)은 각 코어가 한 번에 하나의 명령어만 만들어낼 수 있었으므로 동시 멀티스레딩이 아닌 세밀한 멀티스레딩 기술을 갖춘 멀티코어 프로세서이다. 멀티스레딩 CPU는 1950년대 이후부터 나왔지만 IBM은 1968년에 처음으로 동시 멀티스레딩을 연구하였다. SMT를 채용한 최초의 상용 마이크로프로세서는 알파 21464 (EV8)였다. 이 마이크로프로세서는 캘리포니아 대학교 샌디에이고의 딘 툴센(Dean Tullsen), 워싱턴 주립대의 행크 레비(Hank Levy)와 수잔 에거스(Susan Eggers)와 협력하여 DEC가 개발하였다. 이 마이크로프로세서는 HP가 DEC를 인수한 컴팩을 인수하기 직전에 알파 계열의 마이크로프로세서가 단종된 뒤로 출시된 적이 없다. 딘 툴센의 작품은 노스우드(Northwood)와 프레스캇(Prescott)과 같은 하이퍼스레딩(HTT) 버전의 인텔 펜티엄 4 마이크로프로세서를 개발하는 데에도 사용되었다. 인텔 펜티엄 4는 2002년에 3.06 GHz 모델을 기점으로 출시된 동시 멀티스레딩을 채용한 최초의 현대 데스크톱 프로세서였으며 그 뒤로도 그들의 수많은 프로세서에 도입되었다. 인텔은 이 기술을 하이퍼스레딩 기술(HTT)로 불렀으며 두 개의 스레드가 기본인 SMT 엔진을 제공한다. 인텔은 SMT를 채용하지 않은 펜티엄 4와 동일한 기준에 비해 최대 30%의 성능 향상이 있다고 주장한다. 성능 향상은 응용 프로그램에 따라 매우 큰 차를 보이지만 어떠한 프로그램은 도리어 HTT가 켜져 있을 때 대역, 캐시, 변환 색인 버퍼. 재정렬 버퍼 엔트리와 같은 자원에 크게 집중한다면 속도가 느려지기도 한다. 이는 일반적으로 잘 작성되지 않은 데이터 접근 루틴에서 비롯하며 이 경우 멀티프로세서 시스템에서 높은 레이턴시의 캐시 간 트랜잭션(캐시 트래싱-cache trashing)이 일어난다. 멀티프로세서, 멀티코어 설계가 만연하기 전에 작성한 프로그램들은 단일 CPU 시스템이 하나의 캐시에 스스로 늘 일관적이었기 때문에 일반적으로 캐시 접근을 최적화하지 못하였다. 멀티코어 시스템에서 각 CPU나 코어는 일반적으로 저만의 캐시를 갖추고 있으며 시스템 상의 다른 CPU/코어의 캐시와 상호 연결함으로써 캐시 일관성을 유지한다. 스레드 A가 메모리 위치 [00]에 접근하고 스레드 B가 메모리 위치 [01]에 접근한다면 특히 현대의 모든 프로세서 기준에서 캐시 라인이 2바이트를 넘어서는 곳에서 캐시 간 트랜잭션이 일어난다. 최신 MIPS 아키텍처 설계에는 MIPS MT라는 SMT 시스템을 갖추고 있다. MIPS MT는 무거운 가상 처리 요소와 가벼운 하드웨어 마이크로스레드를 위하여 제공된다. RMI(쿠퍼티노 기반 시작)는 8개의 코어 기반 프로세서 SOC를 제공하는 최초의 MIPS 업체이다. 이 스레드는 각기 다른 스레드가 각 사이클에서 실행할 수 있는 세밀한 모드에서 실행할 수 있다. 이러한 스레드에는 우선 순위를 할당할 수 있다. 2004년 5월에 발표한 IBM 파워5는 듀얼 코어 DCM, 쿼드 코어, 옥타 코어 MCM으로 출시되었으며 각 코어에는 두 개의 스레드 SMT 엔진을 포함하고 있다. IBM이 추가한 이 기능은 이전의 것보다 더 복잡한데, 이를테면 다양한 스레드에 여러 우선 순위를 매길 수 있으며 더 세밀할뿐 아니라 SMT 엔진을 유동적으로 켜고 끌 수 있어서 SMT 프로세서가 성능을 높이지 못할만한 곳에서 작업량을 더 잘 처리할 수 있게 되었다. 많은 사람들이 썬 마이크로시스템즈의 울트라스팍 T1(나이아가라)와 후속 프로세서 코드이름 록(~2009년)을 거의 전적으로 SMT와 CMP 기술을 이용하는 데 초점을 둔 SPARC의 기능으로 이야기하지만, 나이아가라는 실제로 SMT를 이용하고 있지는 않다. 썬은 이러한 복합적인 접근을 CMT로, 전반적인 개념을 "스루풋 컴퓨팅"(Throughput Computing, 처리량 계산)으로 부르고 있다. 나이아가라에는 8개의 코어가 있지만 각 코어에는 하나의 파이프라인만 있으므로 세밀한 멀티스레딩을 사용한다. 여러 개의 스레드로부터의 명령어가 사이클마다 이슈 윈도(issue window)를 공유하는 SMT와는 달리, 프로세서는 순환 순서 방식을 사용하여 사이클마다 사용 중인 다음 스레드로부터의 명령어를 만들어낸다. 이러한 양상은 배럴 프로세서와 매우 비슷하다. 썬 마이크로시스템즈의 록 프로세서는 이와는 다르며 하나 이상의 파이프라인을 갖춘 더 복잡한 코어를 갖추고 있다. 2008년에 출시한 인텔 아톰은 명령어 재정렬, 추론적 실행(speculative execution), 레지스터 이름 변경을 지원하지 않는, SMT(하이퍼스레딩으로 광고)를 채용한 최초의 인텔 제품이다. 인텔은 SMT를 코어 마이크로아키텍처부터 없앤 뒤로 네할렘 마이크로아키텍처에 하이퍼스레딩을 다시 도입하였다. 동시 멀티스레딩은 어느 공유 자원 가운데 하나라도 성능 상 병목 현상이 있다면 성능을 높일 수 없다. 사실 어떠한 응용 프로그램들은 동시 멀티스레딩을 사용할 때 더 느리게 동작한다. 소프트웨어 개발자들이 동시 멀티스레딩을 그들이 개발하는 응용 프로그램에 사용하는 것이 좋은지 나쁜지를 여러 환경에서 시험하고 성능 하락이 있으면 멀티스레딩을 사용하지 않게 하도록 하는 특별한 논리를 삽입하여야 하는 것에 상당한 부담을 느낀다는 비평이 있다. 현재 쓰이는 운영 체제는 이러한 목적을 위한 것이나 여러 우선 순위에 있는 프로세스가 다른 데에서 자원을 탈취하지 못하게 하기 위한 편리한 API가 충분하지 않다. 동시 멀티스레딩에는 보안 문제도 있다. 캐시의 쓰임을 지켜보면서 특정 프로그램이 같은 프로세서에서 실행 중인 보안 암호 키를 탈취할 수 있다는 것이 입증되었다. 멀티스레딩 스레드 대칭형 다중 처리 http://www.theregister.co.uk/2007/12/14/sun_rock_delays/ How good is hyperthreading? (하이퍼스레딩이 얼마나 좋은가?) Hyper-Threading Considered Harmful (하이퍼스레딩은 해로운 것으로 생각된다) LE Shar and ES Davidson, "A Multiminiprocessor System Implemented through Pipelining", Computer Feb 1974 D.M. Tullsen, S.J. Eggers, and H.M. Levy, "Simultaneous Multithreading: Maximizing On-Chip Parallelism," In 22nd Annual International Symposium on Computer Architecture, June, 1995 D.M. Tullsen, S.J. Eggers, J.S. Emer, H.M. Levy, J.L. Lo, and R.L. Stamm, "Exploiting Choice: Instruction Fetch and Issue on an Implementable Simultaneous Multithreading Processor," In 23rd Annual International Symposium on Computer Architecture, May, 1996 SMT 뉴스 기사 및 학술 논문 워싱턴 대학교의 SMT 연구 멀티스레딩 기술사