필자는 ALU가 무엇인지도 중요하지만,
왜 배워야 하는 것인지도 중요하다고 생각한다.
ALU는 CPU에도, GPU에도 있다. 일반적으로 ALU는 코어의 구성 요소 중 하나이다.
ALU는 GPU를 더욱 효율적으로 사용하기 위해 단순 그래픽 처리 뿐만이 아니라,
병렬처리로 그래픽 처리 + 수학 연산도 가능하다 이러한 것이 가능한 GPU를 GPGPU라고 부른다.
이러한 GPGPU 똑똑한 GPU가 나오면서,
C/C++ 언어로 병렬계산에 필요한 기능들을 제공해주는 소프트웨어가 만들어졌다.
이러한 것이 CUDA라는 API이다.
이전에도 DX 혹은 OpenGL이라는 병렬형 그래픽 처리 연산 소프트웨어가 있었지만,
이들은 그래픽 처리에 대한 고급 기술이 필요한 반면,
CUDA는 이전 API와 달리 병렬 프로그래밍 전문가가 GPU 리소스를 더 쉽게 이용할 수있도록 하였다.
CUDA 기반 GPU는 OpenMP, OpenACC 및 OpenCL 과 같은 프로그래밍 프레임워크를 지원한다.
CUDA는 병렬형 프로그래밍의 꽃이라고도 불린다.
위 그림의 출저와 같이 CUDA는 NVIDIA에서 만들어졌다.
ALU를 알고, 단순히 빠르게 접근할 수 있는 메모리가 레지스터에 있다.
정도의 운영체제 지식으로는 DX12나 Vulkan에 익숙해지기 어렵다.
심지어 D3D12나 Vulkan에서는 하드웨어와 직간접적인 소통이 이루워지므로,
멀티스레딩 시에 어떤 레지스터에 접근해야하는가? 까지도 지정해줘야한다.
때문에 ALU의 구조를 추상화하여 구조를 익히고,
어떤 레지스터와 소통하는지에 대한 대략적인 감각을 익히면
CUDA를 이해하는 것과 D3D12 혹은 Vulkan을 이해하는 기반 지식에 도움이 될 것이다.
일단 간단하게 레지스터에 왜 접근하게 되는지를 설명하도록 하겠다.
명령어
명령어는 연산 코드와 오퍼랜드로 구성되어 있다.
명령어가 수행할 연산을 (필자는 동사를 제외한 목적어들이라고 이해했다.) 오퍼랜드,
연산 코드는 연산자 (필자는 동사라고 이해했다.) 오퍼랜드는 피연산자라고 종종 부른다.
가령 이러한 명령어의 크기가 16비트가 최대라고 하면, 오퍼랜드가 3개 혹은 4개가 될 수 있다.
그럴 때는 오퍼랜드 하나에 즉시 메모리를 잡게된다면
데이터의 크기는 하나의 메모리를 담기에 부담스러울 수 있다.
이럴 때는 주소를 넣어주어도 된다.
오퍼랜드 필드에 메모리 주소 혹은 레지스터 주소를 넣어주면,
이 경우 표현할 수있는 정보의 가지수는 해당 주소지가 저장할 수 있는 공간만큼 커지게된다.
이제부터, 오퍼랜드에서 메모리를 담을 수 있는 다양한 방법을 알아보도록 하자.
즉시 주소 지정 방식
즉시 주소 지정 방식(immediate addressing mode)은 연산에 사용할 데이터를
오퍼랜드 필드에 직접 명시하는 방식이다.
가장 간단한 형태의 주소 지정 방식이며,
연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문에
아래 설명할 어떤 주소 지정 방식들보다 빠르다.
직접 주소 지정 방식
직접 주소 지정 방식(direct addressing mode)은
오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식이다.
오퍼랜드 필드에서 표현할 수 있는 데이터의 크기는 즉시 주소 지정 방식보다 더 커졌지만,
여전히 유효 주소를 표현할 수 있는 범위가 연산 코드의 비트 수만큼 줄어들었다.
다시 말해 표현할 수 있는 오퍼랜드 필드의 길이가 연산 코드의 길이만큼 짧아져서
유효 주소에 제한이 생길 수 있다.
간접 주소 지정 방식
간접 주소 지정 방식(indirect addressing mode)은 유효 주소의 주소를 오퍼랜드 필드에 명시한다.
직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 더 넓어졌지만,
두 번의 메모리 접근이 필요하기 때문에 앞서 설명한 주소 지정 방식들보다 일반적으로 더 느린 방식이다.
레지스터 주소 지정 방식
레지스터 주소 지정 방식(register addressing mode)은 직접 주소 지정 방식과 비슷하게
연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법이다.
일반적으로 CPU 외부에 있는 메모리에 접근하는 것보다
CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르다.
그러므로 레지스터 주소 지정 방식은 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있다.
다만, 레지스터 주소 지정 방식은 직접 주소 지정 방식과 비슷한 문제를 공유한다.
표현할 수 있는 레지스터 크기에 제한이 생길 수 있다는 점이다.
레지스터 간접 주소 지정 방식
레지스터 간접 주소 지정 방식과 비슷하게
연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시하는 방법이다.
일반적으로 CPU 외부에 있는 메모리에 접근하는 것보다
CPU 내부에 있는 레지스터에 접근하는 것이 더욱 빠르다.
그로므로 레지스터 주소 지정 방식은 직접 주소 지정 방식보다 빠르게 데이터에 접근할 수 있다.
ALU
ALU는 계산을 담당하는 부품이다.
ALU가 계산하기 위해서는 피연산자와 수행할 연산이 필요하다.
ALU는 레지스터를 통해 피연산자를 받아들이고,
제어장치로부터 수행할 연산을 알려주는 제어 신호를 받아들인다.
ALU는 레지스터와 제어장치로부터 받아들인 피연산자와 제어 신호로
산술 연산, 논리 연산 등 다양한 연산을 수행한다.
사실상 ALU자체가 계산을 위한 회로이기 때문에, 더욱더 다양한 회로가 있지만
이해를 위해 위와같이 추상화하여 생략하였다.
ALU가 내보내는 정보
연산을 수행한 결과는 특정 숫자나 문제가 될 수 있고, 메모리 주소가 될 수도 있다.
그리고 이 결괏값은 바로 메모리에 저장되지 않고 일시적으로 레지스터에 저장된다.
CPU가 메모리에 접근하는 속도는 레지스터에 접근하는 속도보다 훨씬 느리다.
ALU가 연산할 때 마다 결과를 메모리에 저장한다면 당연하게도 CPU는 메모리에 자주 접근하게 되고,
이는 CPU가 프로그램 실행 속도를 늦출 수 있다.
그래서 ALU의 결괏값을 메모리가 아닌 레지스터에 우선 저장하는 것이다.
ALU가 내보내는 정보는 계산 결과와 더불어 플래그를 내보낸다.
플래그의 사용 예로는, 이진수만 보고 음수인지 양수를 구분하기 위해 플래그를 사용하기도 한다.
이처럼 ALU는 결괏값뿐만 아니라 연산 결과에 대한 추가적인 정보를 내보내야 할 때가 있다.
방금 계산한 결과가 음수라는 추가 정보 혹은
연산 결과가 연산 결과를 담을 레지스터보다 클 때
방금 계산한 결괏값이 너무 크다라는 추가 정보를 내보낸다.
이러한 연산 결과에 대한 추가적인 상태 정보를 플래그라고 한다.
ALU가 내보내는 대표적인 플래그는 아래와 같다.
플래그 종류 | 의미 | 사용 예시 |
부호 플래그 |
연산한 결과의 부호를 나타낸다. |
부호 플래그가 1일 경우 계산 결과는 음수, 0일 경우 계산 결과는 양수를 의미힌다. |
제로 플래그 |
연산 결과가 0인지 여부를 나타낸다. |
제로 플래그가 1일 경우 연산 결과는 0, 0 일 경우 연산 결과는 0이 아님을 의미한다. |
캐리 플래그 |
연산 결과올림수나 빌림수가 발생했는지를 나태낸다. |
캐리 플래그가 1일 경우 올림수나 빌림수가 발생했음을 의미하고, 0일 경우 발생하지 않았음을 의미한다. |
오버플로우 플래그 |
인터럽트가 가능한지를 나타낸다. | 오버플로우 플래그가 1일 경우 오버 플로우가 발생했음을 의미하고, 0일 경우 발생하지 않았음을 의미한다. |
인터럽트 플래그 |
인터럽트가 가능한지를 나타낸다. | 인터럽트 플래그가 1일 경우 인터럽트가 가능함을 의미하고, 0일 경우 인터럽트가 불가능함을 의미한다. |
슈퍼바이저 플래그 |
커널 모드로 실행 중인지, 사용자 모드로 실행 중인지를 나타낸다. |
수퍼바이저 플래그가 1일 경우 커널 모드로 실행 중임을 의미하고, 0일 경우 사용자 모드로 실행 중임을 의미한다. |
이러한 플래그들은 플래그 레지스터에 저장된다.
해당 게시글은 혼자 공부하는 컴퓨터 운영체제를 바탕으로 제작되었습니다.
'컴퓨터 프로그래밍 공부 > 컴퓨터 구조 + 운영체제' 카테고리의 다른 글
코어와 멀티코어, 스레드와 멀티스레드 (0) | 2024.04.09 |
---|---|
프로그래밍 개발 과정 (0) | 2024.04.08 |
컴퓨터 구조 (0) | 2024.04.08 |
레지스터 (1) | 2024.01.01 |
Introduction to Computer Systems - 컴퓨터 시스템 개요 (1) | 2023.10.17 |