두 개의 스레드, 하나의 코어: 동시 멀티스레딩의 작동 원리
배경 및 동기
-
SMT 도입 배경: 프로세서 자원 활용도를 높이기 위해 도입됨. 프로세서에는 수백 개의 레지스터, 여러 로드/스토어 유닛 및 산술 유닛이 있음. 이를 더 잘 활용하기 위해 명령어 수준 병렬 처리(ILP) 기술 사용.
-
명령어 파이프라이닝: 명령어 실행을 여러 단계로 나누어 각 사이클마다 새로운 명령어를 추가 처리. 파이프라인 깊이가 깊을수록 더 많은 명령어를 병렬로 처리 가능.
-
슈퍼스칼라 아키텍처: 각 사이클마다 여러 명령어를 발행할 수 있음. 예를 들어, 최신 Intel Core i7 프로세서는 각 사이클마다 4개의 명령어를 발행할 수 있음.
-
수평 및 수직 낭비: 독립적인 명령어를 충분히 찾지 못할 때 발생하는 자원 낭비. 수평 낭비는 프로세서가 충분한 독립 명령어를 찾지 못할 때 발생하고, 수직 낭비는 모든 명령어가 현재 실행 중인 명령어에 의존할 때 발생함.
Intel 프로세서의 SMT 구현
-
아키텍처 상태 복제: 두 개의 스레드를 동시에 실행하기 위해 프로세서의 아키텍처 상태를 복제. 이를 통해 하나의 물리적 프로세서가 운영 체제에 두 개의 논리적 프로세서로 나타남.
-
자원 공유 및 복제: 일부 자원은 복제되고, 일부는 공유됨. 복제 여부는 전력 소비 및 칩의 실제 공간 등 여러 요인에 따라 결정됨.
프로세서 마이크로아키텍처
-
프론트엔드, 백엔드, 리타이어먼트 유닛: 프로세서 마이크로아키텍처는 세 부분으로 나뉨. 프론트엔드는 명령어를 가져오고 디코딩하며, 백엔드는 실행 자원을 할당하고 명령어를 실행함. 리타이어먼트 유닛은 실행된 명령어의 결과를 아키텍처 상태에 커밋함.
SMT 구현 세부 사항
-
프론트엔드: 명령어 포인터, 트레이스 캐시, ITLB 캐시, uop 큐 등 여러 구성 요소로 이루어짐. 각 구성 요소는 두 개의 논리적 프로세서를 지원하기 위해 복제되거나 공유됨.
-
백엔드: 자원 할당기, 레지스터 리네이밍, 명령어 준비 큐, 명령어 스케줄러 등으로 구성됨. 자원 할당기는 각 사이클마다 논리적 프로세서 간에 전환됨.
-
리타이어먼트 유닛: 명령어가 아키텍처 상태에 커밋될 준비가 되면 이를 추적하고 올바른 순서로 커밋함.
메모리 서브시스템
-
TLB: 가상 주소를 물리 주소로 변환하는 작은 캐시. 두 논리적 프로세서 간에 동적으로 공유됨.
-
L1, L2, L3 캐시: 각 CPU 코어는 자체 L1 캐시를 가짐. L2 캐시는 마이크로아키텍처에 따라 다를 수 있으며, L3 캐시는 코어 간에 공유됨.
SMT의 성능 영향
-
단일 스레드 실행: SMT가 활성화된 코어에서 단일 스레드를 실행할 때 자원이 공유되므로 성능이 저하될 수 있음.
-
두 개의 스레드 실행: 캐시 접근 패턴에 따라 성능이 달라질 수 있음. 협력적인 스레드는 성능을 향상시킬 수 있지만, 경쟁적인 스레드는 성능을 저하시킬 수 있음.
-
보안 취약점: 최근 몇 년간 SMT와 관련된 보안 문제가 발견됨. 자원 공유와 명령어의 추측 실행으로 인해 민감한 데이터가 유출될 가능성이 있음.
결론
-
SMT 사용 여부 결정: SMT는 CPU 자원 활용도를 높이고 명령어 처리량을 증가시키기 위해 설계되었지만, 성능 및 보안 측면에서 trade-off가 있음. 워크로드에 따라 SMT를 사용할지 여부를 결정하는 것이 중요함.
GN⁺의 정리
-
SMT의 이해: SMT는 CPU 자원 활용도를 높이고 명령어 처리량을 증가시키기 위해 설계됨.
-
성능 및 보안: SMT는 성능 향상에 도움이 될 수 있지만, 자원 경쟁 및 보안 취약점으로 인해 성능 저하 및 보안 문제가 발생할 수 있음.
-
사용 여부 결정: 워크로드에 따라 SMT를 사용할지 여부를 신중하게 결정해야 함. 고성능이 필요한 경우 SMT를 비활성화하는 것이 좋음.
-
관련 프로젝트: AMD의 SMT 구현 및 ARM 프로세서의 SMT 성능 분석 프로젝트도 참고할 만함.