분류 전체보기 11

[컴퓨터 구조] 제 5장. 메모리 계층 사용

Principle of Locality 프로그램들은 그들이 최근에 사용한 data와 instructions과 똑같거나 근처의 주소들을 사용하는 경향이 있습니다. Temporal locality item을 썼다면, 짧은 시간 안에 다시 참조될 경향이 있다는 것입니다. e.g.) 반복문 안에 있는 instructions Spatial locality item을 썼다면, 가까운 주소지를 읽을 확률이 높다는 뜻입니다. (순차적) → 다른 item을 참조 배열, 순차적인 instruction 접근 Principle of Locality: Example 예를 한 번 봅시다. 위의 코드가 있을때 sum변수가 Temporal Locality a 배열이 Spatial locality가 되는 것입니다. Taking Adv..

컴퓨터구조 2023.04.17

[컴퓨터 구조]제 4장. Pipeline(2)

Pipelined Datapath RISC-V has a five - stage pipeline (IF, ID, EX, MEM, and WB) Pipelining을 Datapath로 나타내면 위 그림과 같습니다. Pipeline Registers Pipeline에서는 각 stage 사이에 레지스터를 필요로 합니다! → 이전 cycle에서 만들어진 정보를 가지고 있어야 하기 때문이죠. 이를 Pipeline Register이라고 합니다. 이 레지스터들은 들어오는 모든 data들을 저장할 수 있을 만큼 충분히 커야 합니다! 예를 들어, IF와 ID 사이에 있는 레지스터를 IF/ID Register이라고 합니다. 만약 32-bit architecture라면, 해당 레지스터는 64bit(32-bit instruc..

컴퓨터구조 2023.04.09

[컴퓨터 구조]제 4장. Pipeline

Overview of Pipelining Pipelining은 실행 시에 여러 명령들이 중첩되는 구현 기술입니다. 현재 pipelining기술은 보편적으로 사용되고 있습니다. 예를 들어,non-pipelined Version에서 세탁물을 예시로 든다면 이렇게 되지만 Pipelined Version에선 이런 식으로 시간이 훨씬 줄어든 것을 볼 수 있습니다. Pipelining에선 stages라고 불리는 모든 단계들이 동시에 작동합니다. 그래서 위의 Non-pipelined Version에선 총 16 times이 걸렸고, 아래의 pipeline에선 총 7 times이 걸렸습니다. → 따라서 16/7= 약 2.3배가 빨라졌고 이러한 빨래물들의 양이 무한하다면 4n/(n+3) = 약 4배 가량 빨라집니다. Pi..

컴퓨터구조 2023.04.08

[컴퓨터 구조]제 2장. 명령어(Instruction) : 컴퓨터의 언어(3)

Procedure calls procedures는 프로그래머가 한 번에 작업의 한 부분만 집중하게 해 줍니다. procedure는 엄연하게 함수와는 다르지만 여기선 같다고 생각해 주시면 될 것 같습니다. 위의 c언어 코드를 아래로 나타낼 수 있습니다. 추가 예시) caller : procedure을 호출합니다. callee : procedure입니다. caller는 callee에게 argument(실인자)를 줍니다. callee는 caller에게 결괏값을 return 해줍니다. 즉 추가 예시에서 f1 procedure는 caller이자 callee인 거죠. Procedure Execution 프로그램은 procedure의 실행에서 6가지 스텝을 따라야 합니다. procedure가 접근할 수 있는 장소에 ..

컴퓨터구조 2023.04.08

[컴퓨터 구조]제 2장. 명령어(Instruction) : 컴퓨터의 언어 (2)

Registers vs Memory 레지스터는 메모리에 비해 access 속도가 더 빠르다. Risc-V에서 메모리에 있는 데이터는 arithmetic instructions에 바로 접근하지 못합니다. → 메모리 데이터는 실행을 위해 loads와 stores가 필요합니다. 즉 더 많은 instruction이 실행되어야 하죠. 메모리는 실행을 위해 BUS를 통해야 한다. 컴파일러는 가능한한 레지스터를 통하여 변수를 처리하여야 한다. 즉 덜 자주사용 되는 변수는 memory로 spill 해야 하며, 이 과정을 Spilling Register이라고 합니다. → 그렇기에 Register Optimization은 중요합니다. 즉 덜 자주사용 되는 변수는 memory로 spill 해야 하며, 이 과정을 Spilli..

컴퓨터구조 2023.04.08

[컴퓨터 구조]제 2장. 명령어(Instruction) : 컴퓨터의 언어

Instruction Instruction (명령어) Instruction은 processor(CPU)의 작동을 설명하는 가장 basic command입니다. 컴퓨터에게 일을 시키는 단위로, 기계어로 이루어진 명령입니다. (컴퓨터의 언어) 즉 하드웨어와 소프트웨어의 interfacing(인터페이싱)을 담당합니다. Instruction은 Opcode와 Operands로 이루어져 있습니다. Opcode (i.e., operation code) : 하드웨어가 어떤 작업을 할 지에 대한 명령어 -Operands : 하드웨어가 어떤 대상에 대해 작업을 할지에 대한 명령 add $2, $4, $2가 있을 때, add는 opcode가 되고 $2 $4 $2는 operand가 됩니다. 이것을 이진수로 나타내었을 땐 00..

컴퓨터구조 2023.03.17

[컴퓨터 구조] 제 1장. 컴퓨터 추상화 및 기술

Classes of Computers - Personal computers (PCs) 일반적인 목적과 다양한 소프트웨어 비용과 성능의 tradeoff을 필요로함. - Servers 보통 네트워크를 통해 연결됨. 높은 용량, 높은 성능, 그리고 높은 신뢰성 작은 것부터 빌딩 크기까지의 사이즈 Low-end : 작은 비즈니스나 웹서비스 High-end : 100~1000개의 프로세서와 테라바이트의 메모리 페타바이트의 저장소를 가지고 있는 슈퍼컴퓨터나 데이터센터 -Embedded computers 다른 장치 내부의 컴퓨터 Post-PC Era 현재 PC는 personal mobile devices(PMDs)로 대체되고 있습니다. 기존의 서버에서 cloud computing으로 넘어가고 있습니다. Post-PC..

컴퓨터구조 2023.03.16

boj 1781(컵라면)

틀린 코드 import sys input = sys.stdin.readline N = int(input()) arr = [] for _ in range(N): arr.append(tuple(int (x) for x in input().split())) arr.sort(key=lambda x: (x[0],-x[1])) sol = 0 a, b = arr[0][0],arr[0][1] sol+= arr[0][1] for i in range(1,len(arr)): if(arr[i][0]>a): a = arr[i][0] sol+=arr[i][1] print(sol) 반례: 9 5 5 4 6 4 12 3 8 4 18 2 10 2 5 1 7 1 14 -사고 과정- 위의 반례를 예시로 들면 저걸 내림차순으로 정렬을 합니..

문제풀이/백준 2023.03.01

boj 10775(공항)

틀린 코드 import sys input = sys.stdin.readline G = int(input()) P = int(input()) arr = [True]* G g = [] ans = 0 for _ in range(P): g.append(int(input())) for i in range(0,len(g)): req1 = g[i] sig=0 for j in range(req1-1,-1,-1): if(arr[j]==True): arr[j]=False ans+=1 sig=1 break if(sig==0): print(ans) exit() 처음 생각한 코드입니다. 하지만 이 코드는 거의 brute force와 같아 시간 복잡도가 너무 높고 실제로 백준에 제출하였을 때도 시간초과가 나오게 되었습니다. 코드..

문제풀이/백준 2023.03.01

BOJ1461 (도서관)

1. 제일 큰 수는 왕복이 아닌 편도로 가게 하자! 2. (1) 모두 음수인 경우 (2) 모두 양수인 경우 (3) 절대값이 가장 큰 수가 음수이고 양수가 존재하는 경우 (4) 절대값이 가장 큰 경우가 양수이고 음수가 존재하는 경우 이렇게 4개의 경우를 나누어 코드를 작성했습니다. a,b = map(int,input().split()) list1 = list(map(int,input().split())) list1.sort() result =0 list2=[] list3=[] #음수와 양수를 따로 계산하자. for i in list1: if i < 0: list2.append(i) #음수 else: list3.append(i) #양수 if not list2: result+=list3[-1] for i in..

문제풀이/백준 2023.02.16