GPU(Graphic Processing Unit)는 그 기원부터 현재까지 다양한 발전을 겪으며 현재의 중요한 컴퓨팅 자원으로 자리 잡았다. GPU의 발전 역사는 주로 그래픽스 처리 능력을 향상시키기 위한 시도로 시작되었으며, 이후에는 일반 컴퓨팅 작업에 대한 가속화로 영역을 확장하였다.
1. 초기 그래픽스 가속기의 등장
1980년대 후반부터 1990년대 초반까지, 컴퓨터 그래픽스는 주로 CPU에 의해 처리되었지만, 그래픽스 처리에 특화된 하드웨어의 필요성이 점점 커졌다. 처음으로 등장한 그래픽스 가속기는 2D 그래픽스 처리에만 국한되었다. 이러한 초기의 장치들은 주로 GUI 운영체제의 윈도우와 메뉴를 빠르게 그리기 위한 용도로 사용되었다.
2. 3D 그래픽스의 등장과 발전
3DFX의 Voodoo 그래픽 카드(1996)의 출시와 함께 3D 그래픽스가 본격적으로 부상하기 시작하였다. Voodoo 카드는 텍스처 매핑, 라이팅, Z-buffering 등 여러 3D 그래픽스 기술을 지원하여 당시의 많은 게임 개발자들에게 인기를 끌었다. Nvidia 또한 RIVA 128(1997)을 출시하여 3D 게임 그래픽스에 대한 지원을 강화하였다.
3. Nvidia와 AMD의 경쟁 시대
Nvidia의 GeForce 256(1999)은 최초로 GPU라는 용어를 사용했으며, 하드웨어 T&L(Transform and Lighting) 엔진을 탑재하여 3D 그래픽스의 품질과 성능을 크게 향상시켰다. AMD(당시 ATI)는 Radeon 시리즈를 출시하며 Nvidia와 경쟁을 벌였고, 이는 그래픽스 카드를 둘러싼 기술적 발전의 속도를 가속화하였다.
4. 프로그래머블 셰이더의 도입
2000년대 초반, 프로그래머블 셰이더의 도입으로 GPU의 유연성이 크게 향상되었다. Nvidia의 GeForce 3와 ATI의 Radeon 8500은 각각 Pixel Shader와 Vertex Shader를 지원하였으며, 이는 그래픽스 개발자들이 더 복잡하고 다양한 그래픽 효과를 구현할 수 있게 하였다.
5. GPGPU의 등장
2006년에 Nvidia는 CUDA(Compute Unified Device Architecture)를 발표하여 GPU를 그래픽스 처리뿐만 아니라 일반적인 병렬 컴퓨팅 작업에도 사용할 수 있는 길을 열었다. CUDA는 개발자들이 GPU의 강력한 연산 능력을 활용할 수 있도록 지원했으며, 이는 GPGPU(General-Purpose computing on Graphics Processing Units) 시대를 여는 중요한 전환점이 되었다.
6. AI와 머신러닝을 위한 GPU 발전
2010년대 중반부터 AI와 머신러닝의 빠른 발전과 함께, GPU는 중요한 컴퓨팅 자원으로 인식되었다. 높은 병렬처리 성능 덕분에 딥러닝 학습과 추론 작업에서 GPU는 큰 성능 향상을 가져왔다. Nvidia는 이를 위해 Tensor Cores를 포함한 Volta 아키텍처(2017)와 같은 AI 특화 하드웨어를 출시하였다. 이에 따라 AI 연구와 산업 응용 분야에서 GPU 사용이 폭발적으로 증가하였다.
7. 클라우드 컴퓨팅과 GPU 가속
클라우드 컴퓨팅 환경에서 컴퓨팅 자원을 유연하게 사용할 수 있는 요구가 높아지면서, AWS, Google Cloud, Azure와 같은 클라우드 서비스 제공자들도 GPU 인스턴스를 제공하기 시작하였다. 이는 기업과 연구자가 고성능 GPU를 적은 초기 비용으로 활용할 수 있는 기회를 제공하였다.
GPU 컴퓨팅의 핵심 개념
GPU 컴퓨팅의 기본 개념을 이해하는 것은 그래픽스와 일반 컴퓨팅 작업에서 GPU를 효과적으로 활용하는 데 필수적이다. 여기에는 병렬 처리, 메모리 계층 구조, 스레드와 블록 관리 등이 포함된다.
1. 병렬 처리
GPU는 수많은 코어(복수의 연산 유닛)를 통해 많은 데이터를 병렬로 처리할 수 있도록 설계되었다. 이는 CPU와 달리 많은 연산을 동시에 수행할 수 있게 하여 성능을 크게 향상시킨다. 병렬 처리는 그래픽스 렌더링 뿐만 아니라 과학적 계산, 데이터 분석 등 여러 분야에서 큰 이점을 제공한다.
2. 메모리 계층 구조
GPU의 메모리 구조는 다양한 계층으로 나뉘며, 각 계층은 접근 속도와 크기에 따라 다르다. GPU의 전역(글로벌) 메모리와 공용(공유) 메모리, 그리고 각 스레드의 로컬 메모리를 효과적으로 관리하는 것이 중요하다. 메모리 구조에 대한 이해는 데이터의 이동과 저장을 최적화하여 GPU 성능을 극대화하는 데 도움이 된다.
3. 스레드와 블록
GPU 프로그래밍에서는 작업을 스레드(Thread) 단위로 나누어 처리한다. 이러한 스레드는 다시 블록(Block)으로 그룹화되며, 각 블록은 다시 그리드(Grid)를 형성한다. 각 스레드 블록은 독립적으로 실행되며, 자신의 메모리 공간을 가지는 등의 특징을 이용해 효율적인 병렬 처리를 수행한다. 이는 CUDA 프로그래밍에서 중요한 요소로 작용한다.