Hazard

Hazard란?

다음 사이클에 다음 명령어를 실행하지 못하는 상태

Structure hazard

어떤 명령어를 실행하기 위한 리소스가 이미 사용 중이어서 실행하지 못하는 상태

예시) 싱글 메모리를 사용한다고 가정. Load/Store 명령어가 데이터를 가지고 오려고 할 때 해당 메모리에 액세스 함. 그 후 다음 명령어를 가지고 오려고 메모리에 액세스 하려고 하지만, 이전 명령어의 데이터 Load로 인해 대기를 해야 함.

즉 프로세서의 구조에 의해 발생하는 hazard므로, 이를 structure hazard라고 함. 예시에서는 프로세서가 싱글 메모리 구조로 인해 hazard가 발생

Data hazard

data dependency에 의해 발생. 이전 명령어의 데이터(결과값)를 사용해야 하는데, 아직 작업이 완료되지 않아서 명령어를 실행하지 못하는 상태

예시)

add   $0, $t0, $t1
sub   $t2, $s0, $t3

sub의 $s0은 이전 연산인 add의 값이 연산 된 후의 최신값으로 연산을 해야 한다. 이를 파이프라인으로 보면

add가 실행 된 후 결괏값을 레지스터에 저장을 할 때, sub의 ID가 실행이 된다. 즉 add의 IF후가 아닌 2사이클이 지난 후에 sub가 실행된다.

해결 방법

Forwarding 방식: 어떤 결괏값을 메모리에 저장하고, 레지스터에 등록하는 과정을 거치는 것이 아닌, 바로 값을 사용하는 방식

Load-Use Data Hazard

Forwarding 기법으로 언제나 대기하는 것을 막을 수 있는 것이 아님.

Load 명령어의 경우, Ex가 아닌 MEM일 때 결괏값이 나옴. 하지만 sub명령어는 ID일때 결과값이 필요.

Control hazard

이전 명령어에 따라서 Control Action이 결정될 때 발생. MIPS에서는 beq 명령어에 의해 발생

해결방법

beq 명령어를 실행한 후, 바로 다음 명령어를 실행. 만약 beq의 값이 맞지 않는 경우, 명령어 주소로 이동하여 명령어 실행. 명령어가 맞지 않는다면 정지가 발생하지 않음.

 

'컴퓨터 구조' 카테고리의 다른 글

파이프라인과 DataPath, Control  (2) 2023.11.09
Pipeline의 개념과 성능  (0) 2023.07.11
ALU Control  (0) 2023.07.11
프로세서의 명령어 실행 과정  (0) 2023.07.07
실수의 표현과 연산  (0) 2023.07.06