1

하이퍼 스레딩을 이해하는 데 어려움을 겪고 있습니다. 논리 코어가 실제로 존재하지 않는다면, 하이퍼 스레딩을 사용하는 요점은 무엇입니까?하이퍼 스레드 프로세서 코어가 정확히 동시에 두 개의 스레드를 실행할 수 있습니까?

실제 존재하는 각 프로세서 코어의 경우 운영 체제는 두 개의 가상 (논리적) 코어 주소를 지정하고 가능한 경우 이들 사이에서 작업 부하를 공유합니다.

두 개의 논리 코어는 하이퍼 스레딩이 얼마나 다른가 실행이 말했다되고 있음을, 내가 이해하지 못하는 동안 스레드 중 하나가 보류 될 것입니다 의미 동일한 실행 유닛을 공유하는 경우 실제로 새로운 실행 유닛을 도입하지 않으므로 유용합니다. 이 문제에 대해 머리를 감쌀 수 없습니다.

+1

Wikipedia 페이지가 명확하지 않습니까? 하나의 논리 코어는 데이터를 기다리는 대신 하나의 코어가 대기하는 대신 데이터를 기다리는 동안 다른 하나가 처리되는 동안 처리 될 수 있습니다. – mason

답변

5

현대의 CPU가 instruction-level parallelism (ILP)을 찾아서 악용하는 방법에 대한 자세한 내용은 my answer on a softwareengineering.SE question을 참조하십시오. (Intel Haswell의 파이프 라인 블록 다이어그램과 CPU 마이크로 아키텍처 세부 정보 링크 포함).

많은 실행 단위가 있고 프론트 엔드가있는 CPU를 사용하여 작업량이 많아도 상태가 양호한 상태로 유지할 수 있습니다. 캐시 미스 나 분기 예측 오류, 또는 제한된 병렬 처리 (예 : FP 추가 중 하나의 긴 체인을 수행하는 루프, 한 개 (스칼라 또는 SIMD)에서 FP 대기 시간에 병목 현상이 하나 또는 두 개의 클럭 대신 4 또는 5 클럭에 병합) 클록)은 사이클 당 4 개 미만의 명령 처리량을 초래할 것이며 실행 장치를 유휴 상태로 남겨 두게됩니다.

HT (그리고 일반적으로 Simultaneous Multithreading (SMT))의 포인트는 낮은 ILP 또는 노점 많은 (캐시 미스/분기 예측 오류)으로 코드를 실행하는 경우에도 할 일이가 공급하는 배고픈 실행 유닛을 유지하는 것입니다.

SMT는 파이프 라인에 약간의 추가 로직을 추가하기 때문에 동시에 두 개의 별도 아키텍처 컨텍스트를 추적 할 수 있습니다. 따라서 전체 코어의 2 배 또는 4 배보다 많은 다이 면적 및 전력 비용이 소요됩니다. (기사의 방문 제온 파이는 코어 당 4 개 스레드, 메인 스트림 인텔 CPU가 아닌 일부 x86 칩은 데이터베이스 서버 유형의 워크로드를 목표로, 코어 당 8 개 개의 스레드를 실행 2를 실행 실행됩니다.)


일반적인 오해

하이퍼 스레딩은 이 아니며 컨텍스트 스위칭이 최적화되었습니다. 캐시 미스시 다른 스레드로 전환하는보다 단순한 설계가 가능하지만 HT는 그보다 훨씬 앞선 것입니다.

두 스레드가 활성화되어 있으면 프런트 엔드는 매주기마다 (페치, 디코드 및 발급/이름 바꾸기 단계에서) 스레드간에 번갈아 나타납니다. 그러나 은 비 순차 코어가 실제로 두 논리 코어의 uops를 실행할 수 있습니다. 같은주기.

일반적으로 대체하는 파이프 라인 단계에서 한 스레드가 정지 될 때마다 다른 스레드는 해당 스테이지의 모든 사이클을 가져옵니다. HT는 다른 스레드가 분기 오보 또는 캐시 미스를 기다리는 중에 복구하는 동안 한 스레드가 많은 작업을 수행 할 수 있기 때문에 고정 된 교대 작업보다 훨씬 낫습니다.

Intel CPU의 L1D 캐시 (LFB (Line Fill Buffer) 수)에서 최대 10 회의 캐시 미스가 동시에 처리 될 수 있으며 메모리 요청은 파이프 라인 처리됩니다. 그러나 다음로드의 주소 이전로드 (예 :트리 또는 링크 된 목록을 통한 포인터 쫓기) CPU는로드 할 위치를 알지 못하고 여러 요청을 동시에 처리 할 수 ​​없습니다. 따라서 두 스레드가 동시에 캐시 미스를 기다리는 것이 실제로 유용합니다.

일부 리소스는 두 스레드가 활성화되어 있고 일부는 경쟁적으로 공유 될 때 정적으로 분할됩니다. 자세한 내용은 this pdf of slides을 참조하십시오. (실제로 인텔과 AMD CPU를위한 ASM을 최적화하는 방법에 대한 자세한 내용은 Agner Fog's microarchitecture PDF를 참조하십시오.)


하나 개의 논리 코어 "잠은"(즉, 커널은 깊은 수면을 입력 할 수있는 HLT 명령 또는 무엇이든 MWAIT을 실행하면), 물리적 코어는 단일 스레드 모드로 전환되고 정적 활성 논리 코어는 전체 리소스 (전체 ReOrder 버퍼 크기 및 정적으로 분할 된 다른 리소스 포함)를 모두 가질 수 있으므로 단일 시스템에서 ILP를 찾고 사용할 수 있습니다 스레드가 계속 실행되면 다른 스레드가 단순히 캐시 미스에서 멈 추면 증가합니다.


BTW, 일부 워크로드는 실제로 HT와 느린 실행합니다. 작업 세트가 L2 또는 L1D 캐시에 거의 맞지 않으면 동일한 코어에서 두 개를 실행하면 훨씬 많은 캐시가 손실됩니다. 실행 단위를 이미 포화 상태로 유지할 수있는 매우 잘 튜닝 된 높은 처리량 코드 (예 : 고성능 컴퓨팅에서 최적화 된 행렬 곱셈과 같이)를 사용하면 HT를 사용하지 않도록 설정할 수 있습니다. 항상 벤치 마크.

Skylake에서 비디오 인코딩 (x265 -preset slower, 1080p)은 쿼드 코어 i7-6700k에서 4 대신 8 스레드로 약 15 % 빠릅니다. 실제로 4 스레드 테스트에서 HT를 사용 중지하지는 않았지만 Linux 스케쥴러는 이동할 충분한 스레드가있을 때 스레드를 수신 거부하지 않고 별도의 실제 코어에서 스레드를 실행하지 않는 것이 좋습니다. x265가 손으로 직접 작성한 asm을 많이 가지고 있고 전체 코어가 자체적으로 존재하는 경우에도 사이클 당 매우 높은 명령어를 실행한다는 점을 감안할 때 15 %의 속도 향상은 꽤 좋습니다. (내가 사용하는 것과 같은 느린 사전 설정은 메모리 바인딩보다 CPU 바인딩되는 경향이 있습니다.)

관련 문제