GPU도 일종의 CPU.
CPU 연산의 대상이 범용적이라면 GPU의 연산 대상은 그래픽에 국한되어 있다는 점이 차이점.
프로그래머 관점
레지스터 디자인의 핵심
레지스터는 몇 비트로 구성할 것인가?
레지스터를 몇 개로 구성할 것인가?
각 레지스터를 무슨 용도로 사용할 것인가?

위 4개는 범용(연산) 레지스터, 아래 4개는 전용 레지스터
레지스터와 명령어의 비트 크기가 같아야 CPU로 명령어가 fetch될 때 하나의 명령어가 하나의 레지스터에 저장될 수 있다.

피연산자로 레지스터와 숫자가 올 수 있다면, 001이 올 때 숫자를 의미하는지 2진 코드를 의미하는지 알 수 없다. 따라서 피연산자의 첫번째 비트는 이를 구분하는데 사용할 것.
명령어를 디자인하는데 허용하는 범위가 넓을 수록 손해보는 비트가 늘어난다. 이것이 명령어 범위에 제한을 두는 이유. 많은 비트를 요구할수록 명령어가 복잡해진다.
4개의 비트는 숫자를 표현하기에 부족하다.
하나의 명령어를 실행하는 과정 => Fetch - Decode - Execution
각 과정에서 한 클럭씩 소요
각 로직이 별개이기 때문에 동시에 실행되더라도 문제가 되지 않는다.
아래 연산에서 a, b, c는 모두 메모리에 있는 값이기 때문에, 먼저 a와 b를 레지스터에 불러와야 한다.


STORE

r1에 있는 데이터를 메인 메모리 0x20에 저장해라.
덧셈 연산

0x10과 0x20은 메모리 주소이기 때문에 먼저 레지스터로 LOAD하는 과정이 필요하다. 피연산자로는 레지스터 or 숫자만 올 수 있도록 설계했기 때문이다. 따라서 세번째 명령어에서 피연산자인 레지스터 r3은 LOAD 할 필요가 없다.
위 과정은 실제 CPU 내부 연산과 같다.

메모리의 주소 값을 직접 지정해서 가져오는 것.
ex) 0x10번지에 저장되어 있는 10을 가져온다.
메모리의 주소 값을 거쳐서 그 곳에 저장되어 있는 값을 가져오는 것.
ex) 0x10번지에 저장되어 있는 주소 값 0x30번지에 가서, 10을 가져온다.

