CUDA

위키百科, 우리 모두의 百科事典.
( 쿠다 에서 넘어옴)

쿠다
CUDA
開發者 엔비디아
發表日 2007年 6月 23日 (16年 前) ( 2007-06-23 )
安定化 버전
12.1.0 / 2023年 3月 1日 (14個月 前) ( 2023-03-01 )
運營 體制 윈도우 XP 以上
macOS
리눅스
플랫폼 아래의 支援 GPU 參考
種類 GPGPU
라이선스 프리웨어
웹사이트 developer .nvidia .com /cuda-zone
CUDA 處理 흐름의 예
1. 메인 메모리를 GPU 메모리로 複寫
2. CPU가 GPU에 프로세스를 指示함
3. GPU가 各 코어에 竝列 遂行
4. GPU 메모리로부터의 結果物을 메인 메모리에 複寫

CUDA ("Compute Unified Device Architecture", 쿠다)는 그래픽 處理 裝置 (GPU)에서 遂行하는 (竝列 處理) 알고리즘을 C 프로그래밍 言語를 비롯한 産業 標準 言語를 使用하여 作成할 수 있도록 하는 GPGPU 技術이다. CUDA는 엔비디아 가 開發해오고 있으며 이 아키텍처를 使用하려면 엔비디아 GPU와 특별한 스트림 處理 드라이버가 必要하다. CUDA는 G8X GPU로 構成된 지포스 8 시리즈級 以上에서 動作한다. CUDA 플랫폼은 컴퓨터 커널 의 實行을 爲해 GPU의 假想 命令 集合 과 竝列 演算 要素들을 直接 接近할 수 있는 소프트웨어 階層이다. [1]

開發者는 패스스케일 오픈64 C 컴파일러로 컴파일 된 '쿠다를 위한 C' (C言語를 엔비디아가 擴張한 것)를 使用하여 GPU 上에서 實行시킬 알고리듬을 作成할 수 있다. 쿠다 救助는 一連의 計算 인터페이스를 支援하며 이에는 OpenCL , DirectX Compute가 包含된다. C 言語가 아닌 다른 프로그래밍言語에서의 開發을 위한 래퍼(Wrapper)도 있는데, 現在 파이썬 , , 포트란 , 자바 매트랩 等을 위한 것들이 있다. 이러한 接近性은 竝列 프로그래밍 專門家들이 GPU 리소스를 쉽게 利用할 수 있게 해주며, 이는 그래픽스 프로그래밍의 高級 技術을 要求하였던 Direct3D OpenGL 과 같은 以前 API 솔루션들과 對比된다. 또, CUDA는 OpenACC OpenCL 과 같은 프로그래밍 프레임워크를 支援한다. [1]

最新 드라이버는 모두 必要한 쿠다 콤포넌트를 담고 있다. 쿠다는 모든 엔비디아 GPU (G8X 시리즈 以後)를 支援하며 이 對象에는 지포스 , 쿼드로 , 테슬라 製品群이 包含된다. 엔비디아는 지포스 8 시리즈를 위해 開發된 프로그램들이 修正 없이 모든 未來의 엔비디아 비디오 카드에서 實行될 것이라고 宣言하였다.

쿠다를 통해 開發者들은 쿠다 GPU 안 竝列 計算 要素 固有의 命令語 集合果 메모리에 接近할 수 있다. 쿠다를 使用하여 最新 엔비디아 GPU를 效果的으로 開放的으로 使用할 수 있다. 그러나 CPU와는 달리 GPU는 竝列 多數 코어 構造를 가지고 있고, 各 코어는 數千 스레드를 同時에 實行시킬 수 있다. 應用 프로그램이 遂行하는 作業(計算)李 이러한 竝列處理演算에 적합할 境遇, GPU를 利用함으로써 커다란 性能 向上을 期待할 수 있다.

컴퓨터 게임 業界에서는 그래픽 랜더링에 덧붙여, 그래픽 카드의 게임 物理 計算 (破片, 延期, 불, 遺體 等 物理 效果)에 使用되며, 例로는 피직스 불렛 이 있다. 쿠다는 그래픽이 아닌 應用 프로그램, 卽, 計算 生物學, 暗號學, 그리고 다른 分野에서 10倍 또는 그 以上의 速度 惠澤을 가져왔다. 이 한 例는 BOINC 分散 計算 클라이언트이다.

쿠다는 低水準 API와 高水準 API 모두를 提供한다. 最初의 CUDA SDK는 2007年 2月 15日에 公開되었으며 마이크로소프트 윈도우 리눅스 를 支援했다. OS X 支援은 2.0 버전에 追加되었다.

利點 [ 編輯 ]

쿠다가 그래픽 API를 使用하는 傳統的인 汎用 GPU에 비해 가지는 몇가지 長點은 다음과 같다.

  • 흩뿌린 읽기 - 코드가 메모리의 任意 位置에서 데이터를 읽을 수 있다.
  • 共有 메모리 - 쿠다는 高速 共有 메모리 地域 (16 또는 48KB 크기) 을 드러내어 스레드 間에 나눌 수 있게 해 준다. 이는 使用者 管理 캐시로 使用될 수 있는데, 텍스처 룩業을 利用하는 境遇 보다 더 빠른 帶域幅이 可能해진다.
  • 디바이스 相議 읽기, 쓰기가 호스트보다 더 빠르다.
  • 정수와 비트 單位 演算을 充分히 支援한다. 精髓 텍스처 룩業이 包含된다.

制限 [ 編輯 ]

  • 再歸呼出, 函數 포인터 가 없는 C 言語의 下部 集合을 擴張하여 使用한다. 그러나 한個의 處理 裝置가 여러個의 쪼개진 메모리 空間에 對하여 作業하여야 하는 點이 다른 C 言語 實行 環境과 다른 點이다.
  • 텍스처 랜더링은 支援 되지 않는다.
  • 倍程度에 關해서는 IEEE 754 標準과 다르지 않다. 段程度에서는 非正規 값 과 信號 NaN이 支援되지 않고, IEEE 半올림 모드 가운데서는 두가지만 支援하며, 이도 命令語에 따라서 支援되는 것으로 制御 單語(Control word)에서 支援 되는 것은 아니다.(이것이 制限點인지는 論難의 對象이 될 수 있다) 그리고 나눗셈과 제곱根의 精密度가 段程度에 비해 조금 낮다.
  • CPU와 GPU 사이의 버스 帶域幅과 時間 地緣에서 甁목이 發生할 수 있다.
  • 스레드가 最小限 32個씩 모여서 實行되어야 最善의 性能 向上을 얻을 수 있으며, 스레드 數의 合이 數千個가 되어야 한다. 프로그램 코드에서의 分期는, 各各의 32 스레드가 같은 實行 經路를 따른다면, 性能에 큰 支障을 주지 않는다. SIMD 實行 모델은 어떠한 內在的으로 分岐하는 任務에게는 深刻한 制限이 된다. (例를 들어, 光線 追跡 加速 資料 構造)
  • 쿠다 基盤 GPU는 엔비디아에서만 나온다.

支援 GPU [ 編輯 ]

CUDA 水準의 支援 GPU 및 카드이다. 엔비디아 웹사이트 도 參考할 것:

演算
能力
(버전)
마이크로-
아키텍처
GPU 지포스 쿼드로 워크스테이션, 데이터센터 Tegra, Jetson
1.0 테슬라 G80 지포스 8800 울트라, 지포스 8800 GTX, 지포스 8800 GTS(G80) 쿼드로 FX 5600, 쿼드로 FX 4600, 쿼드로 Plex 2100 S4 테슬라 C870, 테슬라 D870, 테슬라 S870
1.1 G92, G94, G96, G98, G84, G86 지포스 GTS 250, 지포스 9800 GX2, 지포스 9800 GTX, 지포스 9800 GT, 지포스 8800 GTS(G92), 지포스 8800 GT, 지포스 9600 GT, 지포스 9500 GT, 지포스 9400 GT, 지포스 8600 GTS, 지포스 8600 GT, 지포스 8500 GT, 지포스 G110M, 지포스 9300M GS, 지포스 9200M GS, 지포스 9100M G, 지포스 8400M GT, 지포스 G105M 쿼드로 FX 4700 X2, 쿼드로 FX 3700, 쿼드로 FX 1800, 쿼드로 FX 1700, 쿼드로 FX 580, 쿼드로 FX 570, 쿼드로 FX 470, 쿼드로 FX 380, 쿼드로 FX 370, 쿼드로 FX 370 Low Profile, 쿼드로 NVS 450, 쿼드로 NVS 420, 쿼드로 NVS 290, 쿼드로 NVS 295, 쿼드로 Plex 2100 D4, 쿼드로 FX 3800M, 쿼드로 FX 3700M, 쿼드로 FX 3600M, 쿼드로 FX 2800M, 쿼드로 FX 2700M, 쿼드로 FX 1700M, 쿼드로 FX 1600M, 쿼드로 FX 770M, 쿼드로 FX 570M, 쿼드로 FX 370M, 쿼드로 FX 360M, 쿼드로 NVS 320M, 쿼드로 NVS 160M, 쿼드로 NVS 150M, 쿼드로 NVS 140M, 쿼드로 NVS 135M, 쿼드로 NVS 130M, 쿼드로 NVS 450, 쿼드로 NVS 420, 쿼드로 NVS 295
1.2 GT218, GT216, GT215 지포스 GT 340*, 지포스 GT 330*, 지포스 GT 320*, 지포스 315*, 지포스 310*, 지포스 GT 240, 지포스 GT 220, 지포스 210, 지포스 GTS 360M, 지포스 GTS 350M, 지포스 GT 335M, 지포스 GT 330M, 지포스 GT 325M, 지포스 GT 240M, 지포스 G210M, 지포스 310M, 지포스 305M 쿼드로 FX 380 Low Profile, 엔비디아 NVS 300, 쿼드로 FX 1800M, 쿼드로 FX 880M, 쿼드로 FX 380M, 엔비디아 NVS 300, NVS 5100M, NVS 3100M, NVS 2100M, ION
1.3 GT200, GT200b 지포스 GTX 295, GTX 285, GTX 280, 지포스 GTX 275, 지포스 GTX 260 쿼드로 FX 5800, 쿼드로 FX 4800, 쿼드로 FX 4800 for Mac, 쿼드로 FX 3800, 쿼드로 CX, 쿼드로 Plex 2200 D2 테슬라 C1060, 테슬라 S1070, 테슬라 M1060
2.0 페르미 GF100, GF110 지포스 GTX 590, 지포스 GTX 580, 지포스 GTX 570, 지포스 GTX 480, 지포스 GTX 470, 지포스 GTX 465, 지포스 GTX 480M 쿼드로 6000, 쿼드로 5000, 쿼드로 4000, 쿼드로 4000 for Mac, 쿼드로 Plex 7000, 쿼드로 5010M, 쿼드로 5000M 테슬라 C2075, 테슬라 C2050/C2070, 테슬라 M2050/M2070/M2075/M2090
2.1 GF104, GF106 GF108, GF114, GF116, GF117, GF119 지포스 GTX 560 Ti, 지포스 GTX 550 Ti, 지포스 GTX 460, 지포스 GTS 450, 지포스 GTS 450*, 지포스 GT 640 (GDDR3), 지포스 GT 630, 지포스 GT 620, 지포스 GT 610, 지포스 GT 520, 지포스 GT 440, 지포스 GT 440*, 지포스 GT 430, 지포스 GT 430*, 지포스 GT 420*, 지포스 GTX 675M, 지포스 GTX 670M, 지포스 GT 635M, 지포스 GT 630M, 지포스 GT 625M, 지포스 GT 720M, 지포스 GT 620M, 지포스 710M, 지포스 610M, 지포스 820M, 지포스 GTX 580M, 지포스 GTX 570M, 지포스 GTX 560M, 지포스 GT 555M, 지포스 GT 550M, 지포스 GT 540M, 지포스 GT 525M, 지포스 GT 520MX, 지포스 GT 520M, 지포스 GTX 485M, 지포스 GTX 470M, 지포스 GTX 460M, 지포스 GT 445M, 지포스 GT 435M, 지포스 GT 420M, 지포스 GT 415M, 지포스 710M, 지포스 410M 쿼드로 2000, 쿼드로 2000D, 쿼드로 600, 쿼드로 410, 쿼드로 4000M, 쿼드로 3000M, 쿼드로 2000M, 쿼드로 1000M, NVS 5400M, NVS 5200M, NVS 4200M, 엔비디아 NVS 315, 엔비디아 NVS 310
3.0 케플러 GK104, GK106, GK107 지포스 GTX 770, 지포스 GTX 760, 지포스 GT 740, 지포스 GTX 690, 지포스 GTX 680, 지포스 GTX 670, 지포스 GTX 660 Ti, 지포스 GTX 660, 지포스 GTX 650 Ti BOOST, 지포스 GTX 650 Ti, 지포스 GTX 650, 지포스 GTX 880M, 지포스 GTX 780M, 지포스 GTX 770M, 지포스 GTX 765M, 지포스 GTX 760M, 지포스 GTX 680MX, 지포스 GTX 680M, 지포스 GTX 675MX, 지포스 GTX 670MX, 지포스 GTX 660M, 지포스 GT 750M, 지포스 GT 650M, 지포스 GT 745M, 지포스 GT 645M, 지포스 GT 740M, 지포스 GT 730M, 지포스 GT 640M, 지포스 GT 640M LE, 지포스 GT 735M, 지포스 GT 730M 쿼드로 K5000, 쿼드로 K4200, 쿼드로 K4000, 쿼드로 K2000, 쿼드로 K2000D, 쿼드로 K600, 쿼드로 K420, 쿼드로 K500M, 쿼드로 K510M, 쿼드로 K610M, 쿼드로 K1000M, 쿼드로 K2000M, 쿼드로 K1100M, 쿼드로 K2100M, 쿼드로 K3000M, 쿼드로 K3100M, 쿼드로 K4000M, 쿼드로 K5000M, 쿼드로 K4100M, 쿼드로 K5100M, 엔비디아 NVS 510 테슬라 K10, GRID K340, GRID K520
3.2 GK20A Tegra K1, Jetson TK1
3.5 GK110, GK208 지포스 GTX 타이탄 Z, 지포스 GTX 타이탄 Black, 지포스 GTX 타이탄, 지포스 GTX 780 Ti, 지포스 GTX 780, 지포스 GT 640 (GDDR5), 지포스 GT 630 v2, 지포스 GT 730, 지포스 GT 720, 지포스 GT 710,지포스 GT 740M (64비트, DDR3) 쿼드로 K6000, 쿼드로 K5200 테슬라 K40, 테슬라 K20x, 테슬라 K20
3.7 GK210 테슬라 K80
5.0 맥스웰 GM107, GM108 지포스 GTX 750 Ti, 지포스 GTX 750, 지포스 GTX 960M, 지포스 GTX 950M, 지포스 940M, 지포스 930M, 지포스 GTX 860M, 지포스 GTX 850M, 지포스 845M, 지포스 840M, 지포스 830M 쿼드로 K2200, 쿼드로 K1200, 쿼드로 K620, 쿼드로 M2000M, 쿼드로 M1000M, 쿼드로 M600M, 쿼드로 K620M, 엔비디아 NVS 810
5.2 GM200, GM204, GM206 지포스 GTX 타이탄 X, 지포스 GTX 980 Ti, 지포스 GTX 980, 지포스 GTX 970, 지포스 GTX 960, 지포스 GTX 950, 지포스 GTX 750 SE, 지포스 GTX 980M, 지포스 GTX 970M, 지포스 GTX 965M 쿼드로 M6000 24GB, 쿼드로 M6000, 쿼드로 M5000, 쿼드로 M4000, 쿼드로 M2000, 쿼드로 M5500, 쿼드로 M5000M, 쿼드로 M4000M, 쿼드로 M3000M 테슬라 M4, 테슬라 M40, 테슬라 M6, 테슬라 M60
5.3 GM20B Tegra X1, Jetson TX1, Jetson Nano
6.0 파스칼 GP100 쿼드로 GP100 테슬라 P100
6.1 GP102, GP104, GP106,

GP107,

GP108

엔비디아 타이탄 X, 지포스 GTX 1080, 지포스 GTX 1070, 지포스 GTX 1070 Ti, 지포스 GTX 1060, 지포스 GTX 1050 Ti, 지포스 GTX 1050 쿼드로 P6000, 쿼드로 P5000, 쿼드로 P4000, 쿼드로 P2200, 쿼드로 P2000, 쿼드로 1000, 쿼드로 P620, 쿼드로 P600, 쿼드로 P400 테슬라 P40, 테슬라 P4
6.2 GP10B Jetson TX2
7.0 볼타 GV100 엔비디아 타이탄 V 쿼드로 GV100 테슬라 V100
7.2 GV10B Jetson AGX Xavier, Jetson Xavier NX
7.5 튜링 TU102, TU104, TU106, TU116, TU117 엔비디아 타이탄 RTX, 지포스 RTX 2080Ti, 지포스 RTX 2080, 지포스 RTX 2070, 지포스 RTX 2060, 지포스 GTX 1660 Ti, 지포스 GTX 1660, 지포스 GTX 1650, 지포스 GTX 1630 쿼드로 RTX 8000, 쿼드로 RTX 6000, 쿼드로 RTX 5000, 쿼드로 RTX 4000 테슬라 T4
8.0 암페어 GA100 엔비디아 A100, 엔비디아 A30
8.6 GA102,

GA104,

GA106,

GA107

지포스 RTX 3080, 지포스 RTX 3070, 지포스 RTX 3060Ti, 지포스 RTX 3060, 지포스 RTX 3050Ti, 지포스 RTX 3050 RTX A6000, RTX A5000, RTX A4000, RTX A3000, RTX A2000 엔비디아 A40, 엔비디아 A10, 엔비디아 A16
8.7 GA10B Jetson AGX Orin, Jetson Orin NX, Jetson Orin Nano
8.9 에이다

러브레이스

AD102,

AD103, AD104, AD106, AD107

지포스 RTX 4090, 지포스 RTX 4080, 지포스 RTX 4070 Ti, 지포스 RTX 4070, 지포스 RTX 4060, 지포스 RTX 4050, RTX 6000 엔비디아 L4, 엔비디아 L40
9.0 호퍼 GH100 엔비디아 H100
9.1
9.2
10.0
10.1

'*' - OEM 專用 製品

言語 結合 [ 編輯 ]

예제 [ 編輯 ]

C++ [ 編輯 ]

이 예제는 텍스처 하나를 어떤 이미지로부터 GPU像의 行列로 읽어들인다.

cudaArray
*
 cu_array
;

texture
<
float
,
 2
>
 tex
;


// 行列 割當

cudaMallocArray
(
&
cu_array
,
 cudaCreateChannelDesc
<
float
>
(),
 width
,
 height
);


// 이미지 데이터를 行列로 複寫

cudaMemcpy
(
cu_array
,
 image
,
 width
*
height
,
 cudaMemcpyHostToDevice
);


// 行列을 텍스처에 連結한다.

cudaBindTexture
(
tex
,
 cu_array
);


// 커널을 實行한다

dim3
 blockDim
(
16
,
 16
,
 1
);

dim3
 gridDim
(
width
 /
 blockDim
.
x
,
 height
 /
 blockDim
.
y
,
 1
);

kernel
<<<
 gridDim
,
 blockDim
,
 0
 >>>
(
d_odata
,
 width
,
 height
);

cudaUnbindTexture
(
tex
);


__global__
 void
 kernel
(
float
*
 odata
,
 int
 height
,
 int
 width
)

{

   unsigned
 int
 x
 =
 blockIdx
.
x
*
blockDim
.
x
 +
 threadIdx
.
x
;

   unsigned
 int
 y
 =
 blockIdx
.
y
*
blockDim
.
y
 +
 threadIdx
.
y
;

   float
 c
 =
 texfetch
(
tex
,
 x
,
 y
);

   odata
[
y
*
width
+
x
]
 =
 c
;

}

파이썬 [ 編輯 ]

파이選 言語의 바인딩은 PyCUDA 에서 求할 수 있다.

아래 예제는 두 配列의 곱을 GPU 床에서 計算한다.

import
 pycuda.driver
 as
 drv

import
 numpy

import
 pycuda.autoinit


mod
 =
 drv
.
SourceModule
(
"""

__global__ void multiply_them(float *dest, float *a, float *b)

{

  const int i = threadIdx.x;

  dest[i] = a[i] * b[i];

}

"""
)


multiply_them
 =
 mod
.
get_function
(
"multiply_them"
)


a
 =
 numpy
.
random
.
randn
(
400
)
.
astype
(
numpy
.
float32
)

b
 =
 numpy
.
random
.
randn
(
400
)
.
astype
(
numpy
.
float32
)


dest
 =
 numpy
.
zeros_like
(
a
)

multiply_them
(

        drv
.
Out
(
dest
),
 drv
.
In
(
a
),
 drv
.
In
(
b
),

        block
=
(
400
,
1
,
1
))


print
 dest
-
a
*
b

行列 곱셈을 單純化하는 追加 파이選 바인딩 을 使用한 예제이다.

import
 numpy

from
 pycublas
 import
 CUBLASMatrix

A
 =
 CUBLASMatrix
(
 numpy
.
mat
([[
1
,
2
,
3
],[
4
,
5
,
6
]],
numpy
.
float32
)
 )

B
 =
 CUBLASMatrix
(
 numpy
.
mat
([[
2
,
3
],[
4
,
5
],[
6
,
7
]],
numpy
.
float32
)
 )

C
 =
 A
*
B

print
 C
.
np_mat
()

같이 보기 [ 編輯 ]

各州 [ 編輯 ]

  1. Abi-Chahla, Fedy (2008年 6月 18日). “Nvidia's CUDA: The End of the CPU?” . Tom's Hardware . 2015年 5月 17日에 確認함 .  
  2. “MATLAB Adds GPGPU Support” . 2010年 9月 20日. 2010年 9月 27日에 原本 文書 에서 保存된 文書 . 2010年 10月 12日에 確認함 .  
  1. 제이슨 샌더스, 에드워드 캔드롯 저, 박춘언 驛, 例題로 배우는 CUDA 프로그래밍(入門者를 위한 GPGPU 프로그래밍의 基礎) , ISBN   9788994774060 .
  2. Farber, Rob 저, CUDA Application Design and Development , ISBN   9780123884268 .
  3. Hwu, Wen-Mei 저, GPU Computing GEMs - Jade Edition , ISBN   9780123859631 .

外部 링크 [ 編輯 ]