멀티스레딩

컴퓨터 구조에서 멀티스레딩(multithreading)은 중앙 처리 장치(CPU)(또는 멀티 코어 프로세서의 단일 코어)가 여러 개의 실행 스레드를 제공할 수 있는 능력이다.
개요
[편집]멀티스레딩 패러다임은 1990년대 후반 이후 명령어 수준 병렬성을 추가로 활용하려는 노력이 정체되면서 더욱 인기를 얻었다. 이를 통해 트랜잭션 처리와 같은 보다 전문화된 분야에서 스루풋 컴퓨팅의 개념이 다시 부상할 수 있었다. 단일 스레드나 단일 프로그램을 더 빠르게 만드는 것은 매우 어렵지만, 대부분의 컴퓨터 시스템은 실제로 여러 스레드나 프로그램 간에 다중작업을 수행한다. 따라서 모든 작업의 처리량을 향상시키는 기술은 전체적인 성능 향상으로 이어진다.
스루풋 컴퓨팅을 위한 두 가지 주요 기술은 멀티스레딩과 다중 처리이다.
장점
[편집]스레드가 캐시 미스를 많이 일으키는 경우, 다른 스레드들이 사용되지 않는 컴퓨팅 자원을 계속 활용할 수 있으며, 이는 단일 스레드만 실행되었을 때 유휴 상태였을 자원들을 활용함으로써 전체적인 실행 속도를 높일 수 있다. 또한, 스레드가 (명령어가 서로의 결과에 의존하기 때문에) CPU의 모든 컴퓨팅 자원을 사용할 수 없는 경우, 다른 스레드를 실행하면 이러한 자원이 유휴 상태가 되는 것을 방지할 수 있다.
단점
[편집]여러 스레드는 캐시나 변환 색인 버퍼(TLB)와 같은 하드웨어 자원을 공유할 때 서로 간섭할 수 있다. 그 결과, 단일 스레드의 실행 시간은 개선되지 않으며, 스레드 전환 하드웨어를 수용하는 데 필요한 더 낮은 주파수나 추가적인 파이프라인 단계로 인해 단일 스레드만 실행될 때조차 성능이 저하될 수 있다.
전반적인 효율성은 다양하다. 인텔은 하이퍼스레딩 기술을 통해 최대 30%의 성능 향상이 가능하다고 주장하며,[1] 최적화되지 않은 부동소수점 연산 루프를 수행하는 합성 프로그램은 병렬로 실행될 때 실제로 100%의 속도 향상을 얻기도 한다. 반면, MMX나 AltiVec 확장을 사용하고 데이터 프리페치를 수행하는(좋은 비디오 인코더가 그럴 수 있듯이) 수작업 어셈블리어 프로그램은 캐시 미스나 유휴 컴퓨팅 자원으로 인한 피해를 입지 않는다. 따라서 이러한 프로그램은 하드웨어 멀티스레딩의 이점을 얻지 못하며, 오히려 공유 자원에 대한 경합으로 인해 성능이 저하될 수 있다.
소프트웨어 관점에서 볼 때, 하드웨어 멀티스레딩 지원은 소프트웨어에 더 가시적으로 나타나며, 다중 처리보다 애플리케이션 프로그램과 운영체제 모두에 더 많은 변경을 요구한다. 멀티스레딩을 지원하기 위해 사용되는 하드웨어 기술은 종종 다중작업을 위해 사용되는 소프트웨어 기술과 병행된다. 스레드 스케줄링 또한 멀티스레딩의 주요 문제이다.
두 프로세스의 데이터를 병합하는 것은 프로세스 간 통신 및 동기화와 같은 오버헤드로 인해 동일한 데이터를 단일 스레드에서 처리하는 것보다 종종 두 자릿수 이상 훨씬 더 높은 비용을 초래할 수 있다.[2][3][4]
유형
[편집]가장 단순한 유형의 멀티스레딩은 하나의 스레드가 긴 지연 시간을 유발하는 이벤트에 의해 차단될 때까지 실행되는 경우에 발생한다. 이러한 지연은 칩 외부 메모리에 접근해야 하는 캐시 미스일 수 있으며, 데이터가 돌아오는 데 수백 번의 CPU 사이클이 걸릴 수 있다. 지연이 해결될 때까지 기다리는 대신, 스레드화된 프로세서는 실행 준비가 된 다른 스레드로 실행을 전환한다. 이전 스레드에 대한 데이터가 도착했을 때에만, 이전 스레드가 다시 실행 준비가 된 스레드 목록에 배치된다.
예를 들어:
- 사이클 i: 스레드 A의 명령어 j가 발행됨.
- 사이클 i + 1: 스레드 A의 명령어 j + 1이 발행됨.
- 사이클 i + 2: 스레드 A의 명령어 j + 2가 발행되며, 이는 모든 캐시에서 미스가 발생하는 로드 명령어임.
- 사이클 i + 3: 스레드 스케줄러가 호출되어 스레드 B로 전환함.
- 사이클 i + 4: 스레드 B의 명령어 k가 발행됨.
- 사이클 i + 5: 스레드 B의 명령어 k + 1이 발행됨.
개념적으로 이것은 실시간 운영체제에서 사용되는 협력적 다중작업과 유사하며, 여기서 작업은 무언가를 기다려야 할 때 자발적으로 실행 시간을 포기한다. 이러한 유형의 멀티스레딩을 블록, 협력적 또는 거친 알갱이(coarse-grained) 멀티스레딩이라고 한다.
멀티스레딩 하드웨어 지원의 목표는 차단된 스레드와 실행 준비가 된 다른 스레드 간의 빠른 전환을 허용하는 것이다. 한 스레드에서 다른 스레드로 전환한다는 것은 하드웨어가 하나의 레지스터 세트를 사용하다가 다른 세트로 전환함을 의미한다. 이 목표를 달성하기 위해 프로그램이 볼 수 있는 레지스터와 일부 프로세서 제어 레지스터(프로그램 카운터 등)를 위한 하드웨어가 복제된다. 예를 들어, 두 스레드 간에 빠르게 전환하기 위해 프로세서는 두 개의 레지스터 세트로 구축된다.
추가적인 멀티스레딩 하드웨어 지원을 통해 스레드 전환을 1 CPU 사이클 내에 수행할 수 있게 하여 성능 향상을 가져온다. 또한, 추가 하드웨어를 사용하면 각 스레드는 마치 혼자 실행되는 것처럼 동작하며 다른 스레드와 하드웨어 자원을 공유하지 않는 것처럼 보일 수 있어, 멀티스레딩을 지원하기 위해 애플리케이션 및 운영체제 내에서 필요한 소프트웨어 변경 사항을 최소화한다.
많은 마이크로컨트롤러 및 임베디드 프로세서 제품군은 인터럽트를 위해 빠른 문맥 교환을 허용하는 여러 레지스터 뱅크를 가지고 있다. 이러한 방식은 사용자 프로그램 스레드와 인터럽트 스레드 간의 블록 멀티스레딩 유형으로 간주할 수 있다.
미세 알갱이(Fine-grained) 멀티스레딩
[편집]미세 알갱이(Fine-grained) 멀티스레딩의 목적은 실행 파이프라인에서 모든 데이터 의존성 지연을 제거하는 것이다. 한 스레드는 다른 스레드와 비교적 독립적이기 때문에, 파이프라인의 한 명령어가 파이프라인 내의 이전 명령어로부터의 출력을 필요로 할 가능성이 적다. 개념적으로 이것은 운영체제에서 사용되는 선점형 다중작업과 유사하며, 각 활성 스레드에 제공되는 타임 슬라이스가 1 CPU 사이클이라는 비유를 들 수 있다.
예를 들어:
- 사이클 i + 1: 스레드 B의 명령어가 발행됨.
- 사이클 i + 2: 스레드 C의 명령어가 발행됨.
이러한 유형의 멀티스레딩은 처음에 배럴 프로세싱(barrel processing)이라 불렸는데, 여기서 배럴의 스테이브는 파이프라인 단계와 실행 중인 스레드를 나타낸다. 인터리브(Interleaved), 선점형, 미세 알갱이 또는 시간 슬라이스 멀티스레딩은 더 현대적인 용어이다.
블록 유형의 멀티스레딩에서 논의된 하드웨어 비용 외에도, 인터리브 멀티스레딩은 각 파이프라인 단계가 처리 중인 명령어의 스레드 ID를 추적해야 하는 추가 비용이 있다. 또한 파이프라인에서 더 많은 스레드가 동시에 실행되므로, 서로 다른 스레드 간의 스래싱(thrashing)을 방지하기 위해 캐시와 TLB와 같은 공유 자원을 더 크게 만들어야 한다.
동시 멀티스레딩
[편집]가장 발전된 유형의 멀티스레딩은 슈퍼스칼라 프로세서에 적용된다. 일반적인 슈퍼스칼라 프로세서가 매 CPU 사이클마다 단일 스레드에서 여러 명령어를 발행하는 반면, 동시 멀티스레딩(SMT)에서는 슈퍼스칼라 프로세서가 매 CPU 사이클마다 여러 스레드에서 명령어를 발행할 수 있다. 단일 스레드에는 명령어 수준 병렬성의 양이 제한되어 있다는 점을 인식하여, 이 유형의 멀티스레딩은 미사용 발행 슬롯과 관련된 낭비를 줄이기 위해 여러 스레드에 걸쳐 가용한 병렬성을 활용하려고 시도한다.
예를 들어:
- 사이클 i: 스레드 A의 명령어 j와 j + 1, 스레드 B의 명령어 k가 동시에 발행됨.
- 사이클 i + 1: 스레드 A의 명령어 j + 2, 스레드 B의 명령어 k + 1, 스레드 C의 명령어 m이 모두 동시에 발행됨.
- 사이클 i + 2: 스레드 A의 명령어 j + 3, 스레드 C의 명령어 m + 1과 m + 2가 모두 동시에 발행됨.
다른 유형의 멀티스레딩과 SMT를 구분하기 위해, "시간적 멀티스레딩"이라는 용어는 한 번에 한 스레드의 명령어만 발행할 수 있는 경우를 나타내는 데 사용된다.
인터리브 멀티스레딩에서 논의된 하드웨어 비용 외에도, SMT는 각 파이프라인 단계가 처리 중인 각 명령어의 스레드 ID를 추적해야 하는 추가 비용이 있다. 다시 말하지만, 캐시 및 TLB와 같은 공유 자원은 처리되는 많은 수의 활성 스레드를 위해 크기가 조정되어야 한다.
구현 사례로는 DEC(이후 컴팩)의 EV8(완성되지 않음), 인텔 하이퍼스레딩, IBM POWER5/POWER6/POWER7/파워8/POWER9, IBM z13/z14/z15, 썬 마이크로시스템즈 울트라스팍 T2, 크레이 (기업) XMT, 그리고 AMD 불도저 및 젠 마이크로아키텍처가 있다.
구현 세부 사항
[편집]주요 연구 분야는 실행 준비가 된 스레드 목록 중에서 다음에 실행할 스레드를 빠르게 선택하고, 실행 준비가 된 스레드와 지연된 스레드 목록을 유지하는 스레드 스케줄러이다. 중요한 하위 주제는 스케줄러가 사용할 수 있는 다양한 스레드 우선순위 체계이다. 스레드 스케줄러는 소프트웨어로 전적으로 구현되거나, 전적으로 하드웨어로 구현되거나, 혹은 하드웨어와 소프트웨어 조합으로 구현될 수 있다.
또 다른 연구 분야는 캐시 미스, 스레드 간 통신, DMA 완료 등 어떤 유형의 이벤트가 스레드 전환을 야기해야 하는가이다.
멀티스레딩 방식이 권한 있는 제어 레지스터와 TLB를 포함하여 소프트웨어가 볼 수 있는 모든 상태를 복제한다면, 이는 각 스레드에 대해 가상 머신을 생성할 수 있게 한다. 이를 통해 각 스레드는 동일한 프로세서에서 자체 운영체제를 실행할 수 있다. 반면, 사용자 모드 상태만 저장된다면 하드웨어가 덜 필요하게 되며, 이는 동일한 다이 면적이나 비용으로 한 번에 더 많은 스레드를 활성화할 수 있게 해준다.
같이 보기
[편집]각주
[편집]- ↑ “Intel Hyper-Threading Technology, Technical User's Guide” (PDF). 13쪽. 2010년 8월 21일에 원본 문서 (PDF)에서 보존된 문서.
- ↑ Silberschatz, Abraham; Galvin, Peter B.; Gagne, Greg (2008년 7월 29일). 《Operating System Concepts》. Wiley. ISBN 978-0470128725.
- ↑ 《Computer Organization and Design MIPS Edition: The Hardware/Software Interface (The Morgan Kaufmann Series in Computer Architecture and Design)》. Morgan Kaufmann. 2013. ISBN 978-0124077263.
- ↑ 《Parallel Programming: Techniques and Applications Using Networked Workstations and Parallel Computers》. Pearson. 2005. ISBN 978-0131405639.