l1 및 l2 캐시 요청이 누락되었다고 가정하면 주 메모리에 액세스 할 때까지 프로세서가 정지됩니까?
다른 스레드로 전환한다는 생각을 들었습니다. 정지 된 스레드를 깨우는 데 무엇이 사용됩니까?
l1 및 l2 캐시 요청이 누락되었다고 가정하면 주 메모리에 액세스 할 때까지 프로세서가 정지됩니까?
다른 스레드로 전환한다는 생각을 들었습니다. 정지 된 스레드를 깨우는 데 무엇이 사용됩니까?
답변:
메모리 대기 시간은 컴퓨터 아키텍처 연구에서 연구 된 근본적인 문제 중 하나입니다.
비 순차적 명령 문제를 사용한 추측 실행은 종종 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 년 논문에 이름을 썼습니다.)
대답은 프로세서가 멈추는 것입니다.
가능성은 많지 않습니다. 다른 작업으로 전환하는 것은 실제로 두 가지 이유로 옵션이 아닙니다. 비용이 많이 드는 작업이므로 현재 작업과 다른 작업이 캐시의 공간을 놓고 경쟁하기 때문에 다른 작업으로 전환하려면 자체적으로 주 메모리 액세스가 필요할 수 있으므로 원래 작업으로 다시 전환 될 수 있습니다. 또한 이것은 운영 체제와 관련이 있어야하므로 프로세서는 어떤 형태의 인터럽트 나 트랩 을 트리거해야합니다 . 실제로 프로세서는 일부 커널 코드로 전환됩니다.
프로세서가 정지 된 상태에서 타이머는 계속 작동하므로 타이머 인터럽트가 발생하거나 다른 주변 장치에서 인터럽트가 발생했을 수 있습니다. 따라서 주 메모리 액세스 중에 캐시 액세스보다 컨텍스트 전환이 발생할 가능성이 높지만 시간이 오래 걸리기 때문입니다.
그럼에도 불구하고 최신 컴퓨터에는 주 메모리를 기다리는 프로세서에서 낭비되는 시간을 줄이기 위해 다양한 기술이 포함되어 있습니다. 실속은 발생하지만 피할 수없는 경우에만 발생합니다.
한 가지 기술은 추론 적 페치입니다 . 프로세서는 액세스 할 메모리 위치를 추측하여 미리 캐싱하기 위해 페치합니다. 예를 들어, 메모리 블록에 대한 루프가 일반적이므로 메모리 주소 0x12340000, 0x12340010 및 0x12340020에 대해 캐시 라인이로드 된 경우 0x12340030에 대한 라인을로드하는 것이 좋습니다. 컴파일러는 프로세서 레지스터가 아닌 주 메모리에서 캐시로만 데이터를 전송한다는 점을 제외하고는로드와 유사한 프리 페치 명령어 를 생성하여 도움을 줄 수 있습니다 .
또 다른 기술은 추론 적 실행 이다. 프로세서는로드가 수행되기 전에 다음 명령 실행을 시작합니다. 이것은 지침 의 파이프 라이닝 때문에 자연스럽게 발생 합니다. 로드 된 값에 의존하지 않는 명령 만 이런 방식으로 실행할 수 있습니다. 프로세서는 종속성 분석을 수행해야합니다. 조건부 명령어 (예 : 부하 r1; r1 ≠ 0 인 경우 분기)의 경우 프로세서는 분기 예측 휴리스틱을 사용 하여 값이 무엇인지 추측합니다. 로드가 중단을 트리거하는 경우로드 후 추측 실행을 다시 감아 야 할 수 있습니다.
Itanium 과 같은 일부 아키텍처 는 기본적으로 명령 순서를 변경하여 편리한 순서로 명령을 쉽게 실행할 수 있습니다. 순차적으로 순차적으로 실행되는 일련의 기본 명령 대신 프로그램은 매우 긴 명령 단어 로 구성됩니다 . 단일 명령에는 다음이 포함됩니다. 프로세서의 다른 구성 요소에 의해 병렬로 실행되는 많은 작업.
다른 스레드로 전환하는 것은 하이 엔드 x86 프로세서에 있는 하이퍼 스레딩 에서 발생합니다 . 이것은 하드웨어 설계 기술입니다. 각 프로세서 코어에는 두 개의 개별 레지스터 뱅크 (각각 작업 컨텍스트에 해당)가 있지만 두 개의 독립적 인 실행 스레드를 지원할 수 있지만 하나의 명령 만 효과적으로 실행할 수 있도록 다른 요소의 단일 인스턴스를 포함합니다. 시간. 한 스레드가 정지 된 상태에서 다른 스레드가 진행됩니다. 소프트웨어의 관점에서 두 개의 독립적 인 프로세서가 있습니다. 그 프로세서가 후드 아래에서 많은 구성 요소를 공유하는 경우가 있습니다.
스왑은 메모리 캐시 계층에서 한 단계 더 있습니다. 주 메모리는 스왑 공간에 대한 캐시로 볼 수 있습니다. 스와핑을 사용하면 메커니즘과 성능 비율이 다릅니다. 작업이 스왑에서 데이터를로드해야하는 경우로드 명령은 커널 코드를 실행하여 RAM에 페이지를 할당하고 디스크에서 해당 내용을로드하는 트랩을 트리거합니다. 이런 일이 발생하는 동안 커널은 다른 작업으로 전환하기로 결정할 수도 있습니다.
이 질문에 대한 답변은 해당 아키텍처에 따라 다릅니다. 스레드를 전환하는 데 너무 오래 걸리기 때문에 많은 CPU (ARM, 하이퍼 스레딩없이 x86 등)가 멈출 수 있지만 모든 아키텍처에서 사용되는 접근 방식은 아닙니다. 일부 아키텍처에서 CPU에 예약 된 각 스레드에는 자체 독립 레지스터 파일이 있으므로 프로세서는 메모리 액세스를 기다리지 않는 스레드에서 작업을 간단히 실행할 수 있습니다. 이것이 x86 하이퍼 스레딩이 수행하는 것 (단 2 개의 스레드 사용)이지만 제한된 수준이지만 GPGPU 에서 훨씬 일반적이라는 것을 이해합니다.아키텍처. CUDA의 특정 경우에, 수백 개가 아닌 수백 개에 이르는 스레드의 워프는 일반적으로 주어진 시간에 주어진 멀티 프로세서에로드되며, 각 스레드 (수백 또는 수천 개)에는 자체 레지스터가 있습니다. 이를 통해 주어진 스레드가 메모리 액세스를 실행할 때 아키텍처가 다음주기에 다른 스레드의 명령을 실행할 수 있습니다. 따라서 충분한 수의 스레드가로드되는 한 프로세서 코어는 메모리 액세스를 위해 유휴 상태가되지 않습니다. 자세한 내용은 성능 지침 및 메모리 계층 을 참조하십시오.