이번 포스팅에서는 하이퍼 스레딩과 제가 들었던 의문점들에 대한 답들에 대한 내용으로 이루어져 있습니다.
cpu 코어는 cpu에서 실질적인 연산을 수행하고 명령어를 처리하는 독립적인 처리장치를 말합니다. 과거에는 cpu 그 자체가 하나의 코어(싱글코어) 였지만, 현재의 거의 대부분의 cpu는 코어를 여러개 탑재한 멀티코어 cpu입니다.
스레드는 프로세스 내부의 작은 실행 단위입니다.
각 스레드는 운영체제로부터 cpu core 자원을 얻어 프로세스를 실행합니다.
위 정리에 따르면 core는 명령을 수행하는 독립적인 처리 장치이고, 스레드가 실행되기 위해선 그 코어를 점유해야 하므로 cpu가 한번에 실행할 수 있는 스레드의 개수는 코어의 개수와 같습니다.
하이퍼 스레딩은 한개의 core가 두개의 thread를 실행할 수 있도록 하는 cpu 기술입니다. 다른 말로는 물리적 코어를 두개의 논리적 코어로 나누어 활용하는 기술입니다. intel에서 개발되었고, AMD의 Simultaneous Multithreading (SMT) 도 같은 개념의 기술입니다.
cpu의 연산능력은 각 core의 수만큼 제한적일텐데 스레드를 늘린다고 해서 성능이 늘어날까?
2코어 CPU라고 했을때 hyper-threading이 없다면

이러한 실행 방식을 가질것이고 hyper-threading을 적용하면

이렇게 오히려 cpu thread가 cpu core를 점유하기 위한 2차 경쟁을 하게 될텐데 그렇게 된다면 결국은 이전 방식과 다를게 없다는 생각이 들었습니다.

위 사진은 당시의 제 머릿속 생각을 그대로 보여주는 사진입니다. 그래서 검색을 시작했고, 곧 답을 알 수 있었습니다. 사실은 두 스레드가 한번의 cpu 클럭동안 동시에 실행될수 있었습니다. 예를 들어 보겠습니다. CPU에는 대표적으로 정수의 연산을 담당하는 ALU, 부동소수점의 연산을 담당하는 FPU가 있습니다. 그리고 만약 thread 1은 ALU를, thread 2는 FPU를 요구한다면 동시에 이를 실행할 수 있도록 한것이 hyper-threading입니다. 또한 메모리, 하드등 다른 자원을 대기하는 동안 발생하는 유휴시간동안 다른 스레드를 처리할 수 있도록 만들어져 있어 더욱 성능이 향상됩니다.
저런 방식을 사용하면 스레드간의 context switching이 너무 자주 일어나서 성능이 오히려 저하되지 않을까?
hyper-threading은 context switching을 방지합니다.
전통적인 멀티 스레딩 방식은 한 스레드의 연산이 끝나면, 다음 스레드의 연산을 위해 이전 스레드의 정보를 백업하고 새 스레드의 정보를 가져오는 context switching이 일어나지만,
hyper-threading을 지원하는 CPU에서는 cpu core 자체에서 두개의 컨텍스트를 제공하여, context switching 없이 각 스레드의 명령어를 번갈아가며 실행 할 수 있습니다.
최근에 나온 intel의 core ultra 시리즈에서는 hyper-threading없이 1코어=1스레드 방식을 채택하여 전성비와 취약점을 한번에 잡으려 하였습니다. 또한 빅 리틀 구조로 효율코어와 성능 코어를 구분했고, 이것으로 hyper-threading을 대체하려고 하였습니다. 결과적으론 충분한 전성비 향상을 이뤄 노트북용 cpu를 제공하는 데에는 문제가 없었지만, 성능이 다소 떨어져 데스크탑 cpu 시장에서 amd에 크게 밀리는 양상을 보여주었습니다.