0

예를 들어 (a -> b -> c) -> (a -> b -> c) -> ...와 같이 주기적으로 반복되는 명령의 사슬이 주어지면 ...실행 처리량을 최대화하기위한 최소한의 종속성 체인은 무엇입니까?

-> (a0-> b0->

  • (a0-> b0-> C0) :

    이 아웃 오브 오더 실행의 혜택을 짧은 몇 가지 독립적 인 하위 종속 사슬로 분할 할 수 있다고 가정하면 C0) -> ...

  • (A1-> B1-> C1) -> (A1-> B1-> C1) -> ...

아웃 오브 오더 엔진 각 일정 지시하다 대기 시간과 상호 처리량이있는 해당 CPU 장치로 전송하십시오.

실행 처리량을 최대화하는 하위 종속성 체인의 최적 수는 무엇입니까?

Agner 's manual Optimizing subroutines in assembly language, 12.15 절에 따르면 : "CPU가 할 일이 전혀없는 경우 누적 기의 최적 수는 의존성 체인에서 가장 중요한 명령어의 대기 시간을 해당 명령어의 상호 처리량으로 나눈 값입니다." "가장 중요한 명령"은 무엇을 의미합니까? 이런 종류의 문제를 다루는 다른 기술 문서가 있습니까?

답변

0

시간은 얼마나 걸리며 각각의 사이클에서 얼마나 많은 uops가 실행될 수 있는지에 따라 다릅니다.

또한 하드웨어의 너비에 따라 다릅니다. 예 : 시계 융합 도메인 UOP 처리량 대 네 ALU 실행 유닛 (단지 세있는 벡터를 처리 할 수있는) 시계 융합 도메인 UOP 당 4

  • 스웰 당

    개의 ALU 실행 유닛과
    • PIII 3 처리량. 내가 생각

    는 "가장 중요한 명령은"중요한 경로의 길이의 대부분을 구성하는 하나를 의미한다. 루프에 종속 된 종속성 체인이 서로 다른 지연 시간을 갖는 여러 명령어로 구성된 경우 일종의 평균입니다. (같은 어쩌면 기하 평균?)


    좋은 예는 FP (예 배열 합산)에 추가된다 샌디 브리지에서

    , 그것은 하나의 기준 클럭 처리량뿐만 3C 지연 그래서 하나를 가지고 종속 종속 체인 addps 명령은 최대 FP 곱셈 처리량의 1/3 만 유지하면서 3c 당 1uop에서 실행됩니다. (그리고 완전히 비어있는 다른 두 개의 실행 포트를 떠나.)

    3 개 병렬 출발 체인을 addps 지침 포화 포트 1을 유지할 수 있습니다. 따라서 3 개의 축 압기를 사용하면 3 개의 축척을 유지할 수 있습니다. 5 FP 곱셈을 계속 유지한다면 port0도 포화시킬 수 있습니다. 루프 오버 헤드는 포트 5에서 실행될 수 있습니다 (p01의 사이클을 도용하지 않기를 바랍니다). load uops는 추가로 마이크로 퓨즈 할 수 있으므로 융합 도메인 대역폭을 차지하지 않습니다. 하지만 별도의 movaps 명령어를 사용하여로드를 수행 할 수는 있지만 클럭 당 24 개의 fused-domain uop 처리량이 포화되지는 않지만 프론트 엔드의 병목 현상으로 인해 처리량이 줄어들 수 있습니다.


    하 스웰은 여전히 ​​FP 추가에 시계 처리량 당 하나지만, FP MUL 및 FMA에 시계 당이있다. 당신이 (1.0의 배율로) FMA를 사용하여 배열을 요약하면

    그래서, 당신은 P01 포화, 비행 10 FMAs을 유지하기 위해 10 벡터 축전지 (10 출발 체인)가 필요합니다. p5 및 p6은 사용되지 않지만 마이크로 퓨즈 된로드로로드 포트를 포화시킬 수도 있습니다.


    스카이 레이크 4까지 1 사이클 FMA의 대기 시간을 감소하고, FP 유닛을 추가 떨어졌다. (그래서 FP는 1C 더 지연의 비용으로, [v]addps의 처리량을 두 배로 FMA 단위에서 이루어집니다 추가).

    그래서 SKL에 당신은 단지 P01을 포화 8 벡터 축전지 (8 출발 체인)가 필요합니다. 그러나 더 많은 디프 체인을 가지면 레지스터를 다 사용하지 않는 한 해를 끼치 지 않습니다. 따라서 Haswell에서 이상적인 코드 인 10 개의 누적기를 사용하면 SKL에 이상적입니다. 당신은 어쩌면하지만, 단지 1.0의 일정한 벡터로 addps 대신 fma213ps를 사용하여 (또는 무엇이든)에 의해 약간의 전력을 절약 할 수있다.


    처리량/대기 시간/포트 번호에 대한 Agner의 지침표와 자세한 내용은 그의 마이크로 프로세서 PDF를 참조하십시오. 포트 번호 나 대기 시간 번호를 확인하지는 않았지만이 예제를 자주 입력 했으므로 올바른 것으로 확신합니다 : P.

    태그 위키의 다른 링크를 참조하십시오. 누군가가이 문제를 해결하기 위해 몇 가지 이론적 인 자료가있는 경우이 매우-실용적이고 상세한 답변을하지만, 그것은 것입니다

  • +0

    덕분에 매우 – DMH

    +0

    @DMH 감사 :이 꽤 잘 이론을 설명 생각했다. 당신은 일련의 지시 명령에 대한 대기 시간 대 처리량의 비율을 계산하고, 그 처리량 대신 대기 시간 병목 현상을 비행해야 그것의 매수입니다. 이는 길이에 따라 수동으로 인터리빙하는 것을 의미 할 수도 있고 그렇지 않을 수도 있습니다 (짧은 루프가 전달 된 종속성을 줄이기 위해 다중 누적기를 사용하는 것처럼) –