재주문 버퍼 (ROB) 및 분기 추측을 사용하는 순서가 잘못된 실행 프로세서가있는 경우 ROB가 커밋을 수행 할 때까지 변경이 수행되지 않았 음을 이해합니다.재주문 버퍼 커밋
기능 단위 (FUs)의 결과는 공통 데이터 버스 (CDB)를 말하고 실행이 완료되면 ROB에 결과를 씁니다. 그런 다음 ROB는 분기가 성공적으로 예측되었는지 여부를 결정할 수 있으며 그렇지 않은 경우 ROB가 플러시됩니다.
필자가 이해할 수없는 것은 FU의 CDB 방송에서 가져온 예약 스테이션 업데이트가 어떻게 플러시/롤백되지 않아야하는지에 대한 것입니다.
addi $s1, $zero, 8
addi $s2, $zero, 9
addi $s3, $zero, 0
bneq $s1, $s2, L1
addi $s3, $s3, 1 // first increment
L1:
addi $s3, $s3, 2 // second increment
$ S3가 0으로 초기화 내가 (아마 가장 좋은)와 함께 할 수있는 예는 다음 분기의 미스 - 예측 결과가 1 씩 증가 $ S3의 원인 RS들에게 방송된다.
$ s3은 이제 2의 두 번째 증가분에 대해 실행을 시작할 준비가됩니다. 동시에 분기 미스 예측이 감지되고 ROB가 플러시되지만 덧셈기의 RS는 변경되지 않으므로 지금 $ s3이됩니다 잘못된 값을 가지며 ROB에 플러시되지 않습니다.
어떻게 해결 되나요?
내가 뭔가 중요한 것을 놓친 것 같아서, 나는 경험이 많지 않다. 나는 단지 졸업하고 수정하는 동안 이것을 내놓았다. 브랜치가 취해 같이 $s3
로 업데이트 (제 증분) 데이터 재정렬 버퍼에 버퍼링 될 것으로 실제 $s3
레지스터를 갱신하지 않을 것으로 예상된다
Intel CPU에서 적어도 ROB는 실행 대기중인 RS에있는 것을 포함하여 파이프 라인의 out-of-order 부분에있는 모든 기내 지침을 추적합니다. 따라서 명령은 코어의 순서가 잘못된 부분으로 발행 될 때 * ROB와 RS 모두에 추가됩니다. 나는이 디자인이 거의 보편적이라고 생각한다.당신은 당신이 여전히 투기 적으로 모든 명령을 추적 할 수 있어야합니다. –
아키텍처 상태 검사 점을 제안하는 "kilo-instruction window"(즉, out-of-order window> = 1k)에 대한 논문이 있으며, 현재 상태를 나타내는 예측 오류/예외를 발견하면 마지막으로 알려진 상태로 롤백됩니다 가짜입니다. 그러나 비판적으로 ROB가 큰 것은 필요하지 않습니다. 왜냐하면 ROB가 현재 상태에 어떻게 접근했는지 기억할 필요가 없기 때문에 검사 점으로 돌아가 정확한 예외를 지원하기 위해 다시 시도 할 수 있기 때문입니다. –