2014-12-30 3 views
1

명령 (들)를 작성, 당신은 지연 슬롯 (들)에 배치 할 아래의 조립 순서에 지연된 지점 슬롯

(A) 여기

ADD R5 <- R4, R3 
OR R3 <- R1, R2 
SUB R7 <- R5, R6 
J X 

Delay Slots 

LW R10 <- (R7) 
ADD R6 <-R1 , R2 
X: 

지연 슬롯이 2
입니다 그러나 지점 조건이 무엇인지 알지 못했습니까? 그것입니까 X로 이동 ??? 그렇다면 지연 슬롯에 2 명령어를 배치하는 방법은 무엇입니까? "Before"또는 "Target"또는 "Fall Through"로부터 지시를 내리기 위해서는 Branch 조건과 비교할 필요가 있습니다. 충돌이 없다면, 우리는 그러한 지시를 할 수 있습니다. J의 의미를 알 수 없음
Ans : ADD 및 OR 지침 BEQ R5 <

(B)

ADD R5 <- R4, R3 
OR R3 <- R1, R2 
SUB R7 <- R5, R6 
BEQ R5 <- R7, X 

    Delay Slots 

LW R10 <- (R7) 
ADD R6 <- R1, R2 

는 - R5와 동일한 X + R7 다음 지점 X를 취할 경우 R7은 X 의미? 그렇다면 R7 값이 변경되므로 SUB 명령을 사용할 수 없습니다. R5가 바뀔 때 ADD도 사용할 수 없습니다. (둘 다 Branch에 종속됨을 의미 함). OR, LW 및 ADD R6 < - R1, R2는 분기에서 독립적입니다. 그러면 왜 LW와 ADD가 아닌가?
Ans가 말합니다 : OR 및 NOP.

이러한 문제를 안내해주십시오.

+1

어떤 아키텍처입니까? 태그를 업데이트하여 사용중인 아키텍처가 주어진 코드에서만 즉시 나타나지 않도록하십시오. –

+0

첫 번째 대답은 잘못 보입니다. 후자가 필요하면'SUB '를 지나서'ADD'를 어떻게 움직일 수 있습니까? – Jester

+0

칩 종류를 알려주십시오. –

답변

2

(A)의 경우 J X은 단일 고정 레이블 (아마도 ISA에서 제공하는 범위 내)에 무조건적인 점프이므로 이전 지침에 대한 데이터 종속성이 없습니다. 이 사용할 수있는 무료 레지스터가있는 가정 (변경해야하고 것 OROR의 목적지 후 이동하는 경우 ADD 이후

OR의 결과에 이름 의존성을 가진 후 이동하는 것이 스케줄링면에서 자유롭거나 나중에 R3에서이 값을 사용하여 OR의 대상으로 사용되는 레지스터를 사용하는 지침을 변경하여 제거 할 수 있습니다. 이는 비교적 복잡한 변화이며 아마도 고려 대상에서 제외됩니다.

SUB은 데이터가 ADD에 종속되므로 프로그램 순서에서 그 다음에 남아 있어야합니다. 따라서 두 지연 슬롯은 OR R3 <- R1, R2; SUB R7 <- R5, R6 또는 SUB R7 <- R5, R6; OR R3 <- R1, R2으로 채울 수 있습니다.

점프 무조건 특성도 더 하강 연결 경로가 없다는 것을 의미한다 (ADD R5 <- R4, R3; OR R3 <- R1, R2이 때문에 SUB 명령에 R5의 데이터 의존성을 허용한다. ADD R5 <- R4, R3; SUB R7 <- R5, R6 때문에 R3의 이름 의존도 허용된다); 점프는 항상 취해집니다. 지연 슬롯 이후의 명령어는 점프 명령어에 도달하는 경로에서 실행되지 않습니다 (무조건 점프 은 항상으로 점프됩니다). 따라서 지연 슬롯에서 사용하더라도 예외를 발생시키지 않거나 점프 이후에 사용 된 레지스터를 덮어 쓰지 않습니다 지연 슬롯에서 NOP를 사용하는 것에 비해 얻게되는 이점은 없다.

(예제 코드 시퀀스의 첫 번째 부분은 if-then-else 문의 then 절이 될 수 있으며 else 절의 시작이 될 LW R10 <- (R7)으로 점프되는 조건부 분기로 진행됩니다. 즉, 그 코드는 접근 가능할 수 있지만 표시된 코드 앞의 선택된 브랜치에 의해서만 도달 할 수 있습니다.)

무조건적인 성격이란 컴파일러가 X 레이블의 다른 모든 경로에도이 대상에서 해당 점프의 지연 슬롯으로 이동/복사 된 명령이 포함되도록해야하지만 컴파일러는 대상에서 명령을 가져올 수 있음을 의미합니다.

제공 대답 (ADD R5 <- R4, R3; OR R3 <- R1, R2는) SUB R7 <- R5, R6ADD 전에 이동하는 잘못된 결과를 생성 할 수 있도록 ADD 지시에 따라 데이터가 특히 이후, 단순히 잘못입니다!

(B)의 경우, BEQ R5 <- R7, X은 보통 if R5 == R7 goto X; R5 = old_PC+length(BEQ R5 <- R7, X)을 의미하는 비정상적인 명령, 즉 분기 및 링크 명령입니다. 어쨌든 R5에 쓰여지는 것은 중요하지 않습니다. 단지 지점이 R5를 덮어 쓰면 명령 스케줄링이 제한된다는 것입니다.

분기 명령은 R5를 덮어 때문에

SUB R7 <- R5, R6 즉 상기 SUB은 이름 의존도를 가지고 (분지 후 이동 될 수 없다 BEQ R8 <- R5, R7, X는 R8은 무료 등록 및 R5 이후 사용이 R8로 변경된이었다 유효한 형태 (였다면)이 이름 의존성은 피할 수 있습니다.

분기가 'ADD R5 < - R4, R3'에 종속 된 데이터이므로 해당 명령어를 지연 슬롯으로 이동할 수 없습니다.

R6의 현재 값이 취해진 분기 경로의 명령어로 읽히지 않는 경우, ADD R6 <- R1, R2을 폴스 스루 경로에서 두 번째 지연 슬롯으로 끌어 올 수 있습니다 (ADD가 오버플로와 같은 예외를 생성 할 수 없다고 가정) . 이것은 분기가 수행되지 않을 때만 성능을 향상 시키지만 슬롯을 NOP로 채우는 것보다 더 나은 것으로 간주됩니다 (어느 경로에도 도움이되지 않음).

지연 슬롯 중 하나에 LW R10 <- (R7)을 이동하면 R5 == R7 일 때로드가 피할 수있는 지점에서 피할 수있는 보호 오류가 발생할 수 있으므로 문제가 더 많습니다. (기술적으로 런 타임 시스템은 실행 파일과 함께 제공되는 추가 디버그 정보를 살펴봄으로써 누락 된 경로에서로드가 끌어 올려 졌는지 확인하고 분기가 수행되는지 확인하고 R10을 0으로 설정하여 부적절한 보호 오류를 처리 할 수 ​​있습니다 사용 권한 위반을 피하기 위해) X에서 실행을 재개하십시오. 그러나 이름 종속성을 피하기 위해 레지스터 이름을 변경하는 것보다 더 극단적 인 조작이 필요합니다.) 조건부 분기 대상 또는 통과 경로의 명령어 사용 일반적으로 예외 동작을 유지해야합니다. 즉, 분기를 실제로 가져 가면 예외 처리를 생성 할 수있는 명령이 없습니다 (순서가 변경되지 않으면 발생하지 않는 예외가 순서 변경과 함께 발생하기 때문에). 마찬가지로 분기가 실제로 없으면 예외가 발생합니다. 타겟 경로로부터 어떠한 명령도 예외를 생성하도록 허용 될 수 없다.

대상 경로에 대한 정보가 없으면 SUB R7 <- R5, R6R6의 마지막 리더 (즉, 그 시점 이후에 R6이 사망 함)인지 여부를 확인할 수 없습니다. 그러나 어떤 명령어가 소스로 사용되기 전에 대상 경로에 R6을 사용하여 대상 경로에서 명령어를 찾은 경우 R6은 죽을 것이며 (ADD은 예외를 생성 할 수 없다고 가정) ADD R6 <- R1, R2은 지연 슬롯 중 하나에서 사용될 수 있습니다 .

ISA (및 사용되는 opcode에 따라 MIPS는 부호있는 덧셈 명령어에 대한 오버플로 예외를 가지지 만 부호없는 비트에 대한 오버플로 예외는 없습니다. 그렇지 않으면 2의 보수 형식이 사용되기 때문에 결과는 동일합니다.) 덧셈은 오버플로 예외 그러나 나는 그런 경우가 아니라고 생각했다).하드웨어에 의해 구현 된 어떤 형태의 메모리 보호로 메모리 읽기는 보호 예외를 생성 할 수 있습니다. 일반적으로 컴파일러는 브랜치가 (배열의 끝을 지나가거나 널 포인터를 참조 해제하는 것과 같은) 보호 예외를 막을 수 있다고 가정해야하므로 일반적으로 대상에서 메모리 액세스를 사용할 수 없습니다 (분기 그렇지 않으면 분기가 취해질 수 있습니다. (가상 메모리 시스템에서 불필요한 페이지 폴트를 피하려면 일반적으로 성능 향상이 필요하지만 정확성은 반드시 필요하지 않을 수도 있습니다.)

앞서 언급했듯이 다소 정교한 런타임 시스템은 최소한로드시 이러한 예외를 수정할 수 있지만 그러한 "영웅적"조치는 아마 이런 유형의 운동의 범위 밖에서 고려된다.

일부 경우 컴파일러는 조건부 분기에 의해 보호되는 경우에도로드가 안전하다는 것을 결정할 수 있지만 (예 : 현재 스택 프레임 내의로드) 컴파일러는 일반적으로 컴파일러가 그러한 메모리 액세스의 안전성. 로드가있는 경로가있을 경우 컴파일러는 지연 슬롯에서 프리 페치 명령어를 사용하여 캐시 누락 대기 시간을 줄일 수 있습니다. 그러나이 예에서 프리 페치는 스칼라 파이프 라인을 가정 할 때 누락 대기 시간을 2 사이클 만 줄입니다. 프리 페치는 캐시 적중 또는 보호 위반에 대한 멍청한 행동입니다. 따라서 이러한 옵션은 분기를 사용할 때 캐시 미스 (cache miss)를 도입하여 성능을 저하시킬 수 있지만 예외 동작과 관련하여 안전합니다. R6가 죽은 경우 SUB R7 <- R5, R6 (오버 플로우 예외는 문제가되지 않습니다) 후

그래서 지연 슬롯 중 하나 OR R3 <- R1, R2; ADD R6 <- R1, R2, OR R3 <- R1, R2; OR R3 <- R3, R3 (즉, ORNOP)이거나 수 있습니다. 주어진 대답은 컴파일러가 R6이 죽었다는 것을 결정할 수 없다고 가정하는 것으로 보입니다. 이는 취해진 경로의 코드에 대한 지식이없는 합리적인 가정입니다. (실제로 컴파일러는 해당 코드를 검사 할 수 있고 R6은 죽었을 수도 있고 아닐 수도 있습니다.)

+0

나는 당신의 요점을 알았지 만, 철저한 지시 사항 인 LW와 ADD R6 <-R1, R2를 혼동하여 여전히 혼란 스럽다. 두 예제 모두에 대해이 2 가지 지침에 대해 설명 할 수 있습니까? – user1745866

+0

@ user1745866 편집은 예외 동작을 유지할 필요성을 명확히 했습니까? 아니면 추가 문제를 추가하여 * 더 * 혼란스럽게 만드시겠습니까? –

+0

고마워요, 나는 당신의 두 점을 얻었습니다! :) – user1745866