지연 시간, 처리량 및 포트 사용에 대한 지식은 성능 분석 도구,주기가 정확한 시뮬레이터를 구축하고 컴파일러를 최적화하는 데 필요합니다.
특정 프로세서의 코드를 수동으로 미세 조정할 때도 유용합니다. 안타깝게도이 정보는 공식 프로세서 설명서에 제대로 문서화되어 있지 않습니다.
우리는 이러한 특성을 측정하기위한 마이크로 벤치 마크를 자동으로 생성하는 기술을 개발했습니다.
이 웹 사이트에서는 이러한 마이크로 벤치 마크를 사용하여 얻은 모든 세대의 인텔 코어 마이크로 아키텍처에 대한 대기 시간, 처리량 및 포트 사용 데이터를 제공합니다.
Pipeline of Intel Core CPUs
오른쪽 그림은 Intel Core CPU 파이프 라인의 일반적인 구조를 보여줍니다. 파이프 라인은 프런트 엔드, 실행 엔진 (백 엔드) 및 메모리 하위 시스템으로 구성됩니다. 프런트 엔드는 메모리에서 명령어를 가져오고이를 일련의 마이크로 연산 (μops)으로 디코딩하는 역할을합니다. 재정렬 버퍼는 μops가 폐기 될 때까지 순서대로 저장합니다.
또한 레지스터 할당 (즉, 아키텍처 레지스터를 물리적 레지스터에 매핑) 및 레지스터 이름 변경 (μop 간의 잘못된 종속성 제거)을 담당합니다. 그런 다음 μop는 모든 소스 피연산자가 준비 될 때까지 μop를 대기열에 넣는 스케줄러 (예약 스테이션이라고도 함)로 전달됩니다. μop의 피연산자가 준비되면 실행 포트를 통해 전달됩니다. 비 순차적 실행으로 인해 μops가 반드시 프로그램 순서대로 디스패치되는 것은 아닙니다.
각 포트 (Intel Core 마이크로 아키텍처에는 6 개, 8 개 또는 10 개가 있음)가 서로 다른 기능 장치 세트에 연결됩니다. 각 포트는 모든 사이클에서 최대 1μop를 수용 할 수 있습니다. 그러나 대부분의 기능 단위가 완전히 파이프 라인되어 있으므로 해당 기능 단위가 이전 μop 실행을 완료하지 않았더라도 포트는 일반적으로 모든주기에서 새 μop를 수락 할 수 있습니다.
Definitions
Latency
명령의 대기 시간은 일반적으로 “명령을 형성하는 모든 μop의 실행을 완료하기 위해 실행 코어에 필요한 클럭주기 수”로 정의됩니다 (실행 리소스를두고 경쟁하는 다른 명령이 없다고 가정).
따라서 명령어의 피연산자가 준비되고 명령어가 실행을 시작할 수있는 시점부터 명령어 결과가 준비 될 때까지의 시간을 나타냅니다.
이 정의는 명령어의 다른 피연산자가 다른 μop에 의해 읽히거나 쓰여질 수 있다는 사실을 무시합니다.
따라서 I의 모든 소스 피연산자가 준비되기 전에 이미 실행을 시작한 명령의 μop와 I의 일부 (모든 결과는 아님)에 의존하는 후속 명령 I ‘는 I의 모든 결과가 생성되기 전에 실행을 시작할 수 있습니다.
이를 고려하기 위해 각 입력 및 출력 피연산자 쌍에 대해 별도의 지연 시간을 제공합니다.
Throughput
다른 게시의 처리량 데이터를 비교할 때 이러한 게시가 모두 동일한 처리량 정의를 사용하는 것은 아니라는 점에 유의해야합니다.
인텔은 설명서에서 처리량을 다음과 같이 정의합니다. “발급 포트가 동일한 명령을 다시 수용 할 수 있기 전에 대기하는 데 필요한 클록 사이클 수.”
반면에 Agner Fog는 (상호) 처리량에 대해 다음 정의를 사용합니다. “동일 스레드에서 동일한 종류의 일련의 독립적 인 명령에 대한 명령 당 평균 코어 클록 사이클 수.”
명령이 실행될 수있는 속도를 감소시킬 수있는 이슈 포트 (예 : 프런트 엔드 또는 메모리 하위 시스템)에 대한 경합 이외의 요인이있을 수 있으므로이 두 정의는 동일하지 않습니다.
더욱이, 많은 명령어가 특정 레지스터 나 플래그에 대한 암시 적 종속성을 가지고 있기 때문에 진정으로 독립적 인 동일한 종류의 명령어를 항상 찾을 수있는 것은 아닙니다.
따라서, 두 번째 정의는 동일한 명령어에 대한 첫 번째 정의보다 더 높은 처리량 값 (낮은 처리량에 해당)을 산출 할 수 있습니다. 두 정의에 따라 처리량 값을 제공합니다.
Port Usage
포트 사용에 대해 다음 표기법을 사용합니다.
예를 들어, 3 * p015 + 1 * p23은 4 개의 μop가있는 명령어를 나타냅니다. 이러한 μop 중 3 개는 각각 포트 0, 1 및 5에서 실행될 수 있으며, 하나의 μop는 포트 2 및 3에서 실행될 수 있습니다.