메인 메모리 페치를 기다리는 동안 프로세서는 무엇을 하는가


26

l1 및 l2 캐시 요청이 누락되었다고 가정하면 주 메모리에 액세스 할 때까지 프로세서가 정지됩니까?

다른 스레드로 전환한다는 생각을 들었습니다. 정지 된 스레드를 깨우는 데 무엇이 사용됩니까?


4
어떤 연구를 했습니까? 이것은 확실히 사용 가능한 정보입니다. 나는 전문가들에게 대답을 남길 것이지만 스레드 스위치가 유용한 것이라고 생각하지 않습니다. 일반적으로 CPU에서 컨텍스트를 전환하면 많은 메모리 액세스 가 발생 하므로 캐시 누락이 발생할 수 있습니다. 작업 순서 변경 (파이프 라인 활용)과 같은 몇 가지 방법이 있지만 실속은 대안이없는 것 같습니다.
Raphael

@Raphael 저는 주로 컴퓨터 아키텍처 책을 읽었습니다. Steve Furber의 ARM System-on-Chip Architecture는 아마도 내가 읽은 것 중 가장 포괄적 일 것입니다. 그러나 나는 컴퓨터 아키텍처 : 양적 접근을 읽기 시작했습니다. 스레드 전환, OOE 및 비 순차적 메모리 작업과 같은 중단을 피하는 기술을 설명합니다.하지만 오래된 아키텍처를 다루는 대부분의 교과서처럼 또는 이러한 것들이 어떻게 작동하는지에 대한 모호한 제안을 제공하는 것처럼 현대적인 디자인의 복잡한 점에 대해서는 실제로 많이 설명하지 않습니다. 구현하고 함께 작동합니다.
102948239408

내 질문에 따라 캐시는 지연 시간이 작고 응답에 결정적 인 것처럼 보이지만 최악의 시나리오 페이지 테이블이 실제 주소를 검색하기 위해 걸을 경우 수천 개의 명령이 완료 될 수 있습니다. 일부 스레드는 ILP에서 추출 한 동일한 스레드에서 완료 될 수 있습니다. 프로세서에서 어떤 하드웨어 상호 작용이 발생하여 다른 스레드를 예약하고 해당 스레드를 깨우는 데 어떤 통신이 사용되는지 결정합니다. 또한 OoOE가 스레드를 전환 할 때 전체 결과 대기열을 처리하는 기술이 있습니까?
102948239408

1
현대 CPU의 특정 부분에 관심이 있다는 것은 확실하지 않습니다. 그것은 아마도 주제가 아닌 것일뿐 아니라 독점 정보 일 수도 있습니다. 개념으로 우리는 당신을 도울 수 있습니다. 이것들은 아마도 구현보다 수십 년 동안 덜 변했을 것입니다. 귀하의 질문에 대해서는 귀하가 알고있는 것을 통합하고 구체적인 개념적 (또는 참조 요청) 질문을 작성하십시오.
Raphael

1
나는 일반적인 개념에 대해 대답했지만, 당신의 의견으로 판단하면, 당신은 더 진보 된 고려를 겪을지도 모른다. 그러나보다 고급 답변을 원할 경우 특정 아키텍처 및 기술 유형에 대한 질문을보다 구체적으로 만들어야합니다.
Gilles 'SO- 악마 그만'

답변:


28

메모리 대기 시간은 컴퓨터 아키텍처 연구에서 연구 된 근본적인 문제 중 하나입니다.

투기 적 실행

비 순차적 명령 문제를 사용한 추측 실행은 종종 L1 캐시 적중시 대기 시간을 채우기 위해 유용한 작업을 찾을 수 있지만 일반적으로 10 또는 20주기 정도 후에 유용한 작업이 부족합니다. 지연 시간이 오래 걸리는 동안 수행 할 수있는 작업량을 늘리려는 몇 가지 시도가있었습니다. 한 가지 아이디어는 가치 예측 을 시도하는 것이었다 (Lipasti, Wilkerson and Shen, (ASPLOS-VII) : 138-147, 1996). 이 아이디어는 학술 건축 연구 분야에서 한동안 유행했지만 실제로는 효과가없는 것 같습니다. 역사의 쓰레기통에서 가치 예측을 저장하기위한 최후의 시도는 런 헤드 실행 이었습니다.(Mutlu, Stark, Wilkerson 및 Patt (HPCA-9) : 129, 2003). runahead 실행에서는 가치 예측이 잘못 될 것이라는 것을 인식하지만 어쨌든 추측 적으로 실행 한 다음 예측을 기반으로 모든 작업을 버립니다. 그리워. runahead는 너무 많은 에너지를 낭비하여 가치가 없다는 것이 밝혀졌습니다.

산업계의 관심을 끌고있는이 정맥의 최종 접근법은 엄청나게 긴 재정렬 버퍼를 만드는 것입니다. 명령어는 분기 예측을 기반으로 추론 적으로 실행되지만 값 예측은 수행되지 않습니다. 대신 대기 시간이 긴로드 미스에 종속 된 모든 명령이 재주문 버퍼에서 대기하고 대기합니다. 그러나 재정렬 버퍼가 너무 커서 분기 예측기가 적절한 작업을 수행하는 경우 명령을 페치 할 수 있습니다. 때로는 명령 스트림에서 훨씬 나중에 유용한 작업을 찾을 수 있습니다. 이 분야의 영향력있는 연구 논문은 지속적인 흐름 파이프 라인 이었습니다.(Srinivasan, Rajwar, Akkary, Gandhi 및 Upton (ASPLOS-XI) : 107-119, 2004). (저자 모두 인텔 출신이라는 사실에도 불구하고,이 아이디어는 AMD에 더 큰 관심을 끌고 있다고 생각합니다.)

멀티 스레딩

대기 시간 허용 범위에 여러 스레드를 사용하면 훨씬 더 긴 역사를 가지고 있으며 업계에서 훨씬 더 큰 성공을 거두었습니다. 모든 성공적인 버전은 멀티 스레딩을위한 하드웨어 지원을 사용합니다. 이것의 가장 단순하고 성공적인 버전은 종종 FGMT ( fine grained multi-threading ) 또는 인터리브 된 멀티 스레딩 입니다. 각 하드웨어 코어는 다중 스레드 컨텍스트를 지원합니다 ( 컨텍스트 는 기본적으로 명령 포인터와 같은 레지스터 및 암시 적 플래그 레지스터를 포함한 레지스터 상태입니다). 세분화 된 멀티 스레딩 프로세서의 각 스레드가 처리 -주문. 프로세서는 대기 시간이 긴로드 미스에서 중단 된 스레드와 다음 명령어를 준비 할 스레드를 추적하고 각주기마다 간단한 FIFO 스케줄링 전략을 사용하여 해당주기를 실행할 준비 스레드를 선택합니다. 대규모의 초기 사례로는 Burton Smith의 HEP 프로세서가 있습니다 (Burton Smith는 Tera 슈퍼 컴퓨터를 설계하기 시작했습니다.이 컴퓨터는 세밀한 멀티 스레딩 프로세서이기도합니다). 그러나 그 아이디어는 1960 년대로 훨씬 더 거슬러 올라갑니다.

FGMT는 스트리밍 워크로드에 특히 효과적입니다. 모든 최신 GPU (그래픽 처리 장치)는 각 코어가 FGMT 인 멀티 코어이며이 개념은 다른 컴퓨팅 도메인에서도 널리 사용됩니다. Sun의 T1은 멀티 코어 FMGT이기도했으며 인텔의 Xeon Phi (종종 "MIC"라고도하며 "Larabee"라고도 함) 프로세서입니다.

의 아이디어 동시 멀티 스레딩 (Tullsen, 에거, 그리고 레비 (ISCA-22) : 392-403, 1995) 투기 실행과 하드웨어 멀티 스레딩을 결합한 제품입니다. 프로세서에는 여러 스레드 컨텍스트가 있지만 각 스레드는 추론 적으로 그리고 순서가 맞지 않게 실행됩니다. 보다 정교한 스케줄러는 다양한 휴리스틱을 사용하여 유용한 작업을 수행 할 가능성이 가장 높은 스레드에서 가져올 수 있습니다 ( Malik, Agarwal, Dhar 및 Frank, (HPCA-14 : 50-61), 2008 ). 특정 대형 반도체 회사는 동시 멀티 스레딩하이퍼 스레딩 이라는 용어를 사용하기 시작 했으며 그 이름은 요즘 가장 널리 사용되는 것으로 보입니다.

저수준 마이크로 아키텍처 관심사

귀하의 의견을 다시 읽은 후 프로세서와 메모리 사이에서 진행되는 신호에 관심이 있다는 것을 깨달았습니다. 최신 캐시는 일반적으로 여러 누락을 동시에 처리 할 수 ​​있습니다. 이를 잠금없는 캐시 (Kroft, (ISCA-8) : 81-87, 1981)라고합니다. (그러나 논문은 온라인에서 찾기가 어렵고 읽기가 다소 어렵습니다. 짧은 대답 : 많은 책 관리가 있지만이를 다루는 것입니다. 하드웨어 책 관리 구조를 MSHR (미스 정보 / 상태 유지 레지스터라고 함) )는 Kroft가 1981 년 논문에 이름을 썼습니다.)


정말 포괄적 인 답변 덕분에 잠금이없는 캐시를 조사해 보겠습니다. 내 잘못 말한 질문은 프로세서가 주 메모리 액세스 중에로드와 저장을 계속했는지, 그리고 이것을 수행하는 데 사용 된 마이크로 아키텍처 기술을 실제로 확인하려고했습니다.
102948239408

+1, 1. 라운드 로빈 스케줄링을 사용하지 않으면 실제로 배럴 처리입니까? Wikipedia는 FGMT와 동의어입니다. (스킵으로 라운드 로빈에 "배럴 프로세서"를 적용 할 수 있지만, 누락 된 스 태브 (준비되지 않은 스레드 참조)가 배럴의 원주를 수축시키지 않기 때문에 유추 할 수 있습니다 ( "진정한"배럴 프로세서는 CDC 6600의 주변 장치 프로세서는 드물다. 사이클을 낭비하지만 하드웨어를 단순화하기 때문이다.) 2. Itanium의 하이퍼 스레딩 및 IBM의 Northstar 등의 SoEMT에 대한 언급은 특히 적절한 것으로 보인다.
Paul A. Clayton

@ 102948239408, 당신이 구글에 대한 또 다른 것은 "히트 미스"및 "미스 미스"와 같은 용어입니다 (다른 옵션은 "스톨 미스"이지만 방금 시도했지만 아무 것도 반환하지 않는 것 같습니다.) 캐시가 허용하는 다양한 옵션에 대해 (일부) 설계자가 현재 사용하는 용어.
방황 논리

@ PaulA.Clayton, 용어는 확실히 내 강력한 소송이 아닙니다. 배럴 처리가 라운드 로빈을 의미한다는 데 동의합니다. 그러나 다른 의미로는 생각할 수 없습니다. 순서가 많은 스레드 (사이클론, Xeon Phi 및 Sun T1이 모두 수행하는 사이클)의주기 별 인터리빙. FGMT입니까? 나는 항상 FGMT를 SMT를 포함하는 것으로 생각했습니다 (즉, 스레드가 순서대로 실행되도록 지정하지 않음).이 경우 FGMT가 "배럴 프로세서"보다 낫습니까?
방황 논리

Wikipedia의 Barrel processor 기사에 "Interleaved"또는 "fine-grained"temporal multithreading이라고도 알려져 있으므로 IMT와 FGMT는 최소한 인식되는 용어입니다. 나는 "인터리브 된"보다 "세분화 된"을 읽은 것으로 생각되지만 인터리브 된 것은 드문 일이 아닙니다. 나는 일반적으로 FG를 사용했다 (나에게 "그레인"은 SMT가 제공하는 것보다 더 많은 분리를 의미한다). FG는 인터리브가 SoEMT에 적용될 수있는 이점이 있습니다. 나는 이것이 단지 "배럴 프로세서"의 사용에 대한 변화라고 생각한다.
Paul A. Clayton

16

대답은 프로세서가 멈추는 것입니다.

가능성은 많지 않습니다. 다른 작업으로 전환하는 것은 실제로 두 가지 이유로 옵션이 아닙니다. 비용이 많이 드는 작업이므로 현재 작업과 다른 작업이 캐시의 공간을 놓고 경쟁하기 때문에 다른 작업으로 전환하려면 자체적으로 주 메모리 액세스가 필요할 수 있으므로 원래 작업으로 다시 전환 될 수 있습니다. 또한 이것은 운영 체제와 관련이 있어야하므로 프로세서는 어떤 형태의 인터럽트트랩 을 트리거해야합니다 . 실제로 프로세서는 일부 커널 코드로 전환됩니다.

프로세서가 정지 된 상태에서 타이머는 계속 작동하므로 타이머 인터럽트가 발생하거나 다른 주변 장치에서 인터럽트가 발생했을 수 있습니다. 따라서 주 메모리 액세스 중에 캐시 액세스보다 컨텍스트 전환이 발생할 가능성이 높지만 시간이 오래 걸리기 때문입니다.

그럼에도 불구하고 최신 컴퓨터에는 주 메모리를 기다리는 프로세서에서 낭비되는 시간을 줄이기 위해 다양한 기술이 포함되어 있습니다. 실속은 발생하지만 피할 수없는 경우에만 발생합니다.

한 가지 기술은 추론 적 페치입니다 . 프로세서는 액세스 할 메모리 위치를 추측하여 미리 캐싱하기 위해 페치합니다. 예를 들어, 메모리 블록에 대한 루프가 일반적이므로 메모리 주소 0x12340000, 0x12340010 및 0x12340020에 대해 캐시 라인이로드 된 경우 0x12340030에 대한 라인을로드하는 것이 좋습니다. 컴파일러는 프로세서 레지스터가 아닌 주 메모리에서 캐시로만 데이터를 전송한다는 점을 제외하고는로드와 유사한 프리 페치 명령어 를 생성하여 도움을 줄 수 있습니다 .

또 다른 기술은 추론 적 실행 이다. 프로세서는로드가 수행되기 전에 다음 명령 실행을 시작합니다. 이것은 지침 의 파이프 라이닝 때문에 자연스럽게 발생 합니다. 로드 된 값에 의존하지 않는 명령 만 이런 방식으로 실행할 수 있습니다. 프로세서는 종속성 분석을 수행해야합니다. 조건부 명령어 (예 : 부하 r1; r1 ≠ 0 인 경우 분기)의 경우 프로세서는 분기 예측 휴리스틱을 사용 하여 값이 무엇인지 추측합니다. 로드가 중단을 트리거하는 경우로드 후 추측 실행을 다시 감아 야 할 수 있습니다.

Itanium 과 같은 일부 아키텍처 는 기본적으로 명령 순서를 변경하여 편리한 순서로 명령을 쉽게 실행할 수 있습니다. 순차적으로 순차적으로 실행되는 일련의 기본 명령 대신 프로그램은 매우 긴 명령 단어 로 구성됩니다 . 단일 명령에는 다음이 포함됩니다. 프로세서의 다른 구성 요소에 의해 병렬로 실행되는 많은 작업.

다른 스레드로 전환하는 것은 하이 엔드 x86 프로세서에 있는 하이퍼 스레딩 에서 발생합니다 . 이것은 하드웨어 설계 기술입니다. 각 프로세서 코어에는 두 개의 개별 레지스터 뱅크 (각각 작업 컨텍스트에 해당)가 있지만 두 개의 독립적 인 실행 스레드를 지원할 수 있지만 하나의 명령 만 효과적으로 실행할 수 있도록 다른 요소의 단일 인스턴스를 포함합니다. 시간. 한 스레드가 정지 된 상태에서 다른 스레드가 진행됩니다. 소프트웨어의 관점에서 두 개의 독립적 인 프로세서가 있습니다. 그 프로세서가 후드 아래에서 많은 구성 요소를 공유하는 경우가 있습니다.

스왑은 메모리 캐시 계층에서 한 단계 더 있습니다. 주 메모리는 스왑 공간에 대한 캐시로 볼 수 있습니다. 스와핑을 사용하면 메커니즘과 성능 비율이 다릅니다. 작업이 스왑에서 데이터를로드해야하는 경우로드 명령은 커널 코드를 실행하여 RAM에 페이지를 할당하고 디스크에서 해당 내용을로드하는 트랩을 트리거합니다. 이런 일이 발생하는 동안 커널은 다른 작업으로 전환하기로 결정할 수도 있습니다.


첫 번째와 마지막 두 번째 단락과 달리 "트릭"은 하이퍼 스레딩에서 실제 컨텍스트 전환이 필요하지 않다는 것입니다. CPU는 동시에 두 컨텍스트를 완전히 유지합니다.
Raphael

1
@Raphael Right : 소프트웨어에 관한 한 성능 이외의 모든 CPU에는 두 가지가 있습니다.
Gilles 'SO- 악마 그만해'

하이퍼 스레드 CPU에는 많은 반 독립적 실행 단위 (정수 및 부동 소수점 가산기, 승수 등)가 있으며 두 컨텍스트 모두 별도의 실행 단위를 동시에 사용할 수 있다고 생각합니다.
Russell Borogove

심지어 비 하이퍼 스레딩 CPU를 가질 수 있기 때문에 예 @RussellBorogove, 나는 그것을 언급하지 않았다 여러 ALU / FPU / ... 반대로 별도의 코어는 때때로 공유 FPU 등
질 'SO-정지되는 악'

5

이 질문에 대한 답변은 해당 아키텍처에 따라 다릅니다. 스레드를 전환하는 데 너무 오래 걸리기 때문에 많은 CPU (ARM, 하이퍼 스레딩없이 x86 등)가 멈출 수 있지만 모든 아키텍처에서 사용되는 접근 방식은 아닙니다. 일부 아키텍처에서 CPU에 예약 된 각 스레드에는 자체 독립 레지스터 파일이 있으므로 프로세서는 메모리 액세스를 기다리지 않는 스레드에서 작업을 간단히 실행할 수 있습니다. 이것이 x86 하이퍼 스레딩이 수행하는 것 (단 2 개의 스레드 사용)이지만 제한된 수준이지만 GPGPU 에서 훨씬 일반적이라는 것을 이해합니다.아키텍처. CUDA의 특정 경우에, 수백 개가 아닌 수백 개에 이르는 스레드의 워프는 일반적으로 주어진 시간에 주어진 멀티 프로세서에로드되며, 각 스레드 (수백 또는 수천 개)에는 자체 레지스터가 있습니다. 이를 통해 주어진 스레드가 메모리 액세스를 실행할 때 아키텍처가 다음주기에 다른 스레드의 명령을 실행할 수 있습니다. 따라서 충분한 수의 스레드가로드되는 한 프로세서 코어는 메모리 액세스를 위해 유휴 상태가되지 않습니다. 자세한 내용은 성능 지침메모리 계층 을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.