레지스터 전송 수준 (RTL)으로 구현된 8비트 레지스터에 대한 상세 설명으로, 플립플롭을 사용하여 8비트 데이터를 저장하는 방법을 보여준다.
프로세서 레지스터(영어: processor register, 순화 용어: 기록기) 또는 단순히 레지스터는 컴퓨터의 프로세서에서 빠르게 접근할 수 있는 위치이다.[1] 레지스터는 일반적으로 소량의 빠른 저장 공간으로 구성되지만, 일부 레지스터는 특정 하드웨어 기능을 가지며 읽기 전용 또는 쓰기 전용일 수 있다. 컴퓨터 구조에서 레지스터는 일반적으로 주기억장치와는 다른 메커니즘으로 주소 지정되지만, DEC PDP-10, ICT 1900 등과 같이 메모리 주소가 할당될 수도 있다.[2]
로드-스토어 아키텍처 여부에 관계없이 거의 모든 컴퓨터는 더 큰 메모리에서 데이터를 레지스터로 로드한 다음, 해당 데이터를 산술, 비트 연산 및 기타 작업에 사용하며, 기계어 명령어를 통해 조작하거나 테스트한다. 조작된 항목은 동일한 명령어 또는 후속 명령어에 의해 종종 다시 주기억장치에 저장된다. 최신 프로세서는 주기억장치로 정적 또는 동적RAM을 사용하며, 후자는 일반적으로 하나 이상의 캐시 레벨을 통해 접근된다.
프로세서 레지스터는 일반적으로 메모리 계층 구조의 최상단에 있으며, 데이터에 접근하는 가장 빠른 방법을 제공한다. 이 용어는 일반적으로 명령어 집합에 정의된 대로 명령어의 일부로 직접 인코딩된 레지스터 그룹만을 지칭한다. 그러나 최신 고성능 CPU는 레지스터 이름 변경을 통해 성능을 향상시키기 위해 이러한 "아키텍처 레지스터"의 복사본을 자주 보유하여 병렬 및 투기적 실행을 허용한다. 최신 X86 설계는 펜티엄 프로, 사이릭스 6x86, Nx586 및 AMD K5의 출시와 함께 1995년경에 이러한 기술을 도입했다.
컴퓨터 프로그램이 동일한 데이터에 반복적으로 접근하는 것을 참조 국부성이라고 한다. 자주 사용되는 값을 레지스터에 보관하는 것은 프로그램 성능에 매우 중요하다. 레지스터 할당은 컴파일러의 코드 생성 단계에서 수행되거나 어셈블리어 프로그래머에 의해 수동으로 수행된다.
크기
레지스터는 일반적으로 저장할 수 있는 비트 수로 측정된다. 예를 들어, 8비트 레지스터, 32비트 레지스터, 64비트 레지스터, 128비트 레지스터 등이 있다. 일부 명령어 집합에서는 레지스터가 다양한 모드에서 작동하여 저장 메모리를 더 작은 부분(예: 32비트를 4개의 8비트로)으로 분할하여 여러 데이터(벡터 또는 1차원 배열 데이터)를 동시에 로드하고 처리할 수 있다. 일반적으로 이는 메모리를 더 큰 레지스터에 매핑하는 추가 레지스터를 추가하여 구현된다. 여러 데이터에 대해 단일 명령어를 실행할 수 있는 프로세서를 벡터 프로세서라고 한다.
유형
프로세서에는 종종 여러 종류의 레지스터가 포함되어 있으며, 저장할 수 있는 값의 유형 또는 작동하는 명령어에 따라 분류할 수 있다.
사용자 접근 가능 레지스터는 기계어 명령어로 읽거나 쓸 수 있다. 사용자 접근 가능 레지스터의 가장 일반적인 구분은 데이터 레지스터와 주소 레지스터로 구분하는 것이다.
일부 프로세서에는 주소만 저장하거나 숫자 값만 저장하는 데 사용될 수 있는 레지스터(일부 경우에는 특정 주소에서 오프셋으로 값이 추가되는 인덱스 레지스터로 사용)가 포함되어 있다. 다른 프로세서는 레지스터가 두 종류의 양을 모두 저장할 수 있도록 허용한다. 피연산자의 유효 주소를 지정하는 데 사용되는 다양한 주소 지정 방식이 존재한다.
벡터 레지스터는 SIMD 명령어(단일 명령어, 다중 데이터)에 의해 수행되는 벡터 처리를 위한 데이터를 저장한다.
상태 레지스터는 특정 명령어가 실행되어야 하는지 또는 실행되지 않아야 하는지를 결정하는 데 자주 사용되는 진릿값을 저장한다.
특수 목적 레지스터 (SPRs)는 프로그램 상태의 일부 요소를 저장한다. 여기에는 일반적으로 명령 포인터라고도 불리는 프로그램 카운터와 상태 레지스터가 포함된다. 프로그램 카운터와 상태 레지스터는 프로그램 상태 워드 (PSW) 레지스터로 결합될 수 있다. 앞서 언급된 스택 포인터도 때때로 이 그룹에 포함된다. 마이크로컨트롤러와 같은 임베디드 마이크로프로세서는 특수 하드웨어 요소에 해당하는 특수 기능 레지스터를 가질 수도 있다.
일부 아키텍처(예: SPARC 및 MIPS)에서는 정수 레지스터 파일의 첫 번째 또는 마지막 레지스터가 읽을 때 항상 0을 반환하도록 하드와이어되어 있는 의사 레지스터이다(주로 인덱싱 모드를 단순화하기 위함). 이 레지스터는 덮어쓸 수 없다. 알파에서도 부동소수점 레지스터 파일에 대해 동일한 방식으로 구현된다. 이로 인해 레지스터 파일은 실제로 사용 가능한 레지스터 수보다 하나 더 많은 레지스터를 가진 것으로 흔히 인용된다. 예를 들어, 31개의 레지스터만 위에서 정의한 레지스터 정의에 부합하더라도 32개의 레지스터가 있다고 인용된다.
예시
다음 표는 여러 주류 CPU 아키텍처의 레지스터 수를 보여준다. X86 호환 프로세서에서 스택 포인터(ESP)는 내용에 대해 사용할 수 있는 명령어 수가 제한적임에도 불구하고 정수 레지스터로 계산된다는 점에 유의해야 한다. 유사한 주의 사항은 대부분의 아키텍처에도 적용된다.
아래 나열된 아키텍처는 모두 다르지만, 거의 모두 헝가리계 미국인 수학자존 폰 노이만이 처음 제안한 폰 노이만 구조로 알려진 기본 배열로 구성되어 있다. GPU의 레지스터 수가 CPU보다 훨씬 많다는 점도 주목할 만하다.
아키텍처
GPRs/데이터+주소 레지스터
FP 레지스터
비고
AT&T 호빗
000
7개의 스택
모든 데이터 조작 명령은 레지스터 내에서만 작동하며, 데이터는 처리 전에 레지스터로 이동되어야 한다.
A 레지스터는 모든 산술이 수행되는 누산기이다. B·C, D·E, H·L 레지스터 쌍은 일부 명령에서 주소 레지스터로 사용할 수 있지만, ALU 명령은 H·L만 메모리 피연산자의 포인터로 사용할 수 있다. 모든 레지스터는 로드/저장/이동/증가/감소 명령의 피연산자로, 산술 명령의 소스 피연산자로 사용할 수 있다. 8080용 부동소수점 프로세서는 인텔 8231, AMD Am9511, 인텔 8232였다. 이들은 Z80 및 유사 프로세서와도 쉽게 사용할 수 있었다.
인텔 8086/인텔 8088, 인텔 80186/인텔 80188, 인텔 80286 프로세서는 부동소수점 연산을 위한 인텔 8087, 인텔 80187 또는 인텔 80287 코프로세서가 제공될 경우, 스택 상단에 상대적인 레지스터를 피연산자로 사용할 수 있는 일부 명령어를 지원하는 80비트 너비, 8깊이 레지스터 스택을 지원한다. 코프로세서가 없는 경우 부동소수점 레지스터는 지원되지 않는다.
인텔 80386 프로세서는 부동소수점 연산을 위해 인텔 80387을 필요로 했으며, 이후 프로세서에는 부동소수점이 내장되었다. 이들 모두는 스택 상단에 상대적인 레지스터를 피연산자로 사용할 수 있는 일부 명령어를 지원하는 80비트 너비, 8깊이 레지스터 스택을 가지고 있었다. 펜티엄 III 이후에는 추가적인 128비트 XMM 레지스터가 있는 스트리밍 SIMD 확장이 있었다.
명령어는 처음 16개의 스크래치패드 레지스터를 직접 참조할 수 있으며, ISAR을 통해 모든 스크래치패드 레지스터에 간접적으로 접근할 수 있다.[13]
지오드 GX
데이터 1개, 주소 1개
008
Geode GX/미디어 GX/4x86/5x86은 사이릭스/내셔널 세미컨덕터가 만든 486/펜티엄 호환 프로세서의 에뮬레이션이다. 트랜스메타와 마찬가지로 프로세서에는 x86 코드를 네이티브 코드로 변환하여 실행하는 변환 계층이 있었다. 128비트 SSE 레지스터는 지원하지 않고, 8개의 80비트 부동소수점 레지스터로 구성된 80387 스택만 지원하며, AMD의 3D나우!를 부분적으로 지원한다. 네이티브 프로세서는 모든 목적을 위해 데이터 레지스터 1개와 주소 레지스터 1개만 포함하며, 정수 연산을 위해 스크래치패드 SRAM 내에서 32비트 명명 레지스터 r1(기본), r2(데이터), r3(백 포인터), r4(스택 포인터)의 4개 경로로 번역된다.
선플러스 μ'nSP
8개 (sp, r1-r4, bp, sr, pc)
000
대만 회사 선플러스 테크놀로지의 16비트 프로세서로, 특히 VTech의 V.Smile 교육용 비디오 게임 콘솔 라인과 2000년대 중반부터 많은 플러그인 TV 게임 및 비브랜드 콘솔에 사용되었다.
VM 랩스가 개발하고 멀티미디어에 특화된 32비트 스택 머신 프로세서이다. 이 회사의 누온 DVD 플레이어 콘솔 라인과 ZaPit 게임즈의 게임 웨이브 패밀리 엔터테인먼트 시스템에서 찾아볼 수 있다. 이 디자인은 인텔의 MMX 기술에 크게 영향을 받았으며, 벡터 및 스칼라 명령 모두를 위한 128바이트 통합 스택 캐시를 포함했다. 통합 캐시는 뱅크 이름 변경을 통해 8개의 128비트 벡터 레지스터 또는 32개의 32비트 SIMD 스칼라 레지스터로 나눌 수 있으며, 이 아키텍처에는 정수 레지스터가 없다.
이모션 엔진의 메인 코어(VU0)는 일반적인 백그라운드 작업을 위한 크게 수정된 DSP 일반 코어이며, 64비트 누산기 1개, 일반 데이터 레지스터 2개, 32비트 프로그램 카운터 1개를 포함한다. 수정된 MIPS III 실행 코어(VU1)는 게임 데이터 및 프로토콜 제어를 위한 것이며, 정수 연산을 위한 32개의 32비트 범용 레지스터와 SIMD 명령어, 스트리밍 데이터 값 및 일부 정수 계산 값을 저장하기 위한 32개의 128비트 SIMD 레지스터, 그리고 일반 부동소수점 계산을 코프로세서의 벡터 레지스터 파일에 연결하기 위한 누산기 레지스터 1개를 포함한다. 코프로세서는 32개의 128비트 벡터 레지스터 파일(CPU의 누산기에서 전달되는 벡터 값만 저장할 수 있음)로 구성되며 정수 레지스터는 내장되어 있지 않다. 벡터 코프로세서(VPU 0/1)와 이모션 엔진의 전체 메인 프로세서 모듈(VU0 + VU1 + VPU0 + VPU1)은 모두 수정된 MIPS 명령어 세트를 기반으로 구축되었다. 이 경우 누산기는 범용이 아니라 제어 상태이다.
이전 세대는 스레드당 최대 127/63개의 레지스터를 허용했다(테슬라/페르미). 스레드당 더 많은 레지스터가 구성될수록 동시에 실행될 수 있는 스레드 수는 줄어든다. 레지스터는 32비트 너비이므로 배정밀도 부동소수점 숫자와 64비트 포인터는 두 개의 레지스터가 필요하다. 또한 스레드당 최대 8개의 프레디케이트 레지스터가 있다.[19]
8개의 'A' 레지스터(A0–A7)는 18비트 주소를 보유하고, 8개의 'B' 레지스터(B0–B7)는 18비트 정수 값을 보유하며(B0는 영구적으로 0으로 설정됨), 8개의 'X' 레지스터(X0–X7)는 60비트의 정수 또는 부동소수점 데이터를 보유한다. 8개의 18비트 A 레지스터 중 7개는 해당 X 레지스터와 연결되어 있었다. A1–A5 레지스터 중 하나를 값으로 설정하면 해당 주소의 내용이 해당 X 레지스터로 메모리 로드되었다. 마찬가지로 A6 또는 A7 레지스터에 주소를 설정하면 X6 또는 X7에서 해당 메모리 위치로 메모리 저장되었다. (A0 및 X0 레지스터는 이렇게 연결되지 않았다).
FP는 System/360에서 선택 사항이었고, S/370 및 이후 버전에서는 항상 존재했다. 벡터 기능이 있는 프로세서에는 머신에 따라 32비트 요소 수가 다른 16개의 벡터 레지스터가 있다.[24] 일부 레지스터는 호출 규약에 따라 고정된 용도로 할당된다. 예를 들어, 레지스터 14는 서브루틴 반환 주소에 사용되며, ELF ABI의 경우 레지스터 15는 스택 포인터로 사용된다. S/390 G5 프로세서는 부동소수점 레지스터 수를 16개로 늘렸다.[25]
단순한 논리 회로를 내부에 가진 8코어 8/16비트 슬라이스드 스택 머신 컨트롤러로, 각각 3개의 8/16비트 특수 제어 레지스터와 32비트 x 512 스택 RAM을 포함하는 8개의 코그 카운터(코어)를 가지고 있다. 그러나 정수용 범용 레지스터는 포함하지 않는다. 최신 프로세서 및 멀티 코어 시스템의 대부분의 섀도우 레지스터 파일과 달리, 코그의 모든 스택 RAM은 명령어 수준에서 접근할 수 있어, 필요한 경우 이 모든 코그가 단일 범용 코어처럼 작동할 수 있다. 부동소수점 장치는 외부에 있으며, 2개의 80비트 벡터 레지스터를 포함한다.
모든 레지스터는 일반적으로 사용될 수 있다(정수, 부동소수점, 스택 포인터, 점프, 인덱싱 등). 모든 36비트 메모리(또는 레지스터) 워드는 하프 워드로도 조작될 수 있으며, 이는 (18비트) 주소로 간주될 수 있다. 특정 명령어에 의해 다른 워드 해석이 사용된다. 원래 PDP-10 프로세서에서는 이 16개의 GPR도 주(즉, 코어) 메모리 위치 0–15에 해당했다. "빠른 메모리"라는 하드웨어 옵션은 레지스터를 별도의 IC로 구현했으며, 메모리 위치 0–15에 대한 참조는 IC 레지스터를 참조했다. 이후 모델에서는 레지스터를 "빠른 메모리"로 구현하고 메모리 위치 0–15를 계속 참조하도록 했다. 이동 명령어는 (레지스터, 메모리) 피연산자를 취한다: MOVE 1,2는 레지스터-레지스터이고, MOVE 1,1000은 메모리-레지스터이다.
65c816은 6502의 16비트 후속작이다. X, Y, D(직접 페이지 레지스터)는 조건 레지스터이며 SP 레지스터는 특정 인덱스 전용이다. 메인 누산기는 16비트(C)로 확장되었으며[35] 호환성을 위해 8비트(A)를 유지하며, 메인 레지스터는 이제 최대 24비트(16비트 너비 데이터 명령어/24비트 메모리 주소)를 주소 지정할 수 있다.
미디어 임베디드 프로세서는 도시바가 개발한 32비트 프로세서로, 수정된 8080 명령어 세트를 사용했다. A, B, C, D 레지스터만 모든 모드(8/16/32비트)에서 사용할 수 있다. x86과는 호환되지 않지만, x87과 호환되는 80비트 부동소수점 장치를 포함한다.
r15는 프로그램 카운터이며 범용 레지스터로 사용할 수 없다. r13은 스택 포인터이다. r8–r13은 프로세서 모드 전환 시 다른 레지스터(뱅크드)로 교체될 수 있다. 이전 버전은 26비트 주소 지정 방식을 사용했으며,[36] 프로그램 카운터(r15)의 상위 비트를 상태 플래그에 사용하여 해당 레지스터를 32비트로 만들었다.
↑Jia, Zhe; Maggioni, Marco; Staiger, Benjamin; Scarpazza, Daniele P. (2018). “Dissecting the NVIDIA Volta GPU Architecture via Microbenchmarking”. arXiv:1804.06826 [cs.DC].더 이상 지원되지 않는 변수를 사용함 (도움말)