분류 전체보기 262

[컴퓨터 구조] 8. 파이프 라인 해저드

파이프 라인 기술로 구현된 명령 처리 과정에서 발생할 수 있는 해저드 종류는 다음과 같다. 1. 구조적 해저드 CPU 자원의 한계로 사용할 수 있는 내부 버스는 동시에 사용될 수 없다. 동일한 레지스터/메모리 조각에 동시에 쓰려고 하는 경우가 그 예가 된다. 2. 데이터 해저드 두 명령어에서 사용되는 레지스터들이 의존적 관계가 있을 때 성립한다. 다음 명령어들을 보자. sub x2, x1, x3 and x12, x2, x5 or x13, x6, x2 add x14, x2, x2 sd x15, 100(x2) 마지막 네 명령어 모두 첫 번째 명령어의 레지스터 x2의 결과에 종속적이다. 실제 파이프라인 과정에서 정상적으로 읽고 써지는 단계는 마지막 두 단계, add와 sd인데 add의 경우 x2를 읽으려 할 ..

[컴퓨터 구조] 7. 파이프 라인된 데이터 패스

파이프라인된 데이터 패스의 경우 각 단계를 분리하기 위한 파이프라인 레지스터가 존재한다. IF/ID : IF와ID 단계를 분리하는 레지스터 ID/EX : ID와 EX 단계를 분리하는 레지스터 EX/MEM: ID와 MEM 단계를 분리하는 레지스터 MEM/WB: MEM과 WB 단계를 분리하는 레지스터 ld 명령어의 데이터 패스 예제 1. 명령어 인출 Instruction Fetch PC에 저장된 주소를 이용하여 명령어를 메모리에서 읽어와 IF/ID 레지스터에 저장한다. PC 는 4만큼 증가하여 저장되고 이 값이 IF/ID에도 저장된다. beq와 같은 명령어 처럼 나중에 사용될 수 있기 때문이다. 2. 명령어 해독 Instruction Decode Read register 1, 2 그리고 수치 값 ImmGen..

[컴퓨터 구조] 6. 명령어 파이프라이닝

기본적인 단일 사이클에서 명령어 단계 (4단계) 1. 명령어 인출(IF) : 다음 실행될 명령어를 기억장치로부터 가져온다. 2. 명령어 해독(ID) : 제어 유닛의 해독기에서 명령어의 opcode를 해석한다. 3. 오퍼랜드 인출(OF): 연산에 필요한 오퍼랜드의 데이터를 기억장치로부터 인출하는 단계 4. 실행(EX): 해독기에서 정해진 연산을 수행하는 단계 --- RISC-V 명령어 단계 (5단계) 1. 메모리에서 명령어를 가져온다. 2. 명령어를 해독하는 동시에 레지스터를 읽는다. 3. 연산을 수행하거나 주소를 계산한다. 4. (필요하면) 데이터 메모리에 있는 피연산자에 접근한다. 5. (필요하면) 결과값을 레지스터에 쓴다. 예시) 산술 연산 명령어 add x1, x2, x3 1. 명령어를 메모리에서 ..

[컴퓨터 구조] 5. CPU 성능 측정

컴퓨터 성능을 의미하는 단어 실행시간(응답시간): 컴퓨터가 작업을 완료하기까지 걸린 시간을 의미, 디스크, 메모리, 접근, 입출력 작업, 운영체제 오버헤드 및 CPU 시간 등을 모두 포함 처리량(대역폭): 일정시간 동안 처리하는 작업량 CPU 성능 CPU 실행시간: 특장 작업의 실행을 위해 CPU가 소비한 시간 클럭주기 CPU의 클럭이 한 사이클에 걸리는 시간을 의미한다. 클럭 속도는 1초당 클럭 사이클 수를 뜻하며 클럭 주기의 역수이다. ex) 4GHz 클럭속도의 주기는 250ps CPU 성능 측정 프로그램의 CPU 실행 시간 = 프로그램(을 실행하는 데 걸린 CPU) 클럭 사이클 수 X 클럭 주기 명령어 성능 실제 프로그램을 실행하는 절차는 명령어의 처리와 관련이 있다. 어떤 프로그램의 실행에 필요한..

[컴퓨터 구조] 4. 명령어 실행

관련 포스트 2021.01.12 - [Operating System] - [운영체제] 명령어 구조와 사이클 / 인터럽트 / 커널 [운영체제] 명령어 구조와 사이클 / 인터럽트 / 커널 독학사- 운영체제 편을 공부하고 정리한 내용입니다. 명령어 구조 프로세서는 명령어에 따라 레지스터 값(피연산자)을 이용하여 연산을 실행한다. 연산 부호(명령부)와 피연산자들(주소부로)로 narakit.tistory.com 일반적인 명령어 사이클 1. 명령어 인출 Instruction Fetch 주기억장치의 지정된 주소에 저장된 명령어를 명령 레지스터 IR(Instruction Register)로 가져온다. 2. 명령어 해독 Instruction Decode 명령어를 해독하여 실행할 연산 opcode를 알아낸다. 3. 데이터..

[컴퓨터 구조] C++ 링커 동작 방식 확인

링커의 역할 Symbol Resolution 컴파일된 여러 모듈을 모아 각 목적 파일에서 해결되지 않은 심벌의 주소를 결정한다. 내부 목적 파일에서 참조되지 않는다면 외부 목적 파일에서 찾게 된다. 헤더 파일에서 정의된 변수는 컴파일 타임에 결정된다. - 주소가 결정되기 때문에 링커의 심벌 해결이 필요가 없다. // foo.h int a = 10; #include "foo.h" int main() { printf("%d\n", a); // foo.h의 a return 0; } 목적 파일의 외부 링크가 사용되는 경우 1. 클래스의 static 멤버 - can.obj // can.h class Can { public: static int var; }; #include "can.h" // can.cpp int..

[디자인 패턴] Modern C++ Singleton

모던 C++ 스타일 싱글턴 패턴을 템플릿으로 구현한다. 구현점 1. 멀티 스레드에 안전한, 전역적으로 딱 한번만 초기화하여 인스턴스가 유일함을 보장한다. 2. 템플리 클래스로 정의하고 GetInst()에서 구체 클래스의 생성자를 호출하므로 구체 클래스에서 싱글톤클래스를 friend로 선언해야한다. 3. unique_ptr의 삭제자 구조체를 선언하고 스마트포인터 인스턴스 생성시 이 호출가능한 구조체의 인스턴스를 넘겨준다. - 템플릿 클래스에서 virtual 소멸자로 선언했기 때문에 구체 클래스에서 삭제할 멤버가 있다면 편하게 소멸자를 정의할 수 있다. - 소멸자를 private로 선언해도 unique_ptr에서 private 소멸자를 찾을 수 없다는 에러를 없앨 수 있다. #pragma once #incl..

[컴퓨터 구조] 3. 컴퓨터 연산

덧셈과 뺄셈 일반적인 이진수의 덧셈과 뺄셈 연산이 적용된다. 오버플로우가 발생하는 경우 표현되는 정수 범위가 최대 양의 범위 혹은 최대 음의 범위가 넘었을 때 오버플로우가 발생 덧셈의 경우 A + B 부호가 같은 두 피연산자를 더했을 때, 음수가 되는 경우 (부호 비트가 바뀌는 경우) 양수와 양수를 더했는데 부호 비트가 1이 되었다. (음수) 음수와 음수를 더했는데 부호 비트가 0이 되었다. (양수) 부호가 다른 두 피연산자를 더한 경우 두 피연산자의 큰 범위보다 넘을 수 없으므로 오버플로우가 발생하지 않는다. ex) 7 + (-5) < |7| : 결과의 크기는 항상 7보다 작다. 뺄셈의 경우 A - B 양수에서 음수를 뺏을 때 혹은 음수에서 양수를 뺏을 때 오버플로우가 발생할 수 있다. 부호가 같은 피..

[자료구조] 알아야 할 자료구조 Heap

Heap 완전 이진 트리 형태의 자료 구조, 말단 노드 레벨을 제외한 내부 노드들이 꽉찬 트리이다. MinHeap, MaxHeap 부모 노드가 자식 노드보다 항상 작으면 MinHeap, 크다면 MaxHeap 우선순위 큐는 Heap으로 구현되어 있다. Heap을 배열로 구현한다면 parent의 인덱싱을 나누기 방식으로 바로 구할 수 있다. Heapify(node) 연산 node를 루트로 하는 서브 트리가 Heap을 만족할 때까지 트리를 수선하는 것. void Heapify(int root) { int leftId = GetLeft(root); int rightId = GetRight(root); if (leftId >= m_Size && rightId >= m_Size) return; T left = le..

C++/자료 구조 2021.04.16

[컴퓨터 구조] 2. 하드웨어 프로시저 지원 / 프로그램 번역과 실행

프로시저 - 제공되는 인수에 따라 특정 작업을 수행하는 서브 루틴 RISC-V는 프로시저를 호출할 때, 다음 레지스터 할당 관례를 따른다. x10-x17 : 전달할 인수와 결과값을 가지고 있는 인수 레지스터 8개 x1: 호출한 곳으로 되돌아가기 위한 복귀 주소를 가지고 있는 레지스터 1개 x0: 항상 0 으로 유지된다. - 지정된 주소로 분기 Jump and link // 다음 명령어는 지정된 주소로 분기하며 동시에 다음 명령어 주소를 목적지 레지스터 rd에 저장한다. ja1 x1, ProcedureAddress x1에 저장되는 주소는 루틴 종료 후 복귀할 주소가 담긴다. link는 프로시저 종료 후 올바른 주소로 돌아올 수 있도록 연결한다는 의미이다. - 프로시저의 복귀 jalr x0, 0(x1) x1..