목록2학년 2학기/컴퓨터 구조 (47)
오래 못 할 짓 하지 않기

Single CLK cycle - Datapath 한 stage에서 나온 결과값을 다음 stage에 전달해주기 위해서는 사이에 Register가 필요하다 주로 이런 그림으로 표현할 때 왼쪽을 색칠하면 Reg Write / 오른쪽을 색칠하면 Reg Read로 이해하면 된다. Pipeline에서 LW를 실행했을 때 Datapath를 분석 1. Inst fetch - PC값을 읽고, ADDER와 MUX를 통해서 PC+4값을 새로 write한다. - Inst 메모리에서 명령어를 읽고, 해당 명령어를 다음 단에 넘겨주기 위해 Stage 사이에 있는 Register에 write한다. 2. Inst decode - IF에서 넘어온 2개의 Register 값을 읽고, Extension한 비트를 계산하여 target a..

Pipeline ● 목적 : 전체 작업을 하는 데 걸리는 시간을 줄임 → [ CPU의 성능 향상 ] ● 특징 : 여러 개의 명령어를 동시에 실행한다 single : 하나의 일은 무조건 @시간 만큼 해라 Multi : 빨리 끝나면 바로 그 다음 거 해라 Processing을 구조를 그림으로 보면 [ Sequential ] [ Pipeline ] 직관적인 예시로는 노래방에서 차례대로 노래 부르는 거 / 돌림노래 부르는 거 차이라고 생각하면 된다. Pipeline 특 하나의 작업이 빨리 끝나게 도와주는 게 아니라 전체 작업을 빨리 끝내는 거다 (퇴근 일찍 할 수 있게 해주는 거임) 다른 영역의 일들을 같은 시간대에 작업한다 시간이 줄어들 확률 = Pipe로 나눈 영역의 개수 Pipeline으로 나눈 것들 중에..

( Single datapath에 있는 명령어들이 어떤 흐름으로 돌아가는지 파악 해야함 → pdf 4-1 49페이지부터! ) Single CLK cycle Single CLK cycle은 모든 연산이 한 번에 돌아가야한다. 따라서 모든 것이 한 번에 될 때까지 기다려야함. → ALU가 여러 개가 있으므로 각각에 연산이 될 때까지 기다려야함. CLK time은 Datapath 중에 가장 긴 놈으로 맞추어서 작동함. 주로 오래 걸리는 건 아래와 같은 것을 수행할 때다. 이것과 관련해서 생각해보면 위에 있는 3개의 연산을 다하는 LW가 가장 오래 걸린다. 이러한 점이 Single CLK Cycle의 문제점이라고 할 수 있다. 복잡한 Inst일 땐 어떡할거냐 / 명령어마다 필요한 시간이 다름. 낭비되는 Chip..

Data path 특 ) Instruction 이 정해져야 정렬됨. = 어느 길로 갈지 정해진다 이 말 우리는 아래에 있는 명령어들만 고려할 예정 주로 명령어가 실행되는 형태는 [ Fetch -> Execute ] 1. PC를 이용하여 Instruction address 를 가져온다. 2. 그 address를 통해서 Memory로부터 Instruction를 IR로 가져온다. 3. IR레지스터에 있는 값을 읽는다. 4. 그 값을 통하여 어떤 것을 수행할지 정한다. 그럼 각각의 명령어가 위에 있는 형태에서 어떻게 맞춰지는지 보자 ADD 1. PC 주소를 이용하여 IR 레지스터에 메모리로부터 값을 가져옴 2. 읽은 결과 add이므로, 연산을 한다. 3. 다음 PC값을 가리킨다. SUB 1. PC 주소를 이용하..

Single-Precision 에서 숫자의 범위를 본다면 ( * Exponents 에서 00..00이랑 11..11은 특정한 목적에 따라 사용함 ) - 가장 작은 값 ● Exponent 는 00000001부터 가능하므로, 1 - 127 = -126 ● Fraction : 0000..00 일 때 가장 작음 - 가장 큰 값 ● Exponent 는 11111110부터 가능하므로, 254 - 127 = 127 ● Fraction : 111..11 일 때 가장 큼 [ 생각해볼 것 1 ] 만약 32비트 모두가 0이면? -> 그냥 숫자 0을 나타내는 것이다. ** 1.0 * 2^-127로 오해하지 않기! [ 생각해볼 것 2 ] Underflow : 큰 숫자 말고, 작디 작은 숫자는 큰 정확성을 요구한다, 하지만 그걸..

문제 1) 함수 안에 구현 어떤 상황일 땐 @ 다른 상황일 떈 #으로 할 경우 → slt로 0이나 1로 설정해주고, beq로 전개할 수 있다. answer slt $t0, $a0, $a1 // a와 b를 비교하여 [ a가 크면 1, 아니면 0 ]을 t0에 넣는다. beq $t0, $zero,label // t0에 들어가있는 게 0과 같으면 label로 넘어간다. add $v0 ,$a1 , $zero // return을 위한 v0에 a1을 넣는다. Move하는 기능임 그냥 j out // 함수 탈출을 실행하는 곳으로 보냄 (아니면 label 진행됨) label : add $v0,$a0,$zero // return을 위한 v0에 a0을 넣는다. Move하는 기능 out: jr $ra // 함수 탈출 저 32..

Floating Point Number 로 표현할 수 있는 수 - 소수/분수 - 매우 작은 숫자 ex) 0.000001 - 매우 큰 숫자 ex) 3.15 * 10^8 구현법 1) Scientific notation : 숫자가 소수점으로 있고 Base number(decimal point)와 함께 있음 * 왼쪽에는 1의 자리 이하여야 함. = 소수점 이전에 숫자 하나만 가능 ex) 13.775(X) / 1.345(O) / 0.345(O) 2) Nomalized scientific notation : 소수점 이전 숫자가 1 부터 9까지 가능 * 위에서 0.xx이거만 안 된다 생각하면 됨 1 이상이어야 함 ex) 13.775(X) / 1.345(O) / 0.345(X) + 2진수같은 경우에는 0이나 1밖에 없..

DIVISION은 Shift Left와 Subtract로 이루어진다. 일반적으로 우리가 나눗셈을 할 때를 생각해보자. Divisor = A Dividend = B B-A 의 값을 보고 몫이 될지 정하는데, 우선 B의 가장 큰 자릿수부터 훑으면서 간다. - 1- 1000 은 X 그럼 첫번째 1위에는 0 - 10- 1000도 X 두번째 0위에도 0 ... - 1001 - 1000 은 가능! 그 위에 1 그 연산을 하면 아래에 값은 10이 남는다. - 10 - 1000도 X 그 위에도 0 (현재 몫 00010) - 101 - 1000도 X 그 위에도 0 (현재 몫 000100) - 1010 -1000 가능 그 위에 1 ( 몫 (000)1001 ) 나머지는 1010-1000인 10 계산 알고리즘은 이렇다. 내가..

두 수의 곱은 add와 shift 연산으로 구현할 수 있다. = Mul : add + shift 물론 이렇게 진리표를 그려서 할 수도 있음. 하지만 이건 3비트 숫자 2개를 할 때는 쓸만하겠지만, 비트수가 많아지면 답이 없음. 우선 일반적인 곱셈을 생각해보자. 가장 첫번째로 오는 것은 1) 312 * 3 을 먼저 곱하고, 그 아래에 더해준다. ( add ) 2) 그리고 그 다음에 312*0 결과를 더할 곳은 한 칸 뒤로 밀어준다 ( Shift ) 3) 312*0 결과를 한 칸 밀린 곳에 더한다. ( add ) 4) 한 칸 민다 ( Shift ) 5) 312*2 를 계산하고 그 밀린 칸에 더한다 ( add ) binary multiplication도 같은 매커니즘으로 가면 된다. 1) 먼저 0100 * 1..

1 a) add R3, R2, R1 이 명령어를 수행한 이후에 각 레지스터에 어떤 값이 있는가? → R3에 R2+R1값을 넣는 것이다. 즉, R3외에는 변하는 값이 없음. R1 = 12 , R2 = 16 , R3 = 12+16 = 26 b) load R3 , 12(R1) 이 명령어 수행 후에 R1과 R3 레지스터에는 어떤 값이 있는가? → R3 에 ( R1의 값 + 12 ) 주소에 있는 값을 넣어주는 것이므로 R3만 변한다. R1 = 12 , 12 +12 = 24 , 메모리에서 24 주소에 있는 값은 28. c) addi R2 , R3 , #16 이 명령어 수행 후에 레지스터에는 어떤 값이 있겠는가? → R2 에 , R3의 값 +16을 넣는 것이다. R2 = R3 +16 = 20 +16 = 36 Stor..