@peufeu의 대답은 이것이 시스템 전체의 집계 대역폭이라는 것을 나타냅니다. L1 및 L2는 Intel Sandybridge 제품군의 개인별 코어 캐시이므로 단일 코어로 수행 할 수있는 것의 수는 2 배입니다. 그러나 여전히 인상적인 높은 대역폭과 낮은 대기 시간을 유지합니다.
L1D 캐시는 CPU 코어에 바로 내장되어 있으며로드 실행 장치 (및 저장소 버퍼)와 매우 밀접하게 연결되어 있습니다. 마찬가지로 L1I 캐시는 코어의 명령 페치 / 디코딩 부분 옆에 있습니다. (실제로 Sandybridge 실리콘 평면도를 보지 않았으므로 이것은 사실이 아닐 수도 있습니다. 프런트 엔드의 문제 / 이름 변경 부분은 아마도 "L0"디코딩 된 uop 캐시에 더 가깝기 때문에 전력을 절약하고 더 나은 대역폭을 제공합니다 디코더보다.)
그러나 L1 캐시를 사용하면 매주기마다 읽을 수 있다고해도 ...
왜 거기서 멈춰? Sandybridge 이후 Intel 및 K8 이후 AMD는 사이클 당 2 개의로드를 실행할 수 있습니다. 멀티 포트 캐시와 TLB는 중요한 것입니다.
David Kanter의 Sandybridge 마이크로 아키텍처 작성 에는 훌륭한 다이어그램이 있습니다 (IvyBridge CPU에도 적용됨).
"통합 스케줄러"에는 입력이 준비되기를 기다리는 및 / 또는 실행 포트를 기다리는 ALU 및 메모리 UOP가 있습니다 (예 : 이전에 아직 실행되지 않은 경우 vmovdqa ymm0, [rdi]
기다려야하는로드 UOP로 디코딩) . 예). 문제 / 이름 바꾸기시 포트 인텔 스케줄 마이크로 연산 .이 도면은 단지 메모리 마이크로 연산의 실행 포트를 보이고 있지만, 미 실행 ALU도 그것이 경쟁을 마이크로 연산. 문제 / 이름 바꾸기 단계는 ROB 및 스케줄러 마이크로 연산을 추가 이들은 은퇴 할 때까지 ROB에 머물러 있지만 실행 포트로 발송할 때까지만 스케줄러에 있습니다 (이것은 인텔 용어이며 다른 사람들은 문제를 사용하고 다르게 발송합니다). AMD는 정수 / FP에 별도의 스케줄러를 사용하지만 주소 지정 모드는 항상 정수 레지스터를 사용합니다rdi
add rdi,32
표시된 것처럼, 2 개의 AGU 포트 (주소 생성 장치는 주소 지정 모드 [rdi + rdx*4 + 1024]
를 사용하여 선형 주소를 생성 함) 만 있습니다. 클록 당 2 개의 메모리 ops (각 128b / 16 바이트)를 실행할 수 있으며, 그 중 하나는 상점입니다.
그러나 SnB / IvB는 256b AVX로드 / 스토어를 단일 uop으로 실행하여로드 / 스토어 포트에서 2주기를 수행하지만 첫 번째주기에서는 AGU 만 필요합니다. 이를 통해 두 번째주기 동안 포트 2/3의 AGU에서 저장소 주소 UOP를로드 처리량 손실없이 실행할 수 있습니다. 따라서 SnB / IvB는 AVX (Intel Pentium / Celeron CPU가 : /를 지원하지 않음)를 사용하여 이론적으로 사이클 당 2 개의로드 와 1 개의 스토어를 유지할 수 있습니다.
IvyBridge CPU는 Sandybridge의 축소 과정입니다 ( 이동 제거 , ERMSB (memcpy / memset) 및 다음 페이지 하드웨어 프리 페칭과 같은 일부 마이크로 아키텍처 개선 ). 그 이후의 생성 (Haswell)은 실행 단위에서 L1까지의 데이터 경로를 128b에서 256b로 확장하여 클록 당 L1D 대역폭을 두 배로 늘려 AVX 256b로드가 클록 당 2를 유지할 수 있습니다. 또한 간단한 주소 지정 모드를 위해 추가 상점 AGU 포트가 추가되었습니다.
Haswell / Skylake의 최대 처리량은 클럭 당 96 바이트로드 + 저장이지만 인텔의 최적화 매뉴얼에서는 Skylake의 지속적인 평균 처리량 (여전히 L1D 또는 TLB 누락이 없다고 가정)이 ~ 81B 사이클임을 제안합니다. (스칼라 정수 루프는 SKL에 대한 테스트 에 따라 클록 당 2로드 + 1 스토어를 유지 하여 4 융합 도메인 uops에서 클록 당 7 (퓨전되지 않은 도메인) uops를 실행할 수 있지만 64 비트 피연산자 대신 약간 느려집니다. 32 비트이므로, 약간의 마이크로 아키텍처 리소스 제한이 있으며 이는 단지 저장소 주소 uops를 포트 2/3로 예약하고로드에서 사이클을 훔치는 문제가 아닙니다.)
매개 변수에서 캐시의 처리량을 어떻게 계산합니까?
매개 변수에 실제 처리량 수가 포함되어 있지 않으면 불가능합니다. 위에서 언급했듯이 Skylake의 L1D조차도 256b 벡터에 대한로드 / 스토어 실행 단위를 따라갈 수 없습니다. 가까이 있지만 32 비트 정수가 가능합니다. (캐시가 포트를 읽은 것보다 더 많은로드 단위를 갖는 것은 이치에 맞지 않습니다. 그 반대도 마찬가지입니다. 완전히 활용 될 수없는 하드웨어는 제외하고 싶을 것입니다. L1D에는 라인을 송수신하기위한 추가 포트가있을 수 있습니다. / 코어 내에서 읽기 / 쓰기뿐만 아니라 다른 코어에서 /)
데이터 버스 폭과 시계 만 살펴 보더라도 전체 스토리를 제공하지는 않습니다.
L2 및 L3 (및 메모리) 대역폭은 L1 또는 L2가 추적 할 수있는 미결 누락 수에 의해 제한 될 수 있습니다 . 대역폭은 대기 시간 * max_concurrency를 초과 할 수 없으며 대기 시간이 긴 L3 칩 (예 : 많은 코어 Xeon)은 동일한 마이크로 아키텍처의 듀얼 / 쿼드 코어 CPU보다 단일 코어 L3 대역폭이 훨씬 적습니다. 이 SO 답변 의 "대기 시간 바인딩 플랫폼"섹션을 참조하십시오 . Sandybridge 제품군 CPU에는 L1D 미스 (NT 저장소에서도 사용)를 추적하기 위해 10 개의 라인 채우기 버퍼가 있습니다.
(많은 코어가 활성화 된 총 L3 / 메모리 대역폭은 큰 Xeon에서 크지 만 단일 스레드 코드는 코어가 많을수록 링 버스에서 더 많은 정지를 의미하므로 동일한 클럭 속도에서 쿼드 코어보다 더 나쁜 대역폭을 인식합니다. 대기 시간 L3.)
캐시 지연
그러한 속도는 어떻게 달성됩니까?
L1D 캐시의 4주기로드 사용 대기 시간은 특히 놀랍습니다 . 특히 주소 지정 모드로 시작 [rsi + 32]
해야하므로 가상 주소 가 있기 전에 추가해야합니다 . 그런 다음 캐시 태그가 일치하는지 확인하려면이를 물리적으로 변환해야합니다.
( [base + 0-2047]
Intel Sandybridge 제품군에서 추가주기를 수행하는 것 이외 의 어드레싱 모드는 간단한 어드레싱 모드 (일반적으로로드 사용 지연이 가장 중요하지만 일반적으로 일반적으로 사용되는 포인터 추적 경우)에 대한 AGU의 단축 법입니다. ( Intel의 최적화 매뉴얼 , Sandybridge 섹션 2.3.5.2 L1 DCache를 참조하십시오 .) 또한 세그먼트 재정의가없고 세그먼트 기본 주소 0
가 정상적인 것으로 가정합니다 .
또한 스토어 버퍼를 검사하여 이전 스토어와 겹치는 지 확인해야합니다. 그리고 이전의 프로그램 순서로 상점 주소 uop이 아직 실행되지 않았더라도 이것을 알아 내야하므로 상점 주소를 알 수 없습니다. 그러나 L1D 적중 확인과 동시에 발생할 수 있습니다. 저장소 전달이 저장소 버퍼에서 데이터를 제공 할 수 있기 때문에 L1D 데이터가 필요하지 않은 것으로 판명되면 손실이 없습니다.
인텔은 거의 모든 다른 사람들과 마찬가지로 VIPT (Virtually Indexed Physically Tagged) 캐시를 사용하며, VIPT의 속도와 함께 PIPT 캐시 (별칭 없음)처럼 동작하도록 캐시를 작고 충분히 높은 연관성을 갖는 표준 트릭을 사용합니다. TLB 가상-> 물리적 조회와 병행).
인텔의 L1 캐시는 32kiB, 8 방향 연관입니다. 페이지 크기는 4kiB입니다. 이것은 "인덱스"비트 (어떤 주어진 라인을 캐시 할 수있는 8 가지 방법 세트를 선택 함)가 모두 페이지 오프셋 아래에 있음을 의미합니다. 즉, 이러한 주소 비트는 페이지에 대한 오프셋이며 가상 주소와 실제 주소에서 항상 동일합니다.
작은 캐시와 빠른 캐시가 유용하고 가능한 이유에 대한 자세한 내용은 더 큰 캐시와 쌍을 이룰 때 잘 작동하는 이유에 대한 자세한 내용 은 L1D가 왜 L2보다 작고 빠른지 에 대한 대답을 참조하십시오 .
작은 캐시는 태그를 가져 오는 것과 동시에 세트에서 데이터 배열을 가져 오는 것과 같이 더 큰 캐시에서 너무 많은 전력을 소비하는 작업을 수행 할 수 있습니다. 따라서 비교기가 어떤 태그와 일치하는지 찾으면 SRAM에서 이미 가져온 8 개의 64 바이트 캐시 라인 중 하나만 먹여야합니다.
Sandybridge / Ivybridge는 뱅크가 8 바이트 인 16 바이트 청크가있는 뱅킹 L1D 캐시를 사용합니다. 다른 캐시 라인에서 동일한 뱅크에 대한 두 번의 액세스가 동일한 주기로 실행되면 캐시 뱅크 충돌이 발생할 수 있습니다. (8 개의 뱅크가 있으므로 이는 128 개의 배수로 이루어진 주소, 즉 2 개의 캐시 라인에서 발생할 수 있습니다.)
IvyBridge는 64B 캐시 라인 경계를 넘지 않는 한 정렬되지 않은 액세스에 대한 페널티가 없습니다. 낮은 주소 비트를 기반으로 가져올 뱅크를 파악하고 올바른 1 ~ 16 바이트의 데이터를 얻기 위해 어떤 이동이 필요한지 설정합니다.
캐시 라인 분할에서 여전히 단일 uop이지만 여러 캐시 액세스를 수행합니다. 페널티는 4k 분할을 제외하고는 여전히 작습니다. Skylake는 복잡한 주소 지정 모드를 사용하는 일반 캐시 라인 분할과 마찬가지로 약 11주기의 대기 시간으로 4k 분할도 상당히 저렴하게 만듭니다. 그러나 4k 스플릿 처리량은 cl-split non-split보다 훨씬 나쁩니다.
출처 :