1. ISA (Instruction Set Architecture)

 

Computer라는 기계는 결과적으로 0 과 1, 즉 트랜지스터를통한 전기신호만을 읽어 들일수 있다.

그렇다면 우리가 작성하는 c언어, python 등과같은 언어도 결국 최하단 low level language인

0 or 1로 번역되어 전기신호로 입력된다는 것인데, 이렇듯 하드웨어가 인식하는 기계어들로 된 명령어들의 집합을 ISA라고 한다. 가장 중요점은 마이크로프로세서, 즉 CPU마다 기계어 코드의 길이와 숫자 코드가 다르다는 것인데,

마치 임베디드단말의 ARM 과 컴퓨터칩의 Intel CPU에 들어가는 Instruction이 다른 것처럼 프로세서마다 명령어 해석구조가 다르다. 하지만 해석에있어서 모든 원리나 디자인이 전혀 다르다고 할수는 없다.

 

 

 

위 그림은 32bit 의 instruction 을 표현하고있다. 당연히 각 비트는 0 or 1로 표현될것이다.

여기서 명령어가 32bit라고 해서 본인 컴퓨터에서 32bit 운영체제, 64bit운영체제가 명령어 비트에 따른것이라고 생각하면  오산이다. 명령어는 그자체로 32bit이고 본인의 컴퓨터에서 몇bit 운영체제를 말하는건 레지스터의 bit수를 의미한다. 뒤에 나올것이다.


2. MIPS and ARM ISA 

 

MIPS ISA는 이번 컴퓨터 구조 포스팅에서 중점적으로 다룰 ISA이다. MIPS Computer System 사에 의해 개발된 ISA

인데, 다른뜻(MIPS = Millions of Instructions Per Second) 도 존재해서 혼동하지 않기 바란다.

 

본격적으로 들어가기 전에, 마이크로 프로세서에 대해 간략히 개념정리를 해본다.

적어도 마이크로 프로세서를 나누는 기준에는 몇가지가 있을텐데, 메모리 구성에 따른 하버드 vs 폰노이만 구조의 분류, 사용되는 용도와 종류에따른 분류 그리고 명령어 구조에 따른RISC 구조와 CISC 구조의 분류등이있다.

 

 

여기서 RISC와 CISC 의 차이는 Complex Instruction Set Computer 와 Reduced Instruction Set Computer

냐의 차이이다.

말그대로 RISC는 CISC에 비해 명령어의 수를 많이 줄였고, 그만큼 단순하다. 플러스해서 명령어 길이가 가변적인 CISC에 비해 RISC는 고정적이며, 적은 주소지정 모드를 가지고있다.

이런 RISC의 대표주자가 ARM, MIPS 가 있고 CISC의 대표주자로는 Intel x86이 있다.

여담으로 CISC의 대표주자인 intel은 8086->80286->...->pentium... 계속해서 아키텍쳐를 업그레이드 시켜왔지만 그 방법이 다분히 명령어를 늘리는 Incremental ISA 형식이기때문에 상당히 입문자가 배우기에도 어렵다고 한다.

이러한 문제점때문에 최근 RISC-V 아키텍쳐등의 모듈형ISA는 상당히 매력적이다.

 

이러한 마이크로 프로세서들을 컨트롤함에 있어 어셈블리어 구조와 각각의 ISA를 익히는 것은 상당히 중요한 부분일 것이다. 앞으로는 ARM 과 MIPS 아키텍쳐를 중점으로 다룰것이지만 다른포스팅을 통해  RISC-V구조에 대해서도 알아보자.

 


3.Arithmetic Operations

 

ARM 과 MIPS 에서는 기본적인 Arithmetic 연산, 즉 산수연산은 3개의 operand로 구성된다.

 

C code : a = b+c;

MIPS assembly : add a, b, c

 

가령  c코드로 표현된 산수연산은 어셈블리어로 다음과 같이 표현된다.

일반적으로 addition과 같은 산수연산들은 operand, 즉 피연산자항이 3개로 구성되나 모든 아키텍쳐가 3개는 아니다. 인텔8085 나 x86아키텍쳐의 경우 하나 혹은 두개로 구성되기도 한다.

 

C code : f = (g + h) - (i + j);

MIPS assembly : add t0, g, h

                       add t1, i , j

                       sub f, t0, t1

 

위와 같은 c코드는 중간 결과 값들을 temporary variables 에 저장함으로써 표현할 수 있다.

여기서 t0가 의미하는것은 레지스터이다.

다시말하자면 논리회로시간쯤 한번은 들어본 CPU안에 존재하는 data access를 빠르게 가능하게하는 저장장소이다.

이렇듯 operand들은 레지스터안에 존재하기도 하며, 메모리안에 존재하기도 한다.


4. Registers

 

CPU 안에 존재하는 임시저장장소이다. 

앞으로는 이러한 Register의 역할에대한 이해가 컴퓨터 아키텍쳐를 이해하는데 핵심이다.

이러한 Register는 컴퓨터내에 몇개 없고, 데이터 접근이 가장빠르지만 레지스터가 많을수록 Read/Write 가 느려져서 clock cycle time이 증가하는 문제가 있기 때문에 수가 제한되어있다. 

 

MIPS 레지스터는 32개의 General purpose register를 가지고 있는데, 내부에는 이들을 하나의 Array로써 저장하고있고 이 register들의 집합을 Register File 이라 부른다.

예를들어 s0~s7번은 highlevel language에서의 변수에 해당, t0 ~ t9는 컴파일 과정의 임시결과 저장을 위한 register이고, 이들은 각기 고유 number를 가지고 있다.

결국 Register 수가 적으면 hardware 입장에서는 빨라지미만, program입장에서는 register의 수가 많은것의 속도가 개선되기에( 예를들면 레지스터가 적으면 arithmetic 계산에서 temp 변수가 많이 필요함 ) 적절한 balance가 필요하다.

 

MIPS 에서는 이러한 register로 부터의 operand 들만을 사용하고, 2개의 source 레지스터로부터 destination 레지스터에 저장하게 된다. MIPS에서는 각각의 Register들은 32bit로 구성되어있는데 이를 Word라고 하고, 컴퓨터가 한번에 인식하고, 처리할 수 있는 bit의 그룹으로 정의한다. 

따라서 32bit레시스터의 경우 하나의 레지스터가 처리할 수 있는 수의 범위가 2³² 까지이기 떄문에,  2³² = 약 4GB의 컴퓨터가 되는 것이다.

Arm의 경우에도 16개의 General purpose register들로 구성되고 각각의 고유의 number를 가지고 사용관례를 가지고 있다.


5. Memory Operand

앞에서 Register의 기본적인 원리와 어셈블리연산의 원리에 대해 알아보았다.

 

결국 c코드가 연산될때 변수들은 빠른 처리를 위해 메모리가 아닌 레지스터에서 연산을 거친다.

그렇다면 만약 코드상에서 처리된 배열, 예를들어 1000칸짜리 배열은 레지스터에 담을수 있을까.

이렇듯 복잡한 data structure들은 제한된 공간내에 담을 수 없으므로 레지스터단위로 연산을 한다하더라도 메모리까지 접근하여 데이터를 가져오는 memory operand 의 필요성을 알 수 있다.

이러한 Architecture 를 LOAD-STORE Architecture 라고 하고, 오직 data transfer instructions (load 및 store instructions) 만이 memory 를 access할 수 있고, 그 외의 instruction들은 registers 또는 immediate data operands 만을 사용하는 것을 load-store architecture 라고 한다.

 

메모리 접근에서는 각 memory location에 할당된 memory address 를 사용해 memory operand들을 access 할 수 있다.

 

Memory Address

다음과 같이 각각의 메모리 주소마다 데이터를 저장하고있는 구조를 생각해보면,

32bit 컴퓨터에서는 2³², 즉 4G의 메모리를 가지고있는 셈이다.

 

C code : A[12] = h + A[8];

MIPS assembly : lw $t0, 8($s3)  # Temporary register $t0 gets A[8]

                      add $t0, $s2, $t0 # Temporary register $t0 gets h + A[8]

                      sw $t0, 12($s3)  # Stores h + A[8] back into A[12]

 

위의 C코드를보면, 배열연산을 하고 있다는 것을 알 수 있다. 이때 lw, sw명령어를 이용해 메모리에 접근하여 t0에 불러오고 이를통해 연산을 수행하여 다시 store하는것을 알 수 있다.

MIPS에서는 Address = base + offset (index) 인데, 기준주소인 offset을 바탕으로 몇번째 떨어진 데이터를 가리킬지를 정하고 있다. 마치 C언어의 배열 포인터관계를 생각한다면 쉽게 이해할 수 있다.

 

 

Byte-Accesisble Memory

 

위 그림은 memory alignment 를 나타내고 있다.

최신 컴퓨터 하드웨어의 CPU는 데이터가 자연스럽게 정렬 (naturally aligned) 될 때(일반적으로 데이터 주소가 데이터 사이즈의 배수일 때) 메모리에 대한 읽기 및 쓰기를 가장 효율적으로 수행할 수 있게된다.

다시 설명하자면, 프로세서의 워드 크기가 4바이트(32비트)일 때, 메모리로부터 한 번 읽어들일 때마다 4바이트만큼 읽어들이고 기준 주소 역시 워드의 배수여야 한다는 것이다.

 

조금 구체적인 설명은 아래 페이지를 참고해도 좋을 것 같다.

 

메모리 얼라인먼트(Memory Alignment)

메모리 얼라인먼트는 레퍼런스마다 데이터 구조 얼라인먼트(Data Structure Alignment), 데이터 얼라인먼트(Data Alignment) 등으로 불리기도 하며, 위키피디아에서는 다음과 같이 개요가 작성되어 있습니

minusi.tistory.com


6. Endian

 

마지막으로 설명할 개념은 Endian 인데, Big Endian 과 Little Endian 이 있다.

여기서 Endian 은 컴퓨터 메모리상의 데이터 저장 순서 규약을 의미한다.

컴퓨터상의 메모리는, 바이트단위의 데이터 저장을 하기때문에, 바이트 이상의 데이터가 저장될때의 저장순서 byte order가 메모리주소의 낮은곳부터 저장하는지, 높은곳 부터 저장하는지에 따라 Big Endian 과 Little Endian으로 나누어지게 된다.

 

 

Endian

 

 

1 . Computer Performance 

 

컴퓨터의 성능, 즉 Performance를 측정하기위해서는 어떠한 지표가 필요할까. 크게 아래의 둘로 나뉜다.

  • Response time : 특정 작업을 수행하는데 걸리는 시간, Execution time or Latency
  • Throughput : 단위시간당 수행하는 작업의 양, Bandwidth

 

성능(performance) = 1/실행 시간(execution time)
(성능x / 성능y) = (실행시간y / 실행시간x) = n 

 

 

따라서 computer X 가 computer Y보다 performance가 높다는 것은

Performance X > Performance Y 또는 (1 / Execution time X) < (1 / Execution time Y)  

 

 

여기서 Execution time 이란 어떠한 결과를 내놓는데 걸리는 총 시간으로 다음 시간들의 합이 된다.

  • processing
  • I/O
  • OS overhead
  • idle time

 

위에서는 response time (execution time) 을 기준으로 performance 를 측정하였으나, 이러한 execution time 에는

Elapsed time, CPU execution time(CPU time) 등이 존재한다.

  • Elapsed time (wall-clock time) : 작업을 수행하는 전체 시간
  • CPU execution time (CPU time) : 작업을 수행하기 위해 CPU가 소모한 시간, I/O accesses 나 다른 program들이 소모한 시간은 포함되지 않는다. System CPU time 과 User CPU time 으로 구분된다.

 

CPU performance를 측정한다는 것은, User CPU time 에 의한performance를 측정하는것을 의미한다.

따라서 User CPU time을 중심으로 performance를 측정한다.

 


2. Computer Performance and Clock

 

  • Clock? 일정한 주기의 square wave signal. 컴퓨터는 Clock을 기준으로 동작을 수행한다.

 

Clock cycle의 개념을 CPU time 에 도입하면 위와같이 표현되는데, CPU 실행시간은 결국 프로그램당 Clock이 몇번 동작했는가에 클럭 cycle time 을 곱하면 된다.

 

 

여기서 다시  Clock Cycle이 몇번 필요한지는 명령어의 개수와 명령어당 Cycle이 몇개 필요한지 계산하면 도출해낼 수 있다. 여기서 instruction 1개당 필요한 cycle수가 CPI 이다.

종합하면 아래와 같다.

 

 

 

 

 

C++ 07.18 - 범위 기반 for 문 (range-based for statement)

범위 기반 for 문 (range-based for statement) '06.06 - for 문' 포스트에서 for 문을 사용하여 배열의 각 요소를 반복하는 예제를 봤다. #include int main() { const int numStudents = 5; int..

boycoding.tistory.com

 

'C,C++' 카테고리의 다른 글

cin, cout 속도높이기  (0) 2020.07.18
[C++] vector 사용법  (0) 2020.07.03

 

로지스틱회귀는 선형회귀와 다르게 값이 딱딱 떨어지는 데이터로 주어짐.

 

 

이러한 형태의 데이터에 가장 잘 들어맞는 함수가 시그모이드 함수인데, 시그모이드 함수를 잘 업데이트해서

이전과 마찬가지로 최적의 시그모이드 함수를 만드는것이 로지스틱 회귀.

 

'AI,ML,DL' 카테고리의 다른 글

다중 선형회귀  (0) 2020.08.03
선형회귀  (0) 2020.08.02
쥬피터 노트북 단축키  (0) 2020.08.02
알파고에 들어간 딥러닝기술은  (0) 2020.07.29
서포트 벡터 머신(SVM)  (0) 2020.07.19

 

경사하강법을 이용하면 x1, x2라는 두개의 독립변수에 대해서도 선형회귀를 적용할 수 있다.

먼저 데이터들을 3d로 나타낸 형태이다.

 

 

경사하강법의 개념, 즉 '원값을 구하고, 편미분함 값을 구해 원값을 업데이트' 개념은 변하지 않는다.

 

'AI,ML,DL' 카테고리의 다른 글

로지스틱 회귀  (0) 2020.08.04
선형회귀  (0) 2020.08.02
쥬피터 노트북 단축키  (0) 2020.08.02
알파고에 들어간 딥러닝기술은  (0) 2020.07.29
서포트 벡터 머신(SVM)  (0) 2020.07.19

1.최소제곱법

 

공식으로 구하는 최적의 기울기와 y절편인데 공식유도가 상당히 어려움..ㅠ

공식유도는 밑의 블로그 참고

 

 

최소제곱법 증명

단순선형회귀분석 중 최소제곱법에 대하여 포스팅 하려고 한다. 이해를 돕고자 적다보니 표현이 다소 불편 할 수도 있다. 전공자는 스킵하면 되겠다. 두개의 변수X와 Y의 자료가 있고 이를 통해

ducj.tistory.com

 

쥬피터 노트북으로 구현해본 최소제곱법

 

 

 

2. 경사 하강법

 

입력이 여러개인 상황에서 최소제곱법의 공식을 이용해 문제를 해결하는것은 어렵기에, 우리는 선을 그어놓고

그 선을 수정해가며 최적의 기울기를 찾는 방법을 이용한다. 

 

실제 주어진 데이터

 

각각의 a와 b를 원래값에서 편미분한값*할인율을 해 업데이트 하는 과정

 

Epochs 2001번 반복한 최적의 선

 

'AI,ML,DL' 카테고리의 다른 글

로지스틱 회귀  (0) 2020.08.04
다중 선형회귀  (0) 2020.08.03
쥬피터 노트북 단축키  (0) 2020.08.02
알파고에 들어간 딥러닝기술은  (0) 2020.07.29
서포트 벡터 머신(SVM)  (0) 2020.07.19