2016-11-30 1 views
2

재주문 버퍼 (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 레지스터를 갱신하지 않을 것으로 예상된다

enter image description here

+1

Intel CPU에서 적어도 ROB는 실행 대기중인 RS에있는 것을 포함하여 파이프 라인의 out-of-order 부분에있는 모든 기내 지침을 추적합니다. 따라서 명령은 코어의 순서가 잘못된 부분으로 발행 될 때 * ROB와 RS 모두에 추가됩니다. 나는이 디자인이 거의 보편적이라고 생각한다.당신은 당신이 여전히 투기 적으로 모든 명령을 추적 할 수 있어야합니다. –

+1

아키텍처 상태 검사 점을 제안하는 "kilo-instruction window"(즉, out-of-order window> = 1k)에 대한 논문이 있으며, 현재 상태를 나타내는 예측 오류/예외를 발견하면 마지막으로 알려진 상태로 롤백됩니다 가짜입니다. 그러나 비판적으로 ROB가 큰 것은 필요하지 않습니다. 왜냐하면 ROB가 현재 상태에 어떻게 접근했는지 기억할 필요가 없기 때문에 검사 ​​점으로 돌아가 정확한 예외를 지원하기 위해 다시 시도 할 수 있기 때문입니다. –

답변

0

. 오보가 검출되면 재주문 버퍼가 플러시됩니다. 어쨌든 결론을 내릴 때까지 원래의 레지스터는 업데이트되지 않으므로 재정렬 버퍼가 사용됩니다.

+0

OP는 이것을 알고 있으며 어떻게 완료되었는지를 상세히 묻습니다. 질문에 대한 내 의견이 OP가 찾고있는 것이 확실치 않아 아직 답변으로 게시하지 않았습니다. –

+0

@PeterCordes, 죄송합니다. 답변을 추가 할 때 귀하의 의견을 보지 못했습니다. 어쨌든 나는 분기 예측이 해결되기 전에 업데이트 된 가치를 가진 $ 3에 대한 심판으로 영업 이익이 투기 적 실행의 아이디어를 약간 놓쳤다 고 생각했다. –

+0

은 내 의견과 후속 생각을 대답으로 게시했습니다. –

0

Intel CPU에서 적어도 ROB는 실행 대기중인 RS를 포함하여 파이프 라인의 out-of-order 부분에있는 모든 기내 지침을 추적합니다. 따라서 명령은 코어의 순서가 잘못된 부분으로 발행 될 때 ROB 및 RS 모두에 추가됩니다.

이 디자인이 거의 보편적이라고 생각합니다. 당신은 당신이 여전히 투기 적으로 모든 명령을 추적 할 수 있어야합니다.


또한, 모든 지시는 가되어 잘못 추측 필요가 플러시 될 것으로 발견 지침에 따라 것을. 당신이 기술 할 때 전체 ROB를 플러시하고 마지막 비 - 추측 상태로 돌아가는 것이 확실히 쉽습니다.

그럼에도 불구하고 두 번째 추가 작업이 여전히 실행되어야한다고해도 잘못된 추측은 입력이 잘못되었을 수 있음을 의미합니다. 그래서 당신이 말하는 문제를 정확히 피하기 위해서 플러시가 필요합니다.

+0

고마워, 나는 아마도 OOO 실행이 기본 블록에서만 수행 될 수 있다고 생각했었다. 어떤 종류의 목적을 저지르는 커밋 또는 모든 것이 플러시 (RS, FU 및 ROB)로 끝나고 PC를 올바른 것으로 리셋 주소. – alex10791

+0

@ alex10791 : 고급 설계는 플러시되어야 할 명령어를 추적 할 수 있으며, 예측 오류가 해결되는 동안 분기 예측 실패로 인해 영향을받지 않은 명령어를 계속 실행할 수 있습니다. 나는 인텔이 이것을 소개했을 때를 잊어 버린다. 그러나 지난 10 년 이내에 나는 생각한다. 1 세대 P6은 잘못된 예측이 발견 될 때 모든 추론 적 uops (지침)를 버려야했습니다. (저는 실제로 CPU 디자이너가 아닙니다. 어떻게 작동하는지 알기에 최적화 할 수 있습니다. 일부는 지나치게 단순화되었습니다.) –

+0

@PeterCordes는 이러한 선택적인 플러시가 실제로 피할 수 있음을 의미합니까? 인텔의 프로그램 순서에서 잘못 예측 된 지점 이후의 지침을 플러시 할 수 있습니까? 즉, 다음 명령을 뛰어 넘었을 때 그 명령을 취하지 않을 것이라고 예상했지만 실제로 취해지면 결국 같은 명령을 실행하게됩니다. CPU가 나중에 명령이 결과에 의존하지 않음을 알 수 있습니까? 오보? 또는 잘못 예측 한 후에 모든 것을 플러시 할 수있을만큼 똑똑한 훨씬 간단한 경우를 말하지만, 모든 것을 그대로 남겨 두는 것 (즉, 기계를 깨끗하게하는 것)을 의미합니까? – BeeOnRope