CUDA: Difference between revisions

From IT Wiki
No edit summary
No edit summary
 
Line 13: Line 13:
* '''확장성''': 다양한 애플리케이션에서 확장 가능, 특히 AI, 머신러닝에서 큰 성능 향상
* '''확장성''': 다양한 애플리케이션에서 확장 가능, 특히 AI, 머신러닝에서 큰 성능 향상
* '''GPU 가속''': CPU에서 수행하던 작업 중 병렬화가 가능한 부분을 GPU로 이동시켜 처리 속도를 향상시킴
* '''GPU 가속''': CPU에서 수행하던 작업 중 병렬화가 가능한 부분을 GPU로 이동시켜 처리 속도를 향상시킴
== 버전 ==
2006년 11월에 G80 마이크로아키텍처와 함께 발표되었고, 2007년 6월 23일에 CUDA SDK가 배포되었다. 초기에는 [[C언어|C]], [[C++]]만 지원했지만 10여 년이 지난 지금은 [[포트란]]이나 [[C#]]등 다양한 언어에서 쓸 수 있다. 그러나 기본적인 구조는 전용 CUDA 컴파일러가 cuda 코드 파일로 컴파일하고, 이를 C++나 C# 같은 기존 언어 컴파일러에 투입하는 방식. 버전 정보는 이곳에서 확인할 수 있다.
새로운 마이크로아키텍처 혹은 새로운 GPU가 나올 때마다 CUDA Compute Capability가 올라갔기 때문에 오래된 GPU는 CUDA Compute Capability가 낮아서 일부 CUDA 기반 응용프로그램과 호환이 안될 수 있으나, 과거에 개발된 CUDA 기반 응용프로그램은 최신 GPU에서도 잘 작동한다. 또한, CUDA가 대두되면서 2007년에 [[GPGPU]] 전용인 TESLA 제품군이 나왔는데, TESLA 제품군은 ECC 메모리를 탑재하여 메모리 오류를 정정하며, GeForce에서 쓰이는 같은 아키텍처 칩셋이라도 추가 명령어 몇 개를 더 지원한다. 다만 차세대 아키텍처 GeForce에선 이전 세대의 CUDA 명령어를 전부 흡수하여 지원하므로 최신 GeForce 제품을 써도 이전 세대의 Tesla 전용 명령어를 쓸 수 있다.
GPU에 따른 CUDA Compute Capability는 이 링크를 참고하면 되며, 아래에 아키텍처 또는 GPU별로 정리하였다. CUDA [[SDK]] 버전과는 다르므로 구분할 때 주의할 것.
* G80 : 1.0
* G84, G86, G92, G94, G96, G98 : 1.1
* GT215, GT216, GT218 : 1.2
* GT200 : 1.3
* Fermi : 2.0~2.1
* Kepler 1.0 : 3.0~3.7
* Kepler 2.0 : 3.5~3.7
* Maxwell 1.0 : 5.0~5.3
* Maxwell 2.0 : 5.2~5.3
* Pascal : 6.0~6.2
* Volta : 7.0
* Turing : 7.5
* Ampere: 8.6
* Hopper : 9.0
* Ada Lovelace: 8.9
* Blackwell: 10.0
== 유사 기술 ==
CUDA와 비슷한 GPGPU 기술로 OpenCL과 DirectCompute가 있지만, 이들은 표준을 기준으로 만들어졌기 때문에 로우 레벨 API의 하드웨어에 있는 고급 기능까지 사용하여 한계까지 성능을 끌어내기는 어렵다. 즉, 다른 기술은 D3D API 등을 경유해야 하므로 시간이 걸리지만, CUDA는 바로 하드웨어를 제어할 수 있다.
하지만 이는 CUDA의 단점으로도 이어지는데, 그래픽 기능과의 연동을 전제로 만들어진 DirectCompute에 비해 그래픽 출력 용도로 사용할 때 오버헤드가 커진다.
그래픽 카드의 GPU는 대량의 데이터에 한 가지 연산을 적용하는 경우가 많기 때문에 단순화된 연산 유닛(코어)을 천여 개씩 탑재하고 있다. 따라서 SIMD(Single Instruction Multiple Data) 형태의 병렬화가 가능한 연산에 GPU를 활용해 속도를 올리려는 시도는 예전부터 있어왔다. 그러나 원래 그래픽을 처리하라고 설계된 그래픽스 파이프라인을 가지고 일반적인 병렬 연산을 수행하는 것은 매우 골치 아픈 일이었다. 프로그래머가 일일이 GPU의 세부 사항을 신경 써야 했기 때문이다.
CUDA 프로그램은 스트림 프로세싱에 기반하며, C/C++ 언어에 동시에 실행할 쓰레드 개수를 선언하는 CUDA 전용 문법을 추가하여 작성된다. CUDA 코드는 대략 GPU 안에서만 돌아가는 함수(커널이라고 부른다)를 호스트(CPU)에서 호출하는 형태로 되어 있다.
CUDA는 GPU의 메모리 모델을 추상화하여 좀 더 편리하게 GPU를 사용할 수 있도록 했다. 그러나 여전히 CUDA로 최대 성능을 얻으려면 GPU 메모리 구조에 대한 이해가 필요하다. Windows에 한정하여 CUDA 프로그래밍의 귀찮음을 덜어주기 위해 만들어진 BSGP(Bulk-Synchronous GPU Programming)라는 것도 존재한다. BSGP는 CUDA의 기계어 명령 번역을 사용한 별도의 언어로, 레이 트레이싱 같은 coherence가 낮은 작업에서는 CUDA보다 성능이 좋다. 다만 BSGP가 만능은 아니다. 메모리 참조 연속성이 강한 작업에서는 CUDA보다 성능이 떨어진다.
최근에는 CUDA를 보완한 OpenACC가 등장하였다. OpenACC는 더 많은 추상화를 제공하여 코딩하기 편리하다고 알려져 있다. 마이크로소프트는 C++ AMP라는 것을 만들었으며, OpenACC의 DirectCompute 버전 정도로 볼 수 있다. 그러나 여전히 일반 프로그래머가 사전 지식 없이 쉽게 접근하기는 어려운 수준이다. 다만 예전보다 진입 장벽이 많이 낮아졌다고 할 수 있다.
R337 드라이버 이후부터는 GeForce 제품군에서 CUDA 기반 비디오 인코딩/디코딩 라이브러리가 삭제되었다. 이는 NVENC를 밀기 위해서인데, 이전의 CUDA 인코더를 대체하는 것이다. Tesla나 Quadro 제품군은 정상적으로 사용이 가능하다. 이로 인해 CUDA 가속을 사용하는 코덱의 사용이 불가능해지거나, 이전 라이브러리 파일을 따로 넣지 않으면 미디어 편집 프로그램들에서의 호환성에 문제가 생겼다.
딥러닝을 지원하는 여러 라이브러리도 CUDA와 함께 제공된다. cuDNN, Convolution 연산을 더 빠르게 만들어주는 cuFFT, 선형대수 모듈인 cuBLAS 등 대부분의 필요한 라이브러리가 구현되어 있다. 그러나 여전히 사용은 어렵다. TensorFlow나 PyTorch와 같은 프레임워크가 이러한 라이브러리들을 사용한다.
CUDA와 호환되는 레이어로는 AMD의 ROCm이나 ZLUDA, 인텔의 oneAPI가 있다. 그러나 이에 위기감을 느꼈는지 CUDA 11.5 이상의 최신 버전부터 번역 레이어(리버스 엔지니어링)를 금지하는 조항이 라이선스에 규정되어 있다.


== CUDA가 독보적인 이유 ==
== CUDA가 독보적인 이유 ==

Latest revision as of 09:58, 25 September 2024

Compute Unified Device Architecture

CUDANVIDIA가 개발한 병렬 컴퓨팅 플랫폼이자 프로그래밍 모델로, GPU(Graphics Processing Unit)를 활용해 일반적인 연산을 가속화하는 기술이다. 주로 고성능 연산이 필요한 AI, 머신러닝, 딥러닝, 과학 시뮬레이션, 그래픽 처리 분야에서 사용된다.

CUDA를 사용하면 GPU의 다중 코어를 이용해 대규모 병렬 연산을 수행할 수 있다. 기존 CPU 기반의 연산은 병렬 처리에 한계가 있지만, GPU는 수천 개의 코어를 사용해 동시에 많은 데이터를 처리할 수 있기 때문에 대규모 연산에서 큰 성능 향상을 기대할 수 있다.

CUDA는 C, C++, Python 등의 언어로 개발할 수 있으며, 이를 통해 개발자는 GPU를 프로그래밍하여 다양한 계산 작업을 효율적으로 처리할 수 있다.

기술적 특징[edit | edit source]

  • 병렬 처리: GPU의 많은 코어를 사용해 대규모 연산을 병렬로 처리함
  • 고성능: CPU보다 훨씬 많은 데이터를 빠르게 처리할 수 있음
  • 확장성: 다양한 애플리케이션에서 확장 가능, 특히 AI, 머신러닝에서 큰 성능 향상
  • GPU 가속: CPU에서 수행하던 작업 중 병렬화가 가능한 부분을 GPU로 이동시켜 처리 속도를 향상시킴

버전[edit | edit source]

2006년 11월에 G80 마이크로아키텍처와 함께 발표되었고, 2007년 6월 23일에 CUDA SDK가 배포되었다. 초기에는 C, C++만 지원했지만 10여 년이 지난 지금은 포트란이나 C#등 다양한 언어에서 쓸 수 있다. 그러나 기본적인 구조는 전용 CUDA 컴파일러가 cuda 코드 파일로 컴파일하고, 이를 C++나 C# 같은 기존 언어 컴파일러에 투입하는 방식. 버전 정보는 이곳에서 확인할 수 있다.

새로운 마이크로아키텍처 혹은 새로운 GPU가 나올 때마다 CUDA Compute Capability가 올라갔기 때문에 오래된 GPU는 CUDA Compute Capability가 낮아서 일부 CUDA 기반 응용프로그램과 호환이 안될 수 있으나, 과거에 개발된 CUDA 기반 응용프로그램은 최신 GPU에서도 잘 작동한다. 또한, CUDA가 대두되면서 2007년에 GPGPU 전용인 TESLA 제품군이 나왔는데, TESLA 제품군은 ECC 메모리를 탑재하여 메모리 오류를 정정하며, GeForce에서 쓰이는 같은 아키텍처 칩셋이라도 추가 명령어 몇 개를 더 지원한다. 다만 차세대 아키텍처 GeForce에선 이전 세대의 CUDA 명령어를 전부 흡수하여 지원하므로 최신 GeForce 제품을 써도 이전 세대의 Tesla 전용 명령어를 쓸 수 있다.

GPU에 따른 CUDA Compute Capability는 이 링크를 참고하면 되며, 아래에 아키텍처 또는 GPU별로 정리하였다. CUDA SDK 버전과는 다르므로 구분할 때 주의할 것.

  • G80 : 1.0
  • G84, G86, G92, G94, G96, G98 : 1.1
  • GT215, GT216, GT218 : 1.2
  • GT200 : 1.3
  • Fermi : 2.0~2.1
  • Kepler 1.0 : 3.0~3.7
  • Kepler 2.0 : 3.5~3.7
  • Maxwell 1.0 : 5.0~5.3
  • Maxwell 2.0 : 5.2~5.3
  • Pascal : 6.0~6.2
  • Volta : 7.0
  • Turing : 7.5
  • Ampere: 8.6
  • Hopper : 9.0
  • Ada Lovelace: 8.9
  • Blackwell: 10.0

유사 기술[edit | edit source]

CUDA와 비슷한 GPGPU 기술로 OpenCL과 DirectCompute가 있지만, 이들은 표준을 기준으로 만들어졌기 때문에 로우 레벨 API의 하드웨어에 있는 고급 기능까지 사용하여 한계까지 성능을 끌어내기는 어렵다. 즉, 다른 기술은 D3D API 등을 경유해야 하므로 시간이 걸리지만, CUDA는 바로 하드웨어를 제어할 수 있다.

하지만 이는 CUDA의 단점으로도 이어지는데, 그래픽 기능과의 연동을 전제로 만들어진 DirectCompute에 비해 그래픽 출력 용도로 사용할 때 오버헤드가 커진다.

그래픽 카드의 GPU는 대량의 데이터에 한 가지 연산을 적용하는 경우가 많기 때문에 단순화된 연산 유닛(코어)을 천여 개씩 탑재하고 있다. 따라서 SIMD(Single Instruction Multiple Data) 형태의 병렬화가 가능한 연산에 GPU를 활용해 속도를 올리려는 시도는 예전부터 있어왔다. 그러나 원래 그래픽을 처리하라고 설계된 그래픽스 파이프라인을 가지고 일반적인 병렬 연산을 수행하는 것은 매우 골치 아픈 일이었다. 프로그래머가 일일이 GPU의 세부 사항을 신경 써야 했기 때문이다.

CUDA 프로그램은 스트림 프로세싱에 기반하며, C/C++ 언어에 동시에 실행할 쓰레드 개수를 선언하는 CUDA 전용 문법을 추가하여 작성된다. CUDA 코드는 대략 GPU 안에서만 돌아가는 함수(커널이라고 부른다)를 호스트(CPU)에서 호출하는 형태로 되어 있다.

CUDA는 GPU의 메모리 모델을 추상화하여 좀 더 편리하게 GPU를 사용할 수 있도록 했다. 그러나 여전히 CUDA로 최대 성능을 얻으려면 GPU 메모리 구조에 대한 이해가 필요하다. Windows에 한정하여 CUDA 프로그래밍의 귀찮음을 덜어주기 위해 만들어진 BSGP(Bulk-Synchronous GPU Programming)라는 것도 존재한다. BSGP는 CUDA의 기계어 명령 번역을 사용한 별도의 언어로, 레이 트레이싱 같은 coherence가 낮은 작업에서는 CUDA보다 성능이 좋다. 다만 BSGP가 만능은 아니다. 메모리 참조 연속성이 강한 작업에서는 CUDA보다 성능이 떨어진다.

최근에는 CUDA를 보완한 OpenACC가 등장하였다. OpenACC는 더 많은 추상화를 제공하여 코딩하기 편리하다고 알려져 있다. 마이크로소프트는 C++ AMP라는 것을 만들었으며, OpenACC의 DirectCompute 버전 정도로 볼 수 있다. 그러나 여전히 일반 프로그래머가 사전 지식 없이 쉽게 접근하기는 어려운 수준이다. 다만 예전보다 진입 장벽이 많이 낮아졌다고 할 수 있다.

R337 드라이버 이후부터는 GeForce 제품군에서 CUDA 기반 비디오 인코딩/디코딩 라이브러리가 삭제되었다. 이는 NVENC를 밀기 위해서인데, 이전의 CUDA 인코더를 대체하는 것이다. Tesla나 Quadro 제품군은 정상적으로 사용이 가능하다. 이로 인해 CUDA 가속을 사용하는 코덱의 사용이 불가능해지거나, 이전 라이브러리 파일을 따로 넣지 않으면 미디어 편집 프로그램들에서의 호환성에 문제가 생겼다.

딥러닝을 지원하는 여러 라이브러리도 CUDA와 함께 제공된다. cuDNN, Convolution 연산을 더 빠르게 만들어주는 cuFFT, 선형대수 모듈인 cuBLAS 등 대부분의 필요한 라이브러리가 구현되어 있다. 그러나 여전히 사용은 어렵다. TensorFlow나 PyTorch와 같은 프레임워크가 이러한 라이브러리들을 사용한다.

CUDA와 호환되는 레이어로는 AMD의 ROCm이나 ZLUDA, 인텔의 oneAPI가 있다. 그러나 이에 위기감을 느꼈는지 CUDA 11.5 이상의 최신 버전부터 번역 레이어(리버스 엔지니어링)를 금지하는 조항이 라이선스에 규정되어 있다.

CUDA가 독보적인 이유[edit | edit source]

출시 시기와 시장 선점[edit | edit source]

CUDA는 2007년에 출시되어 병렬 컴퓨팅 분야에서 가장 먼저 대중화된 플랫폼 중 하나다. CUDA의 초기 출시는 GPU 병렬 처리를 쉽게 사용할 수 있게 해, 많은 개발자들이 NVIDIA의 GPU를 병렬 연산에 활용할 수 있는 기반을 제공했다. OpenCL은 2009년에, HIP은 2015년에, Vulkan Compute는 2016년에 등장했으며, 이들은 모두 CUDA보다 후발주자에 해당한다.

CUDA가 초기 시장을 선점하면서 고성능 컴퓨팅(HPC), AI, 머신러닝, 과학적 시뮬레이션과 같은 분야에서 NVIDIA GPU와 CUDA 조합이 사실상 표준처럼 자리잡았다.

시장 지배력[edit | edit source]

CUDA는 NVIDIA의 전략적인 하드웨어 및 소프트웨어 통합 덕분에 시장에서 막강한 지배력을 갖추고 있다. CUDA는 전 세계 수많은 연구기관과 기업들이 AI 연구데이터 과학 분야에서 사용하는 대표적인 플랫폼으로 자리 잡았으며, 대부분의 딥러닝 프레임워크(예: TensorFlow, PyTorch)가 CUDA를 기본으로 지원한다.

특히 AI와 머신러닝 분야에서 NVIDIA의 GPU 시장 점유율이 매우 높으며, 이 때문에 CUDA도 자연스럽게 사실상의 표준이 되었다. CUDA 생태계는 단순히 병렬 연산 지원을 넘어서, cuDNN, TensorRT와 같은 딥러닝 가속 라이브러리와 NVIDIA GPU Cloud(NGC)를 통한 고성능 컴퓨팅 환경까지 포함한다. 이와 같은 생태계 덕분에 CUDA는 다른 플랫폼들에 비해 더 빠르고 효율적인 개발 및 배포를 지원할 수 있다.

하드웨어와 소프트웨어의 밀접한 통합[edit | edit source]

CUDA는 NVIDIA 하드웨어특화된 플랫폼이다. 이는 단점으로 작용할 수 있지만, CUDA가 NVIDIA GPU의 성능을 최대한 활용할 수 있다는 장점이 더 크게 평가받는다. 다른 플랫폼들은 다양한 하드웨어를 지원하기 때문에 범용성을 제공하지만, 이로 인해 최적화 성능에서는 CUDA에 뒤처진다. NVIDIA는 지속적으로 GPU 하드웨어와 CUDA 소프트웨어의 성능을 동시 개선해왔기 때문에, 최신 GPU 아키텍처에서는 항상 CUDA가 최적화된 성능을 제공한다.

개발자 커뮤니티 및 생태계의 성장[edit | edit source]

CUDA는 오랜 시간 동안 개발자 커뮤니티와 풍부한 생태계를 구축했다. CUDA에 대한 학습 자원문서, 오픈소스 프로젝트, 포럼 등이 매우 풍부하며, 많은 개발자들이 CUDA 기반 프로젝트에 참여하고 있다. CUDA의 성장과 함께 GPU 병렬 컴퓨팅에 대한 지식과 기술이 대중화되어, 전 세계적으로 수많은 개발자와 연구자들이 CUDA에 의존하고 있다.

반면, OpenCL, HIP, Vulkan Compute와 같은 다른 플랫폼들은 상대적으로 생태계가 작고, 다양한 하드웨어를 지원해야 하므로 특정 하드웨어에 대한 최적화가 부족한 경우가 많다. CUDA는 그 특유의 일관된 개발 환경 덕분에 학습 및 구현이 더 수월하며, NVIDIA의 강력한 지원 덕분에 개발자들이 쉽게 접근할 수 있는 장점이 있다.

AI 및 머신러닝 분야에서의 독보적 위치[edit | edit source]

특히 딥러닝AI 분야에서는 CUDA의 시장 지배력이 더욱 두드러진다. 대부분의 딥러닝 프레임워크가 CUDA를 지원하며, NVIDIA의 GPU는 딥러닝 학습 및 추론에 있어서 사실상의 표준 하드웨어가 되었다. CUDA는 cuDNN과 같은 딥러닝 가속 라이브러리를 제공하며, 이는 머신러닝 모델의 학습 및 추론 속도를 크게 향상시키는 데 기여한다.

AI/딥러닝 분야에서의 NVIDIA GPU와 CUDA의 결합은 현재 다른 플랫폼들이 따라오기 어려운 수준에 도달해 있다. 많은 연구자와 기업이 NVIDIA GPU를 중심으로 AI 인프라를 구축하고 있기 때문에, CUDA는 이 분야에서 사실상 독점적인 위치에 있다.

산업 지원과 연속성[edit | edit source]

CUDA는 산업계와 학계에서 광범위한 지원을 받는다. 많은 하드웨어와 소프트웨어 기업들이 CUDA 생태계를 기반으로 GPU 가속 기능을 통합하며, 이는 산업 표준화된 툴과 API를 제공해 개발자들이 GPU 가속 기능을 쉽게 활용할 수 있도록 한다. 또한 20년 가까이 지속적인 업데이트와 발전을 거듭해 왔으며, NVIDIA는 이를 기반으로 하는 강력한 개발자 지원 체계를 구축해 다른 경쟁 플랫폼들이 따라오기 힘든 지위를 유지하고 있다.