물론 조건은 매번 확인됩니다. 그러나 확인 될 때까지는 CPU 파이프 라인으로 훨씬 올라갑니다. 그 동안 다른 명령어도 파이프 라인에 들어 갔으며 다양한 실행 단계에 있습니다.
일반적으로 조건 바로 뒤에는 조건 분기 명령이 나옵니다. 조건 분기 명령은 조건이 TRUE이면 분기되거나 조건이 FALSE이면 떨어집니다. 이는 조건이 TRUE 또는 FALSE인지 여부에 따라 조건 명령 및 분기 명령 이후 파이프 라인에로드 될 수있는 두 개의 서로 다른 명령 스트림이 있음을 의미합니다. 불행하게도, 조건 명령 및 분기 명령을로드 한 직후에 CPU는 조건이 무엇을 평가할지 아직 알지 못하지만 여전히 파이프 라인에 항목을로드해야합니다. 따라서 조건이 무엇을 평가할지에 대한 추측을 기반으로 두 명령 세트 중 하나를 선택합니다.
나중에 조건 명령이 파이프 라인을 따라 이동하면 평가할 시간입니다. 그때 CPU는 추측이 옳았는지 아닌지를 알아냅니다.
추측이 옳은 것으로 판명되면 지점이 올바른 위치로 이동하고 올바른 지침이 파이프 라인에로드되었습니다. 추측이 틀린 것으로 판명되면 조건부 분기 명령 이후 파이프 라인에로드 된 모든 명령이 잘못된 것이므로 버려야하며 명령 가져 오기는 올바른 위치에서 다시 시작해야합니다.
개정
StarWeaver의 의견에 따라 단일 명령을 실행하기 위해 CPU가 수행해야 할 작업에 대한 아이디어를 제공합니다.
MOV AX,[SI+10]
우리 인간이 "SI 플러스 10에 단어가있는 AX로드"라고 생각하는 단순한 것을 고려하십시오 . 대략 CPU는 다음을 수행해야합니다.
- PC의 내용 ( "프로그램 카운터 레지스터")을 주소 버스로 내 보냅니다.
- 데이터 버스로부터 명령 연산 코드를 판독하고;
- 증분 PC;
- opcode를 디코딩하여 어떻게해야하는지 파악하십시오.
- PC의 내용을 주소 버스로 내 보냅니다.
- 데이터 버스로부터 명령어 피연산자 (이 경우 10)를 판독하고;
- 증분 PC;
- 피연산자와 SI를 가산기에 공급합니다.
- 가산기의 결과를 어드레스 버스로 방출하고;
- 데이터 버스에서 AX를 읽습니다.
이것은 무려 10 단계입니다. 이러한 단계 중 일부는 파이프 라인되지 않은 CPU에서도 최적화됩니다. 예를 들어 CPU는 거의 항상 다음 단계와 병행하여 PC를 증가시킵니다. PC는 매우 특수한 레지스터이기 때문에 수행하기가 쉽습니다. 다른 작업에는 사용되지 않으므로이 특정 레지스터에 액세스하기 위해 CPU의 다른 부분간에 경합이 발생할 가능성이 없습니다. 그러나 여전히 우리는 그러한 간단한 교육을 위해 8 단계를 밟았으며 CPU를 대신하여 어느 정도의 정교함을 이미 가정하고 있습니다. 예를 들어, 추가 단계를 수행 할 필요가 없다고 가정합니다 결과를 읽을 수 있기 전에 실제로 추가를 수행하는 가산기,
이제와 같이 더 복잡한 어드레싱 모드 MOV AX, [DX+SI*4+10]
와 훨씬 더 복잡한 명령어가 있으며, MUL AX, operand
실제로는 결과를 계산하기 위해 CPU 내부에서 루프를 수행합니다.
여기서의 요점은 "원자 수준"은유가 CPU 명령 수준에 적합하지 않다는 것입니다. 실제 로직 게이트 레벨로 너무 멀리 가고 싶지 않은 경우 파이프 라인 단계 레벨에 적합 할 수 있습니다.