안녕하세요! WH입니다.
컴퓨터 구조론 정리해야지 해야지 하면서 미뤄왔는데,
진작 했으면 안해도 되었겠죠?
그렇지만 지금이라도 하니까요! 얼른 끝내 봅시다.
오늘은 명령어를 먼저 보면서 시작해 볼게요
명령어
1. sub $2, $1, $3 $ # Register $2 written by sub
2. and $12, $2, $5 # 1st operand($2) depends on sub
3. or $13, $6, $2 # 2nd operand($2) depends on sub
4. add $14, $2, $2 # 1st ($2) & 2nd($2) depends on sub
5. sw $15, 100($2) # Base ($2) depends on sub
이 명령어의 의도는 뭘까요? 우선 기본적으로 2-5 명령어는 첫 번째 명령어에 종속적이네요? 첫 번째 명령어에 따라 다른 모든 명령어가 바뀌길 바랐을 겁니다. 예를 위해서 sub 의 결과는 10 -> -20으로 바뀐다고 가정하겠습니다.
이를 데이터 패스와 함꼐 볼까요? sub가 실행되고 5번째 CC ( clock cycle )에서 $2의 값이 바뀝니다. 10 -> -20으로 말이죠. 그럼 우선 sub와 add 는 CC 5에서 Reg를 쓰고 있으므로 해저드가 발생할 수 있습니다. 그러나 이는 하드웨어적 설계로 해결할 수 있습니다. sub는 쓰기를, add 읽기를 시행하죠. 즉 설계시에 가정을 하는 겁니다. 레지스터를 반으로 나눠서 쓰기는 앞에서 읽기는 뒤에서 한다고요. 그럼 겹치는 부분 없이 해결이 가능하겠죠?
아 그래서 뭐할라고 이걸 가져온건데요? 집중하시길 바랍니다.
프로그래머 의도 : 2, 3, 4, 5 명령어 모두 $2 = -20 이라는 값을 의도 했습니다.실제 프로그램 : add 와 sw 를 제외한 나머지는 의도처럼 되지 않았다.
즉 and 와 or 는 CC 4와 CC 5 에서 reg 의 내용을 읽어 옵니다. 그래서 -20이 아닌 10 을 읽어오게 되는 것이죠. 이렇게 현재 수행중인 명령어가 이전 명령어에 종속되어 해저드가 발생하는 상황을 데이터 해저드라 합니다.
그럼 이런 데이터 헤저드는 어떻게 제거하냐. 크게 4가지 방법이 있습니다.
1. 전방전달
- 레지스터 파일에 반영되기 전에 EX 단계에서 계산된 결과를 다음 인스트럭션의 수행단계로 전달 ( 추가 H/W 필요 )
2. 지연
- 컴파일러 수준에서 해저드 발견하고, no-operation 명령어 삽입 후 기다리면 됩니다.
3. 비순차 실행
- 접근 중인 데이터와 관련 없는 명령어를 삽입하여 실행하고, 이후 레지스터를 바이패스하면 됩니다. ( 컴파일러 수준에서 코드 실행을 변경합니다 )
4. 프로그래밍 방식
- 변수를 늘리거나, 계산이 완료된 후 한번에 실행하는 방식으로, 레지스터를 고려하여 프로그래밍하면됩니다.
코딩 내용을 써드릴까하다가.. 뭐 거기까지는 필요 없을 듯하여서 뺐습니다.
데이터 해저드가 무엇인지 알고가는 글이 되셨길 바랍니다. 이상 WH 였습니다.
'컴퓨터 구조론( MIPS )' 카테고리의 다른 글
메모리 계층 구조 - cache 메모리 1 (0) | 2022.02.11 |
---|---|
프로세서 6 - 파이프라인 데이터 패스 및 제어 (0) | 2022.02.10 |
프로세서 5 - 파이프라이닝 개요 (0) | 2022.02.10 |
프로세서 4 - 데이터 패스 동작 (0) | 2022.02.10 |
프로세서 3 - ALU 제어와 주 제어 유닛 설계 (0) | 2022.02.09 |